【问题标题】:Python nested functionPython 嵌套函数
【发布时间】:2018-05-10 06:59:02
【问题描述】:

我遇到了这个有趣的代码

# Define echo
def echo(n):
    """Return the inner_echo function."""

    # Define inner_echo
    def inner_echo(word1):
        """Concatenate n copies of word1."""
        echo_word = word1 * n
        return echo_word

    # Return inner_echo
    return inner_echo


# Call echo: twice
twice = echo(2)

# Call echo: thrice
thrice = echo(3)

# Call twice() and thrice() then print
print(twice('hello'), thrice('hello'))

输出:

你好你好你好你好

但我无法理解它是如何工作的,因为 两次和三次函数 正在调用函数 echo 并提供 值 nword1的值是怎么传递的?

【问题讨论】:

  • 第一个 echo 函数被初始化,如果你已经熟悉 class,就和 class 一样。这个构造类似于你初始化主函数,而不是你可以将值传递给内部方法。例如。在 JavaScript 中没有合适的类(没有创建像 String 这样的新类型)——它们实际上是包含其他函数的函数。
  • 您正在查看的内容称为闭包。当我第一次遇到这个概念时,我很难理解它,但是一旦你知道了这个词,你就可以搜索它并阅读一些东西来获得理解。很多语言都有它们,这里有一个链接可以很好地解释它。:stackoverflow.com/a/7464475/1468125

标签: python python-3.x nested-function


【解决方案1】:

echo 函数返回另一个函数,该函数将 n 设置为您传递给它的任何值。当您调用 inner_echo(即 echo 的返回)时,它会保留创建时给定的范围。

在您的示例中,twice 是使用 echo(2) 创建的,它返回 inner_echo 函数,在其范围内,n 设置为 2

同样,由echo(3) 创建的thrice 创建inner_echo 版本,其中n 设置为3

还记得echo 如何返回一个函数吗?当您调用twicethrice 时,您调用的是echo 返回 的函数——也就是说,您根本没有调用echo。因此调用twice 就是调用inner_echo,这就是word 的填充方式。

【讨论】:

    【解决方案2】:

    echo 是一个函数,它接受一个参数 n 并返回另一个函数,该函数在 n 的提供值上关闭,并且还接受一个参数 word1

    换句话说,为某些n调用echo(n)会返回一个函数,然后用twice(word1)调用该函数

    流程本质上是。

    echo = function (n) -> function (word1) with closure (n) -> word1 repeated n times
    
    twice = echo (2) -> function (word1) with closure (n = 2) -> word1 repeated 2 times
    
    twice('hello') -> 'hello' repeated 2 times
    

    我以上述方式描述它,因为 AFAICT Python 没有表达函数类型的语法。

    【讨论】:

      【解决方案3】:

      上面的例子是函数闭包

      的例子

      你可以参考这个链接Function Closure In Python

      【讨论】:

      • 不要只发布文档链接,引用一些与后代相关的内容。
      • 我发链接的目的是,首先他会尝试理解函数闭包的概念并尝试调试上面的例子,这对他来说变得容易,对他也有好处@AluanHaddad
      • 好主意,但这只是一个评论,而不是一个答案。这并没有真正添加任何东西作为答案。但是在您的答案中添加指向文档的链接很棒。
      【解决方案4】:

      当您在 twice = echo(2) 中调用值为 2 的 echo 时,它会在内部存储值 2。因此,当我们调用两次('hello') 时,它会记住 n 的值并多次打印它。 当您将 3 传递给与 thrice = echo(3) 相同的函数时,它会在内部存储值 3。

      所以,基本上它是创建具有不同 n 值的实例。希望你能理解。

      尝试传递它 twice = echo(2) 然后 twice = echo(3) ,在这种情况下它会更新 n 的值。

      【讨论】:

        猜你喜欢
        • 2010-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-04
        • 2020-05-16
        • 2021-12-04
        相关资源
        最近更新 更多