簡體   English   中英

使用lambda和defaultdict

[英]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可以采用intlist等參數。 在第二行中, defaultdict采用參數樹作為變量。 那有什么意義?

因此,我們傳遞給defaultdicttree是對我們構造的lambda表達式的引用。 因此,這意味着如果defaultdict調用“ factory ”。 我們再次以tree為工廠獲得另一個defaultdict

如果我們這樣調用some_dict['foo']['bar']['qux'] 因此,我們在defaultdict中的defaultdict中有一個defaultdict 所有這些defaultdict都具有tree函數的工廠。 如果我們以后構造額外的子tree ,那么這些將再次成為使用tree作為構造函數的defaultdict

listint 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM