深入python:lambda表达式:逻辑消歧

深入python:lambda表达式:逻辑消歧,python,lambda,Python,Lambda,我是,我执行了一个示例代码,得到了与文本状态不同的结果。这是示例4.21: processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s) 这是我的py 2.7控制台输出: >>> collapse = True >>> processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)

我是,我执行了一个示例代码,得到了与文本状态不同的结果。这是
示例4.21

processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
这是我的py 2.7控制台输出:

>>> collapse = True
>>> processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
>>> processFunc("this   is\na\ttest")
'this is a test'
>>> collapse = False
>>> processFunc("this   is\na\ttest")
'this is a test'

如我所见,无论
collapse
值是多少,都会返回第一个lambda表达式。我的想法或python版本的更改是否有问题,或者为什么我得到的结果与这本传奇性的书中所说的不同?

您需要再次设置
processFunc

表达式不会在每次设置“折叠”时重新计算;它只计算一次。执行
collapse=False
并没有神奇地将
processFunc
更改为指向另一个lambda

只需再次运行
processFunc=
表达式:

>>> collapse = True
>>> processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
>>> processFunc("this   is\na\ttest")
'this is a test'
>>> collapse = False
>>> processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
>>> processFunc("this   is\na\ttest")
'this   is\na\ttest'
如果希望重新计算
processFunc
,则需要将其本身设置为函数或lambda:

>>> collapse = True
>>> processFunc = lambda: collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
>>> processFunc()("this is\na\ttest")
'this is a test'
>>> collapse = False
>>> processFunc()("this is\na\ttest")
'this is\na\ttest'

但是请注意,现在必须调用
processFunc()
来返回lambda对象,然后我们使用参数调用它。通过调用
processFunc
重新计算表达式,将在周围范围中查找
collapse
名称(在本例中为全局名称),并返回一个lambda。

您需要再次设置
processFunc

表达式不会在每次设置“折叠”时重新计算;它只计算一次。执行
collapse=False
并没有神奇地将
processFunc
更改为指向另一个lambda

只需再次运行
processFunc=
表达式:

>>> collapse = True
>>> processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
>>> processFunc("this   is\na\ttest")
'this is a test'
>>> collapse = False
>>> processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
>>> processFunc("this   is\na\ttest")
'this   is\na\ttest'
如果希望重新计算
processFunc
,则需要将其本身设置为函数或lambda:

>>> collapse = True
>>> processFunc = lambda: collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
>>> processFunc()("this is\na\ttest")
'this is a test'
>>> collapse = False
>>> processFunc()("this is\na\ttest")
'this is\na\ttest'

但是请注意,现在必须调用
processFunc()
来返回lambda对象,然后我们使用参数调用它。通过调用
processFunc
重新计算表达式,将在周围范围中查找
collapse
名称(在本例中为全局名称),并返回一个lambda。

aaah。。。谢谢我认为它的工作原理与javascript闭包类似。@tkoomzaaskz Python闭包和lambdas的工作原理与javascript闭包类似。然而,这在javascript中并不像您期望的那样工作。Javascript也不会神奇地重新计算赋值语句。@Marcin您能详细解释一下吗?我不明白这里的
js
py
有什么区别,这似乎很重要。。。谢谢你advance@tkoomzaaskz:闭包是完全不同的东西;您需要引用周围范围中的名称的嵌套函数
closure
不是周围作用域中的变量,
processFunc
的表达式也不是嵌套函数。@tkoomzaaskz:如果将
processFunc
定义为lambda本身,它可能会这样工作:
processFunc=lambda:collapse and(lambda s:.join(s.split())或(lambda s:s)
(“这是\n\t测试”).aaah。。。谢谢我认为它的工作原理与javascript闭包类似。@tkoomzaaskz Python闭包和lambdas的工作原理与javascript闭包类似。然而,这在javascript中并不像您期望的那样工作。Javascript也不会神奇地重新计算赋值语句。@Marcin您能详细解释一下吗?我不明白这里的
js
py
有什么区别,这似乎很重要。。。谢谢你advance@tkoomzaaskz:闭包是完全不同的东西;您需要引用周围范围中的名称的嵌套函数
closure
不是周围作用域中的变量,
processFunc
的表达式也不是嵌套函数。@tkoomzaaskz:如果将
processFunc
定义为lambda本身,它可能会这样工作:
processFunc=lambda:collapse and(lambda s:.join(s.split())或(lambda s:s)
(“这是\n\t测试”)。