[英]function declaration and assignment to a variable
我想問一個關於函數如何分配給變量的問題。
我是Python的初學者,學習函數。
考慮以下來自w3schools的代碼塊:
def myfunc(n):
return lambda a : a * n
mydoubler = myfunc(2)
print(mydoubler(11))
我知道lambda
是一個匿名的 function,只有一個表達式被計算並返回。
這顯示在myfunc(n)
中:
return lambda a: a * n
myfunc
接受一個參數,在本例中為 2,因此任何數字a
都會加倍。
但是,我在這里很困惑。
在這一行中:
mydoubler = myfunc(2)
我以為我們將myfunc
的結果分配給mydoubler
但在 print 語句中:
print(mydoubler(11))
我們正在傳遞一個參數11
,但我們從未在 function 聲明中的任何地方指定參數a
。
python 代碼如何知道打印語句中的11
在這種情況下與a
相關聯?
lambda創建的lambda a: a * n
是一個閉包。 當 function 被稱為mydoubler(11)
時,它使用11
作為a
的值,並使用2
(計算lambda a: a * n
時myfunc
內的n
的值)作為n
的值。
mydoubler
行為就好像它被定義為
def mydoubler(a):
return a * 2
您可以通過一些挖掘看到值2
存儲在 function 中:
>>> mydoubler.__closure__[0].cell_contents
2
(事實上,您可以更改它,但只有在您想讓代碼變得無可救葯地復雜時才會這樣做:
>>> mydoubler.__closure__[0].cell_contents = 3
>>> mydoubler(2)
6
)
在這種情況下,您實際上將 doubler-function 分配給了mydoubler
:
mydoubler = myfunc(2)
在那里您還指定了參數a
,namly 2。因此,當您將數字傳遞給mydoubler()
function、Python 時,知道您已經指定了n
myfunc(2)
的返回值相當於這個 lambda
lambda a: a * 2
lambda 接受 1 個參數,並將其加倍。 當您調用它時,在本例中是通過將其分配給名稱mydoubler
,您傳遞給它的任何參數都是a
,這是 lambda 接受的一個參數。
等效代碼:
mydoubler = lambda a: a * 2
output = mydoubler(11) # returns 11 * 2
print(output) # prints 22
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.