我理解正常的lambda表达式,例如
g = lambda x: x**2
Run Code Online (Sandbox Code Playgroud)
然而,对于一些复杂的,我对它们有点困惑.例如:
for split in ['train', 'test']:
sets = (lambda split=split: newspaper(split, newspaper_devkit_path))
def get_imdb():
return sets()
Run Code Online (Sandbox Code Playgroud)
newspaper功能在哪里.我想知道它到底是什么sets以及为什么get_imdb函数可以返回值sets()
谢谢你的帮助!
补充:代码实际上来自这里factory.py
sets被分配了一个实际上不应该接受输入的 lambda,您可以从它的调用方式中看到这一点。Lambda 的行为通常与普通函数类似,因此可以分配给诸如g或 之类的变量sets。的定义sets没有任何明显的原因被一组额外的括号包围。您可以忽略那些外括号。
Lambda 可以具有与普通函数相同类型的位置参数、关键字参数和默认参数。lambdasets有一个名为 的默认参数split。这是一种常见的习惯用法,可确保sets在循环的每次迭代中获取split与该迭代相对应的值,而不仅仅是在所有情况下最后一次迭代的值。
如果没有默认参数,split将根据调用时的命名空间在 lambda 中进行计算。循环完成后,split外部函数的命名空间中将只是循环的最后一个值。
创建函数对象时立即评估默认参数。这意味着默认参数的值split将位于创建它的循环迭代中的任何位置。
您的示例有点误导,因为它丢弃了sets除最后一个值之外的所有实际值,使得 lambda 的默认参数毫无意义。下面的示例说明了如果保留所有 lambda 表达式会发生什么情况。首先使用默认参数:
集 = []
对于 ['train', 'test'] 中的分割:
集合.append(lambda split=split: split)
print([fn() 表示集合中的 fn])
为了便于说明,我已截断 lambda 以仅返回其输入参数。此示例将按['train', 'test']预期打印 。
如果您在没有默认参数的情况下执行相同的操作,则输出将是['test', 'test']:
集 = []
对于 ['train', 'test'] 中的分割:
集合.append(lambda: split)
print([fn() 表示集合中的 fn])
这是因为是所有 lambda 求值时'test'的值。split
| 归档时间: |
|
| 查看次数: |
92 次 |
| 最近记录: |