在阅读Peter Norvig的Python IAQ时,我遇到了这段代码:
def _if(test):
return lambda alternative: \
lambda result: \
[delay(result), delay(alternative)][not not test]()
def delay(f):
if callable(f): return f
else: return lambda: f
fact = lambda n: _if (n <= 1) (1) (lambda: n * fact(n-1))
fact(100)
Run Code Online (Sandbox Code Playgroud)
我在互联网上搜索了这个代码,这个代码出现在几个论坛中,但似乎那些评论它的人都明白它是如何工作的.
我对函数式编程概念很陌生.我知道如果评估测试True,delay(alternative)将被选中.但实际上,如果test为true,则返回结果.这对我来说似乎是违反直觉的.
让我们来看看:
_if(True)调用,并立即返回带alternative参数的lambdaalternativeset to 调用1返回的resultlambda 并返回lambdaresult拉姆达被调用result设置为lambda: n * fact(n-1)not not True 求值为1(此示例来自python 2.4时代!),它为第二个列表项编制索引,即 delay(alternative)alternative被设定为1更早delay(1) 被调用,返回 lambda: 1lambda: 1被叫,它返回1.TL/DR:1是alternative.
命名函数版本:
def _if(test):
def then_closure(expr_if_true):
def else_closure(expr_if_false):
if test:
delayed = delay(expr_if_true)
else:
delayed = delay(expr_if_false)
return delayed()
return else_closure
return then_closure
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
424 次 |
| 最近记录: |