python 高阶函数:如何一步步阅读代码?

python higher order functions: how do i read the code step by step?

我目前正在尝试解释代码,但即使我使用 python 导师,我似乎也无法想象它。

def two(f):
    return lambda x: f(f(x))

def three(f):
    return lambda x: f(f(f(x)))

print(three(two(lambda x: x+5))(2))
print(three(two)(lambda x: x+5)(2))

对于第一个打印输出,我是这样解释的: two(two(two(x+5))) = (x + 5 + 5) + (5 + 5) + (5 + 5) = 32

我的理解正确吗?

此外,我真的不知道如何解释第二个打印输出。

two(f) returns 应用 f 两次的函数,three(f) returns 应用 f 三次的函数。

如果说f是一个加5的函数,那么three(two(f))就是一个6次加5的函数(3 * 2 = 6)。 three(two(f))(2) == 32,所以你答对了,但我觉得你答错了。

然而,

three(two) 是一个应用了 3 次 two 的函数,所以 three(two)(f) == two(two(two(f)))two(f) 两次加 5。 two(two(f)) 加 5 四次。 two(two(two(f)))) 将 5 加八次,所以 three(two)(f)(2) 是 2 + 5 * 8 = 42。

这些函数实际上是计算发展中非常重要的一部分。它们被称为 Church numerals,这个问题演示了如何用它们进行乘法和求幂。

在第一种情况下,two() 生成一个调用您的 x+5 两次的函数,three() 生成一个将调用第一个函数三次的函数。这意味着您的 lambda 被调用三次两次 = 六次。

在第二种情况下,three()函数将调用two()函数三次,所以结果是:two(two(two(f)))(x),这意味着你的lambda被调用了2 * 2 * 2 == 8次,结果为42.