如何理解Peter Norvig的Python函数式代码?

for*_*tyj 8 python lambda

在阅读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,则返回结果.这对我来说似乎是违反直觉的.

Pav*_*sov 5

让我们来看看:

  • _if(True)调用,并立即返回带alternative参数的lambda
  • 使用alternativeset to 调用1返回的resultlambda 并返回lambda
  • result拉姆达被调用result设置为lambda: n * fact(n-1)
  • not not True 求值为1(此示例来自python 2.4时代!),它为第二个列表项编制索引,即 delay(alternative)
  • alternative被设定为1更早
  • delay(1) 被调用,返回 lambda: 1
  • lambda: 1被叫,它返回1.

TL/DR:1alternative.

 

命名函数版本:

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)