【问题标题】:Don't understand how this nested function works [duplicate]不明白这个嵌套函数是如何工作的[重复]
【发布时间】:2019-08-15 04:24:07
【问题描述】:
def raise_val(n):
    def inner(x):
        raised = x**n
        return raised
    return inner

square = raise_val(2)
print(square(2))# gives 4 as output

我不明白这个嵌套函数是如何工作的……还有为什么square(2) 输出 4?
square 不只是一个变量吗?

【问题讨论】:

  • “提供”是什么意思?而“我不明白”实际上并不是一个问题。
  • 您可能想了解一流的对象以及它们在 python 中的工作方式
  • 输出 4。
  • 是的,您在问题中说过。目前尚不清楚为什么这是出乎意料的或您要问什么。 Square 只是一个变量,是的,但它的值是一个函数。
  • type(square) 会很有启发性。

标签: python


【解决方案1】:

这在函数式编程语言中称为高阶函数。 Python 也使用这种范例。

高阶函数是一个函数,它要么/要么都接受一个函数作为参数和/或返回一个函数作为结果。你的函数raise_val 是一个高阶函数,因为它返回一个函数。你的变量square 有一个函数(inner)。

当您调用raise_val(2) 时,您所做的是返回一个需要评估的部分函数。然后使用square(2),您将2 传递给inner 部分函数,​​当您最初调用raise_val(2) 时,该函数将2 用于n

【讨论】:

  • 很好的解释
【解决方案2】:

在python中,函数也是值。

因此,每次调用 raise_val 时,都会生成一个新的“内部”函数,该函数为 n 变量提供不同的常量。

您将这个新函数分配给变量square,然后调用这个新函数。

【讨论】:

    【解决方案3】:

    当您键入square = raise_val(2) 时,您将n=2 参数提供给innerraise_val 将返回内部函数并将其存储在square 变量中。

    def raise_val(n):
        def inner(x):
            raised = x**n
            return raised
        return inner # This returns a function, not a number!
    

    这就是为什么您以后可以通过写square(2)调用 square。在这里,您提供了 x=2 参数。

    print(square(2))# gives 4 as output
    

    你所做的相当于打印raise_val(n=2)(x=2)

    【讨论】:

      【解决方案4】:

      逐行解释:

      • def raise_val(n):开始定义一个函数raise_val,它接受n作为参数。

        • def inner(x): 开始定义一个函数raise_val 内,称为inner,它接受x 作为参数
          • raised = x**n 将变量 raised 设置为 xinner 的参数)nraise_val 的参数)的幂
          • return raised return raised 作为inner 的返回值
        • return inner return 函数inner 作为raise_val 的返回值
      • square = raise_val(2) 设置一个新变量 square 作为函数 raise_val 的输出,当使用参数 2 调用时,这将是一个接受数字 x 并返回平方的函数

      • print(square(2)) 使用参数 2 调用变量 square,从而将 2 返回到 2 或 4 的幂,然后打印出来

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-07
        • 1970-01-01
        • 1970-01-01
        • 2012-07-09
        • 2021-04-02
        • 1970-01-01
        • 1970-01-01
        • 2023-02-02
        相关资源
        最近更新 更多