標籤:style 裝飾器 說明 功能 驗證 需要 變化 lis highlight
菜鳥咀嚼python基礎之繼續。
一、返回函數
第三章已經簡單操作了Python的高階函數,目前繼續練手函數作為傳回值的特效;通常,高階函數除了可以接收函數作為參數外,還可以把函數作為結果值返回。
案例:通常我們寫一個求和的函數會這樣寫
#通常我們寫一個求和的函數會這樣寫def get_sum(*param): count = 0; for item in param: count = count + item return countprint( get_sum(1,2,3,4) )
輸出: 10
#但是,如果不去求和,而是在後面的代碼根據需要在計算可以嗎,可以的。它可以不用返回求和結果,而是返回求和函數。def last_sum(*param): def sum(): num = 0 for n in param: num = num + n return num return sumfun = last_sum(1,2,3,4)print( fun )print( fun() )
輸出結果:
<function last_sum.<locals>.sum at 0x7f4a2d3b58c8>10
說明:由此可見單純的輸出返回的函數是沒有結果的,只有調用返回的函數,才能將求和列印出來
另外,如果多次調用 last_sum 函數,每次返回的都是一個新的函數,即使傳入相同的參數;
例如:
fun1 = last_sum(1,2,3,4)fun2 = last_sum(1,2,3,4)print( fun1 == fun2 )
返回:False
說明:fun1() 和 fun2() 的調用互不影響
閉包
def count(): fs = [] for i in range(1,4): def f(): return i * i fs.append( f ) return fsf1, f2, f3 = count()print( f1() )print( f2() )print( f3() )
輸出:9,9,9
說明:這是因為當一個函數返回了一個函數後,i 這個內部局部變數還被新的函數引用,等到三個函數都返回時,函數 i 已經比變成3了,所以執行的 函數輸出 9, 9, 9
注意:返回函數不要引用任何迴圈變數,或者後續會發生變化的變數
可以這樣寫:
def count2(): def f(i): def g(): return i * i return g fs = [] for i in range(1,4): fs.append( f(i) ) return fsf11, f22, f33 = count2()print( f11() )print( f22() )print( f33() )
返回結果:1,4,9
說明:方法是再建立一個函數,用該函數的參數綁定迴圈變數當前的值,無論該迴圈變數後續如何更改,已綁定到函數參數的值不變
也就是說當我們必須要調用迴圈變數的時候,需要多加一個局部函數,在每次執行 迴圈變數 i 的時候 去調用那個新的函數並將 i 作為它的一個參數 達到立刻被執行,則 i 無論後期怎麼變都不會受到影響。
二、匿名函數
匿名函數就是沒有名字的函數,有些時候為了簡潔方便可以不去定義函數,而是直接使用匿名函數,案例:
#匿名函數mylist = list( map(lambda y:y*y, [1,2,3,4]) )print( mylist )
輸出:[1, 4, 9, 16]
說明:匿名函數 lambda y:y*y 其實就是匿名函數,用 lambda 去表示一個匿名函數,第一個 y 代表匿名函數的參數,冒號後面是匿名體,可以表示函數處理的功能。
匿名函數就是一個運算式,不用寫returen 傳回值就是運算式結果,同時,匿名函數還可以是一個變數,例如:
#匿名函數-變數mytest = lambda y:y*ymylist = list( map( mytest , [1,2,3,4]) )print( mylist )
輸出:[1, 4, 9, 16] 效果同上;
三、裝飾器
其實函數就是一個對象。而且函數對象可以被賦值給變數,所以,通過變數也就相當於調用了那個函數。
例如:
def myFun(a): return a*atest = myFunprint( test(5) )
輸出:25
其實函數有一個__name__的屬性,可以驗證出他真正的函數是誰。例如:
print( test.__name__ )
輸出:myFun
Python基礎學習(四)