对python中的lambda表达式感到困惑吗

2024-04-24 16:20:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我理解正常的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


Tags: pathlambda函数intestforget表达式
3条回答

sets被分配了一个lambda,这个lambda实际上不应该接受输入,从调用的方式可以看出。lambda的行为通常类似于普通函数,因此可以分配给gsets等变量。sets的定义被一组额外的圆括号包围,没有明显的原因。你可以忽略那些外部参数。你知道吗

lambda可以具有与普通函数相同的所有类型的位置参数、关键字参数和默认参数。lambda sets有一个名为split的默认参数。这是一个常见的习惯用法,用于确保循环的每个迭代中的sets都获得对应于该迭代的split值,而不是在所有情况下仅获得上一次迭代的值。你知道吗

如果没有默认参数,split将在lambda中根据调用时的名称空间进行计算。一旦循环完成,外部函数名称空间中的split将是它对循环的最后一个值。你知道吗

创建函数对象时,会立即计算默认参数。这意味着默认参数split的值将位于创建它的循环的迭代中的任何位置。你知道吗

您的示例有点误导,因为它丢弃了sets的所有实际值(除了最后一个),使得lambda的默认参数没有意义。下面是一个示例,说明如果保留所有lambda会发生什么。首先使用默认参数:

sets = []
for split in ['train', 'test']:
    sets.append(lambda split=split: split)
print([fn() for fn in sets])

为了便于说明,我截断了lambda以返回它们的输入参数。本例将按预期打印['train', 'test']。你知道吗

如果在没有默认参数的情况下执行相同的操作,则输出将改为['test', 'test']

sets = []
for split in ['train', 'test']:
    sets.append(lambda: split)
print([fn() for fn in sets])

这是因为'test'是计算所有lambda时split的值。你知道吗

lambda函数:

func = lambda x: x**2

几乎可以等价地重写:

def func(x):
    return x**2

无论使用哪种方法,都可以按以下方式调用函数:

func(4)

在你的例子中

sets = lambda split=split: newspaper(split, newspaper_devkit_path)

可以重写:

def sets(split=split):
    return newspaper(split, newspaper_devkit_path)

因此可以称之为:

sets()

当你写下以下内容时:

def get_imdb():
    return sets()

你正在定义一个“闭包”。对函数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函数的定义)。你知道吗

相关问题 更多 >