Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python嵌套函数_Python_Python 3.x_Nested Function - Fatal编程技术网

Python嵌套函数

Python嵌套函数,python,python-3.x,nested-function,Python,Python 3.x,Nested Function,我遇到了这个有趣的代码 # 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 inn

我遇到了这个有趣的代码

# 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,并提供值n,word1的值是如何传递的

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

在您的示例中,使用
echo(2)
创建
两次
,该函数返回
internal\u echo
函数,该函数在其范围内设置为
2

同样地,
echo(3)
创建的
三次
,创建
internal\u echo
新版本,其中
n
设置为
3


还记得
echo
如何返回函数吗?当您调用
两次
三次
时,您正在调用
echo
返回的函数——即,您根本没有调用
echo
。因此,调用
两次
就是调用
内部回声
,这就是
word
的填充方式。

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

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


尝试将其传递两次两次=echo(2),然后再传递两次两次=echo(3),在这种情况下,它将更新n的值。

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

换句话说,对某些
n
调用
echo(n)
返回一个函数,然后用
调用该函数两次(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没有用于表示函数类型的语法。

上述示例是函数闭包的示例


最好您可以参考此链接

初始化第一个echo函数,如果您已经熟悉该类,则可以使用该类。这个构造类似于初始化主函数,可以将值传递给内部方法。在JavaScript中没有合适的类(没有创建像String这样的新类型)-它们实际上是包含其他函数的函数。您看到的是一个闭包。当我第一次遇到这个概念时,我很难理解它,但是一旦你知道这个词,你就可以搜索它并阅读一些东西来获得理解。很多语言都有这样的链接,这里有一个链接可以很好地解释这一点:不要只是在文档中发布链接,引用一些与后代相关的内容。我发布链接的目的是,首先他将尝试理解函数闭包的概念,并尝试调试上面的示例,这对他来说很容易,对他来说也很好@AluanhaddadadadGood主意,但这只是一个评论,而不是一个答案。这并没有真正增加任何答案。但是在你的答案中添加文档链接是很好的。