我是python.When的新手,我在互联网上搜索lambda。我在函数中找到了这个陈述。
processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)对me.Why来说很不方便,他不是这样写的?
processFunc = collapse and " ".join(s.split()) or s发布于 2014-01-08 07:16:10
因为processFunc必须是函数,而不是调用函数的结果。
事实上,这句话是:
processFunc = collapse and " ".join(s.split()) or s将引发NameError,因为未定义s。如果定义了s,则取决于collapse是什么,它可以计算为字符串" ".join(s.split())或s。
而线路:
processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)如果函数(lambda s: " ".join(s.split()))为true,则将对函数(lambda s: s)进行计算,否则将对函数(lambda s: s)进行计算。
请注意,编写A and B or C在某种程度上等同于编写B if A else C,尽管它们并不是100%等效的,因为在if版本中,只有A的布尔值对于确定表达式的结果很重要,而在其他代码中,如果A是true,而B是假的,则结果是C。
你真的应该把这一行改写成:
processFunc = (lambda s: " ".join(s.split())) if collapse else (lambda s: s)尽管在这种特殊情况下,and+or表单是等价的,因为所有的lambdas都是真的。
您甚至可以用真正的函数替换lambda,以增强可读性:
def identity(x):
return x
def normalize_spaces(s):
return ' '.join(s.split())
processFunc = normalize_spaces if collapse else identity发布于 2014-01-08 07:19:32
另一种形式是:
processFunc = (lambda s: " ".join(s.split())) if collapse else (lambda s: s)(顺便说一句,根据我的测量,这种形式通常更有效)
编辑:
我已经看到了很多解释,它的作用-但以下是这个想法的理由。本质上,当折叠是一个全局变量集一次(命令行或配置)时,以及下面的函数
def processFunc(s):
return " ".join(s.split()) if collapse else s被称为无数次,对每个调用的检查条件增加了处理开销--这可能是相当大的。将功能划分为两个函数,计算条件(一次)并将引用分配给函数,使代码具有更高的性能效率。
发布于 2014-01-08 07:12:08
使用函数会将表达式的计算推迟到稍后的某个点。" ".join(s.split())是一个字符串。(lambda s: " ".join(s.split()))是一个函数,当被调用时,它将返回一个字符串。如果您需要一个函数(即,如果该对象是您以后尝试调用的对象),则需要该函数,而不是它的结果。
在这种情况下,在定义processFunc时,范围内可能甚至没有任何s。函数将被创建,但它会拆分/加入稍后传递给它的字符串。要直接执行" ".join(s.split()),现在需要有s。
https://stackoverflow.com/questions/20989115
复制相似问题