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主意,但这只是一个评论,而不是一个答案。这并没有真正增加任何答案。但是在你的答案中添加文档链接是很好的。