iT邦幫忙

2022 iThome 鐵人賽

DAY 4
0

函式、裝飾器

函式

簡介

  • 函式:將程式碼包裝再一個區塊中,方便隨時呼叫使用。提升城市的可讀性,方便日後檢查
  • 使用方式
    • 要先定義(建立)才能呼叫(使用)函式

定義函式

基本語法

def 函式名稱(參數名稱):
    函式內部的程式碼
    
def 函式名稱(參數名稱1, 參數名稱2):
    函式內部的程式碼
    

範例:

#定義可以顯示Hello的函式
def sayHello():
    print("Hello")
    
#定義可以印出任何訊息的函式
def say(msg):
    print(msg)
    
#定義一個可以做加法的函式, 可以一次使用多個變數
def add(n1, n2):
    result=n1+n2
    print(result)

呼叫函式

語法

函式名稱(參數資料)

範例

#定義一個印出 Hello 的函式
def sayHello():
    print("Hello")

#定義一個可以顯示任何訊息的函式
def say(msg):
    print(msg)

#呼叫上方定義的函式
sayHello()

#讓say函式的msg變數成為 Hello 字串或 123 變數
say("Hello")
say(123)

回傳值

語法

def 函式名稱(參數名稱):
    函式內部程式碼
    return #強制結束函式,回傳 None

def 函式名稱(參數名稱):
    函式內部程式碼
    return 資料#強制結束函式,回傳[資料(數字、字串、浮點數、字典、...)]

範例

#函式定義
def say(msg):
    print(msg)
    # return msg #這就可以回傳 msg 的值
    return 

value=say("Hello Function")
print(value) #因為沒有回傳值,所以會回傳 None



裝飾器基本篇

裝飾器本身是一個經過特殊設計的「函式」,用來「輔助」其他的函示

裝飾器的定義使用:

def 裝飾器名稱(回呼函示名稱):
    def 內部函式名稱():
        #裝飾器內部的程式碼
        回呼函式名稱()
    return 內部函式名稱

#--以上為裝飾器的宣告方式
#下面為裝飾器的使用方式

#---------------------------
@裝飾器名稱
def 函式名稱():
    #函式內部的程式碼
    
 #-----如此一來這函式就「帶有」裝飾器

函式名稱()#呼叫帶有裝飾器的函示 

#如此一來此函式與普通還是的功能就稍有不同

實際操作

#定義

def testDecorator(callback):
    def innerFunc():
        print("這是裝飾器")
        callback()
    return innerFunc

#賦予普通函式(名:decoratedFunc)擁有裝飾器(名:testDecorator)函式的功能
#簡單來說是「使用」裝飾器

@testDecorator    #不用空格
def decoratedFunc():
    print("普通函式")

#我們看看最後的結果
#我們呼叫此函數時,會先去執行裝飾器的內容,再執行普通函式的內容
decoratedFunc()

大致講解:
呼叫有裝飾器函式後,會先執行裝飾器內部的程式,再執行函式本身

那我們如何例用函式的參數來工作呢?
我們先看範例:

#定義

def testDecorator(callback):
    def innerFunc():
        print("這是裝飾器")
        callback(3)
    return innerFunc

#簡單來說是「使用」裝飾器

@testDecorator    #不用空格
def decoratedFunc(data):
    print("普通函式",data)

decoratedFunc()

#如此一來我們更能確定,裝飾器的執行步驟
'''
1.呼叫 decoratedFunc (15行)
2.執行 testDecorator 且將 decoratedFunc 設為 callback
3.執行print("這是裝飾器")
4.執行callback(3)
5.呼叫到 decoratedFunc 並把data設為 3 (12行)
6.執行print("普通函式",data)
'''

裝飾器實際操作篇

無數值傳遞之裝飾器用法

範例程式:

#定義裝飾器
def myDec(callback):
    def code():
        print("裝飾器")
        callback()
    return code

#使用裝飾器
#@myDec
def test():
    print("普通函式")
    
test()

若使用沒有裝飾器的情況下,我們呼叫 test() 就真的只會執行
test函數

那麼我們如果增加@myDec結果會為如何呢?

真的是先跑裝飾器ㄟ~~~ !!

有數值傳遞的用法

範例程式 :

#定義裝飾器
def myDec(callback):
    def code():
        print("裝飾器")
        callback(3)
    return code

#使用裝飾器
@myDec
def test(data):
    print("普通函式數值 : ",data)
    
test()

我們看看結果:

跟你想的有沒有一樣阿?有的話就接著繼續喔~~

自我練習

定義一個裝飾器,可以從 1 加到 100(先自己練習一下,不行才能看code喔)

#定義裝飾器
from re import I


def Dec(callback):
    def code():
        num = 0
        for i in range(1,101,1): #為什麼是101?因為for是1算到(n-1)
            num+=i
        callback(num)
    return code

#使用裝飾器
@Dec
def count(data):
    print("1加到100的值為 : ",data)

def count2(data):
    print("1加到100的值為 : ",data)
    
count()

Dec(counter)()


正確無誤!


裝飾器工廠定義與用法

Decorator Factory 用來「生產」裝飾器的「函式」

定義:

#定義裝飾器工廠
def 裝飾器工廠名稱(參數名稱, ...):
       def 裝飾器名稱(回呼函式名稱):
           def 內部函式名稱():
               #裝飾器內部程式碼
               回呼函式名稱()
           return 內部函式名稱
       return 裝飾器名稱

   
#使用裝飾器工廠
@裝飾器工廠名稱(參數資料, ...)
def 函式名稱():
   #函式內部的程式碼

   
#呼叫帶有裝飾器的函式
函式名稱() 

'''
1. 運行函式
2. 執行裝飾器工廠
3. 再執行回呼函式的內容
'''

ㄟㄟㄟ,你有沒有感覺像把之前說的裝飾器再加上一層函式而已

範例程式1

#定義
def testFactory(base):
   def testDecorator(callback):
       def innerFunc():
           print("裝飾器",base)
           callback()
       return innerFunc
   return testDecorate

#--------------------------------------------
#使用
@teatFactory(3) 
def decoratedFunc():
   print("普通函式")
   
#--------------------------------------------    
#呼叫    
decoratedFunc()

範例程式2

裝飾器工廠讓裝飾器變得更有彈性

#定義
def testFactory(base):
   def testDecorator(callback):
       def innerFunc():
           result=base*3
           callback(result)
       return innerFunc
   return testDecorator 

#使用
@testFactory(3)
def decoratedFunc(result):
   print("普通函式",result)
   
#呼叫
decoratedFunc()

實際操作

練習1

#定義
def DecFactory(DecBase):
   def myDecorator(callback):
       def func():
           result = DecBase
           print("Hello i am Dec")
           print("My DecBase is ",DecBase)
           callback(DecBase)
       return func
   return myDecorator

#使用
@DecFactory(3)
def mydecoratedfunc(result):
   print("I am normal func")
   print("my DecBase :",result)

#呼叫

mydecoratedfunc()

先推推看DecBase = ? , result = ?


DecBase = 3 , result = 3

小測驗

利用Decorator Factory 寫一個 1+...+100 的Code
(可以先自己練習看看喔) ~答案再下面的詳細資料喔~

#定義
def DecFectory(base):
   def myDec(callback):
       def myDecFuc():
           result=0
           for i in range (base):
               result+=i            
           callback(result)
       return myDecFuc
   return myDec
#使用
@DecFectory(101)
def myfunc(result):
   print("my Dec count's ans: ",result)
   
#呼叫
myfunc()

參考影片連結與資料來源

Python 裝飾器 Decorator - 基本篇 By 彭彭

Python 裝飾器工廠 Decorator Factory By 彭彭

彭彭的課程教學

彭彭的yt頻道


上一篇
Day 03 python 超級入門(1)
下一篇
Day 05 python 超級入門(2)
系列文
資工琪琪的後端學習筆記(python&flask)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言