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

时间:2013-07-01 21:02:35

标签: python lambda

我是reading about lambdas (dive into python)并且我已经执行了一个示例代码,我得到的结果与文本状态不同。这是example 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版本发生了变化,或者为什么我的结果与这本传奇的书籍有所不同,这有什么不对吗?

1 个答案:

答案 0 :(得分:6)

您需要再次设置processFunc

每次设置collapse时都不会重新评估表达式;它只计算一次。执行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。