python高階5 外層函式 內層函式和閉包

2021-07-27 08:51:37 字數 919 閱讀 1577

在函式內部定義的函式和外部定義的函式是一樣的,只是他們無法被外部訪問,例如:

def f():

print 'f()'

def g():

print 'g()'

return g #將g定義在函式f內部,防止其他**呼叫g

但是如果內部函式引用了外部函式的引數,就沒法把內部函式再移到外部函式的外部,例如:

def calc_sum(lst):

def sec_sum():

return sum(lst)

return sec_sum #此時sec_sum函式不能移到calc_sum的外部

像這種內層函式引用了外層函式的變數(引數也算變數),然後返回內層函式的情況,稱為閉包。

閉包的特點是返回的函式還引用了外層函式的區域性變數,所以,要正確使用閉包,就要確保引用的區域性變數在函

數返回後不能變。舉例如下:

#希望一次返回3個函式,分別計算1*1,2*2,3*3:

def count():

fs =

for i in range(1,4):

def f():

return i*i

return fs

f1, f2, f3 = count()

>>> f1() #呼叫的結果

9>>> f2()

9>>> f3()

9

這是為什麼?原因就是當count()函式返回了3個函式時,這3個函式所引用的變數 i 的值已經變成了3。由於f1、

f2、f3並沒有被呼叫,所以,此時他們並未計算 i*i,當 f1 被呼叫時,i 的值已經變成了3。因此,返回函式不要

引用任何迴圈變數,或者後續會發生變化的變數。

5 高階函式

map 接受2個引數,乙個函式 乙個iterable,返回iterator def f x return x x r map f,1,2,3,4 5 print list r 強轉 由於iterator是惰性序列 list map str,1,2,3,4,5,6,7,8,9 轉字串多引數對映 當多個...

python 函式高階 python 函式高階

形參角度 萬能引數 動態接收位置引數 args 動態接收關鍵字引數 kwargs 的魔性用法 函式定義時 代表聚合。他將所有的位置引數 聚合成乙個元組,賦值給了args 函式定義時 將所有的關鍵字引數聚合成乙個字典中,將這個字典賦給了 kwargs 和 在函式的呼叫時 代表打散 僅限關鍵字引數 de...

Python高階 函式高階

閉包 closure 常規函式中可以在函式的引數中新增引數的預設值來簡化函式的操作,偏函式也可以做到這一點,而且會更加的方便管理函式的操作。通過內建模組functools的partial進行定義和處理 語法結構 新函式名稱 functools.partial 函式名稱,預設賦值引數 例如 全域性函式...