我是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版本发生了变化,或者为什么我的结果与这本传奇的书籍有所不同,这有什么不对吗?
答案 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。