我理解正常的lambda表达式,例如
g = lambda x: x**2
然而,对于一些复杂的问题,我有点困惑。例如:
for split in ['train', 'test']:
sets = (lambda split=split: newspaper(split, newspaper_devkit_path))
def get_imdb():
return sets()
其中newspaper
是一个函数。我想知道sets
实际上是什么,为什么get_imdb
函数可以返回值sets()
谢谢你的帮助!你知道吗
添加: 代码实际上来自这里factory.py
sets
被分配了一个lambda,这个lambda实际上不应该接受输入,从调用的方式可以看出。lambda的行为通常类似于普通函数,因此可以分配给g
或sets
等变量。sets
的定义被一组额外的圆括号包围,没有明显的原因。你可以忽略那些外部参数。你知道吗lambda可以具有与普通函数相同的所有类型的位置参数、关键字参数和默认参数。lambda
sets
有一个名为split
的默认参数。这是一个常见的习惯用法,用于确保循环的每个迭代中的sets
都获得对应于该迭代的split
值,而不是在所有情况下仅获得上一次迭代的值。你知道吗如果没有默认参数,
split
将在lambda中根据调用时的名称空间进行计算。一旦循环完成,外部函数名称空间中的split
将是它对循环的最后一个值。你知道吗创建函数对象时,会立即计算默认参数。这意味着默认参数
split
的值将位于创建它的循环的迭代中的任何位置。你知道吗您的示例有点误导,因为它丢弃了
sets
的所有实际值(除了最后一个),使得lambda的默认参数没有意义。下面是一个示例,说明如果保留所有lambda会发生什么。首先使用默认参数:为了便于说明,我截断了lambda以返回它们的输入参数。本例将按预期打印
['train', 'test']
。你知道吗如果在没有默认参数的情况下执行相同的操作,则输出将改为
['test', 'test']
:这是因为
'test'
是计算所有lambda时split
的值。你知道吗lambda函数:
几乎可以等价地重写:
无论使用哪种方法,都可以按以下方式调用函数:
在你的例子中
可以重写:
因此可以称之为:
当你写下以下内容时:
你正在定义一个“闭包”。对函数
sets
的引用保存在get_imdb
中,以便以后可以在调用get_imdb
的任何地方调用它。你知道吗也许你对
split=split
部分感到困惑。这与在常规函数中的含义相同:左侧的split是lambda函数的参数,右侧的split是没有提供值时左侧split采用的默认值。在这种情况下,默认值将是for循环中定义的变量split
。你知道吗那么,回答你的第一个问题(什么是
sets
?)地址:sets
是一个匿名函数(或lambda函数)分配给的变量。这允许通过变量sets
引用和使用lambda函数。你知道吗关于第二个问题(为什么
sets()
可以返回?),我回答:因为
sets
是一个充当函数的变量,所以在它调用lambda函数之后添加括号。因为没有给定参数,所以参数split
取值'test'
,这是for循环变量split
取的最后一个值。这里值得注意的是,由于sets
不是在函数get_imdb
内定义的,解释器在get_imdb
范围外查找sets
的定义(并找到引用lambda函数的定义)。你知道吗相关问题 更多 >
编程相关推荐