[英]Using lambda and defaultdict
我正在閱讀有關集合defaultdict的內容,並遇到了以下代碼行:
import collections
tree = lambda: collections.defaultdict(tree)
some_dict = tree()
some_dict['colours']['favourite'] = "yellow"
我知道lamba接受一個變量並對它執行一些功能。 我已經看到lambda像這樣使用:lambda x:x + 3在上面的第二行代碼中,lambda采用什么變量以及它執行的功能是什么?
我也明白defaultdict可以采用int或list等參數。 在第二行中,defaultdict采用參數樹作為變量。 那有什么意義?
在上面的第二行代碼中,lambda采用了什么變量以及它執行的功能是什么?
lambda函數是一個匿名 (無名稱)函數。 所以lambda表達式如下:
tree = lambda: collections.defaultdict(tree)
是的,除了一些細節(其__name__
屬性包含函數的名稱,而不是'<lambda>'
),它相當於:
def tree():
return collectsions.defaultdict(tree)
因此,簡單的表達式的差異在於我們在這里對函數中的計算進行編碼。 我們永遠不能打電話,打電話一次,或多次打電話。
它還允許我們打結 。 請注意,我們在結果中傳遞對函數(lambda表達式)的引用。 因此,我們有一個函數,它以函數本身的形式構造一個defaultdict
。 因此,我們可以遞歸地構造子樹。
我也明白
defaultdict
可以采用int
或list
等參數。 在第二行中,defaultdict
采用參數樹作為變量。 那有什么意義?
因此,我們傳遞給defaultdict
的tree
是對我們構造的lambda表達式的引用。 因此,這意味着如果defaultdict
調用“ factory ”。 我們再次以tree
為工廠獲得另一個defaultdict
。
如果我們這樣調用some_dict['foo']['bar']['qux']
。 因此,我們在defaultdict
中的defaultdict
中有一個defaultdict
。 所有這些defaultdict
都具有tree
函數的工廠。 如果我們以后構造額外的子tree
,那么這些將再次成為使用tree
作為構造函數的defaultdict
。
list
或int
case並不特別。 如果調用list
(如list()
),則構造一個新的空列表。 int
:如果調用int()
,則獲得0
。 這是對類對象的引用這一事實是無關緊要的: defaultdict
不考慮這一點(它不知道工廠是什么,它只調用沒有參數)。
代碼大致相當(忽略def
語句引入的元數據)
import collections
def tree():
return collections.defaultdict(tree)
some_dict = tree()
some_dict['colours']['favourite'] = "yellow"
lambda
表達式只是定義零參數的函數,函數綁定到名稱tree
。
通常,您只需在實際需要匿名函數時使用lambda
表達式,例如將其作為參數傳遞給另一個函數,如
sorted_list = sorted(some_list_of_tuples, key=lambda x: x[0])
當你真正想要一個命名函數時,使用def
語句被認為是更好的做法。
defaultdict
使用callable來生成新密鑰的默認值。 int()
返回0, list()
返回一個空列表, tree()
返回一個新的defaultdict
; 所有這些都可以用作defaultdict
參數。 定義tree
以使用自身作為默認值生成器返回defaultdict
的遞歸性質意味着您可以生成嵌套的dicts到任意深度; 每個“葉子”詞典本身就是另一個defaultdict
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.