使用 lambda 和 defaultdict

Using lambda and defaultdict

我在阅读有关集合 defaultdict 的内容时遇到了以下代码行:

import collections
tree = lambda: collections.defaultdict(tree)
some_dict = tree()
some_dict['colours']['favourite'] = "yellow"

我知道 lamba 接受一个变量并对其执行一些功能。我见过 lambda 被这样使用: λ x: x + 3 上面第二行代码,lambda取什么变量,执行什么功能?

我也明白defaultdict可以带int或者list之类的参数。在第二行中,defaultdict 采用参数 tree,它是一个变量。这有什么意义?

In the second line of code above, what variable is lambda taking and what function is it carrying out?

lambda 函数是一个匿名(无名称)函数。所以像这样的 lambda 表达式:

tree = lambda: collections.defaultdict(tree)

是,除了一些细节(事实上它的__name__属性包含函数的名称,而不是'<lambda>'),它等同于:

def tree():
    return collectsions.defaultdict(tree)

与简单表达式的不同之处在于,我们在这里将计算编码在一个函数中。我们永远不能调用它,调用一次,或者多次。

它还可以让我们打个结。请注意,我们在结果中传递了对函数(lambda 表达式)的引用。因此,我们有一个函数可以构造一个 defaultdict 并将函数本身作为工厂。因此,我们可以递归地构造子树。

I also understand that defaultdict can take parameters such as int or list. In the second line, defaultdict takes the parameter tree which is a variable. What is the significance of that?

我们传递给 defaultdicttree 因此是对我们构造的 lambda-expression 的引用。因此,这意味着如果 defaultdict 调用“factory”。我们又得到另一个 defaultdict 作为工厂 tree.

如果我们这样调用some_dict['foo']['bar']['qux']。因此,我们在 defaultdict 中的 defaultdict 中有一个 defaultdict。所有这些 defaultdict 都具有 tree 功能。如果我们稍后构造额外的 children,这些将再次是一个 defaultdicttree 作为构造函数。

listint 的情况并不特殊。如果您调用 list(如 list()),那么您将构建一个 new 空列表。 int 也是如此:如果你调用 int(),你将获得 0。这是对 class object 的引用这一事实是无关紧要的: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 接受一个可调用对象来为新键生成默认值。 int() returns 0,list() returns 一个空列表,tree() returns 一个新的 defaultdict;它们都可以用作 defaultdict 的参数。将 tree 定义为 return 的递归性质 a defaultdict 使用自身作为默认值生成器意味着您可以生成任意深度的嵌套字典;每个 "leaf" dict 本身就是另一个 defaultdict.