1. 程式人生 > >Python3 基礎:返回函式和匿名函式

Python3 基礎:返回函式和匿名函式

返回函式

返回函式顧名思義:就是返回值是函式.
內部函式可以引用外部函式的引數和區域性變數.

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,返回值就是該表示式的結果。