Python3 基礎:返回函式和匿名函式
阿新 • • 發佈:2019-01-09
返回函式
返回函式顧名思義:就是返回值是函式.
內部函式可以引用外部函式的引數和區域性變數.
def lazy_sum(*args):
def sum():
all = 0
for x in args:
all = all + x
return all
return sum
print(lazy_sum(1,3,5,7))
print(lazy_sum(1,3,5,7)())
# 輸出結果
<function lazy_sum.<locals>.sum at 0x7f2f4d1b26a8>
16
上面的函式:第一個輸出結果是一個函式引用.第二個輸出才是最終我們想要的結果.這就說明:返回函式返回的是指向sum函式的變數,當呼叫sum()的時候內部函式才真正的執行了.
還有一點需要注意的是:每次呼叫lazy_sum函式都會返回一個新的函式,即使傳入的引數相同.
閉包
大家看這段程式碼:
def count():
fs = []
for i in range(1, 4):
print(i)
def f():
return i*i
fs.append(f)
return fs
f1, f2, f3 = count()
你執行一下你會發現,輸出的結果是1,2,3 內部函式在呼叫的時候才執行.那麼當你呼叫f1(),f2(),f3()時輸出的結果全部都是9.你肯定知道為啥了.因為呼叫了count(),i已經為3了,而內部的f()此時還沒有執行,當它執行時i = 3,所以輸出的都是9.
那麼,應該怎麼修改呢?看程式碼:
def count():
fs = []
def f(j):
def g():
return j*j
return g
for i in range(1, 4):
print(i)
fs.append(f(i))
return fs
f1, f2, f3 = count()
返回閉包時牢記的一點就是:返回函式不要引用任何迴圈變數,或者後續會發生變化的變數。
匿名函式
當我們在傳入函式時,有些時候,不需要顯式地定義函式,直接傳入匿名函式更方便。
舉個例子:
>>> list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6])) [1, 4, 9, 16, 25, 36]
關鍵字lambda
表示匿名函式,冒號前面的x表示函式引數。
匿名函式有個限制,就是隻能有一個表示式,不用寫return,返回值就是該表示式的結果。