首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >折叠和(lambda s:“”.join(s.split())或(lambda s: s) )

折叠和(lambda s:“”.join(s.split())或(lambda s: s) )
EN

Stack Overflow用户
提问于 2014-01-08 07:09:39
回答 4查看 3.1K关注 0票数 2

我是python.When的新手,我在互联网上搜索lambda。我在函数中找到了这个陈述。

代码语言:javascript
复制
processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)

对me.Why来说很不方便,他不是这样写的?

代码语言:javascript
复制
processFunc = collapse and " ".join(s.split()) or s
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-01-08 07:16:10

因为processFunc必须是函数,而不是调用函数的结果。

事实上,这句话是:

代码语言:javascript
复制
processFunc = collapse and " ".join(s.split()) or s

将引发NameError,因为未定义s。如果定义了s,则取决于collapse是什么,它可以计算为字符串" ".join(s.split())s

而线路:

代码语言:javascript
复制
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

你真的应该把这一行改写成:

代码语言:javascript
复制
processFunc = (lambda s: " ".join(s.split())) if collapse else (lambda s: s)

尽管在这种特殊情况下,and+or表单是等价的,因为所有的lambdas都是真的。

您甚至可以用真正的函数替换lambda,以增强可读性:

代码语言:javascript
复制
def identity(x):
    return x

def normalize_spaces(s):
    return ' '.join(s.split())

processFunc = normalize_spaces if collapse else identity
票数 2
EN

Stack Overflow用户

发布于 2014-01-08 07:19:32

另一种形式是:

代码语言:javascript
复制
processFunc =  (lambda s: " ".join(s.split())) if collapse else (lambda s: s)

(顺便说一句,根据我的测量,这种形式通常更有效)

编辑:

我已经看到了很多解释,它的作用-但以下是这个想法的理由。本质上,当折叠是一个全局变量集一次(命令行或配置)时,以及下面的函数

代码语言:javascript
复制
def processFunc(s):
    return " ".join(s.split()) if collapse else s

被称为无数次,对每个调用的检查条件增加了处理开销--这可能是相当大的。将功能划分为两个函数,计算条件(一次)并将引用分配给函数,使代码具有更高的性能效率。

票数 1
EN

Stack Overflow用户

发布于 2014-01-08 07:12:08

使用函数会将表达式的计算推迟到稍后的某个点。" ".join(s.split())是一个字符串。(lambda s: " ".join(s.split()))是一个函数,当被调用时,它将返回一个字符串。如果您需要一个函数(即,如果该对象是您以后尝试调用的对象),则需要该函数,而不是它的结果。

在这种情况下,在定义processFunc时,范围内可能甚至没有任何s。函数将被创建,但它会拆分/加入稍后传递给它的字符串。要直接执行" ".join(s.split()),现在需要有s

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20989115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档