深入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测试”)。