使用 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?
我们传递给 defaultdict
的 tree
因此是对我们构造的 lambda-expression 的引用。因此,这意味着如果 defaultdict
调用“factory”。我们又得到另一个 defaultdict
作为工厂 tree
.
如果我们这样调用some_dict['foo']['bar']['qux']
。因此,我们在 defaultdict
中的 defaultdict
中有一个 defaultdict
。所有这些 defaultdict
都具有 tree
功能。如果我们稍后构造额外的 children,这些将再次是一个 defaultdict
和 tree
作为构造函数。
list
或 int
的情况并不特殊。如果您调用 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
.
我在阅读有关集合 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 asint
orlist
. In the second line,defaultdict
takes the parameter tree which is a variable. What is the significance of that?
我们传递给 defaultdict
的 tree
因此是对我们构造的 lambda-expression 的引用。因此,这意味着如果 defaultdict
调用“factory”。我们又得到另一个 defaultdict
作为工厂 tree
.
如果我们这样调用some_dict['foo']['bar']['qux']
。因此,我们在 defaultdict
中的 defaultdict
中有一个 defaultdict
。所有这些 defaultdict
都具有 tree
功能。如果我们稍后构造额外的 children,这些将再次是一个 defaultdict
和 tree
作为构造函数。
list
或 int
的情况并不特殊。如果您调用 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
.