【问题标题】:python higher order functions: how do i read the code step by step?python高阶函数:我如何逐步阅读代码?
【发布时间】:2021-09-23 12:33:47
【问题描述】:

我目前正在尝试解释代码,但即使我使用 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

我的解释正确吗?

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

【问题讨论】:

  • 这可能有助于使用更多的临时变量来保存 three(two) 之类的结果,并使用 def 语句而不是 lambda 表达式来重写代码以将函数绑定到名称。在您习惯这种函数式方法之前,大型嵌套表达式可能会让人有点不知所措。

标签: python higher-order-functions


【解决方案1】:

two(f) 返回一个应用两次f 的函数,three(f) 返回一个应用三次f 的函数。

如果 f 是一个加 5 的函数,那么 three(two(f)) 是一个将 5 加六次 (3 * 2 = 6) 的函数。 three(two(f))(2) == 32,所以你得到了正确的答案,但我认为你的答案是错误的。

然而,three(two) 是一个应用 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,这个问题演示了如何用它们进行乘法和幂运算。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多