gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:26:25 25 4
gpt4 key购买 nike

我理解正常的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 通常表现得像普通函数,因此可以分配给 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'split 的值,当所有的 lambda 都被评估时。

关于python - 对python中的lambda表达式感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46375959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com