<h3>高阶函数</h3>
<hr/>
<p>像<code>makeInc</code>这样依次返回另一个函数的函数称为<a href="https://en.wikipedia.org/wiki/Higher-order_function" rel="nofollow noreferrer">higher order functions</a>。通常,函数接受数据作为输入,返回数据作为输出。对于高阶函数,函数代替数据,要么返回代码作为输出,要么接受代码作为输入。这段代码被包装到一个函数中。在Python中,函数是第一类公民,这意味着函数和数据一样可以传递。例如:</p>
<pre><code>myvariable = print
</code></pre>
<p>请注意,我如何将<code>print</code>分配给<code>myvariable</code>以及如何在<code>print</code>函数之后删除括号(没有括号)的函数称为函数对象。这意味着<code>myvariable</code>现在只是<code>print</code>的另一个名称:</p>
<pre><code>print("Hello World!")
myvariable("Hello World!")
</code></pre>
<p>上述两种说法的作用完全相同。可以分配给变量的内容也可以从函数返回:</p>
<pre><code>def myfunction():
return print
myfunction()("Hello World!");
</code></pre>
<hr/>
<p>现在让我们看一下您的示例:</p>
<pre><code>def makeInc(x):
def inc(y):
return y + x
return inc
</code></pre>
<p><code>makeInc</code>是一个接受名为<code>x</code>的参数的函数。然后它定义另一个名为<code>inc</code>的嵌套内部函数,该函数接受名为<code>y</code>的参数。关于嵌套函数的一点是,它们也可以访问封闭函数的变量。这里,<code>inc</code>是内部函数,但它可以访问<code>x</code>,这是封闭外部作用域的变量。
最后一条语句<code>return inc</code>将内部函数返回给<code>makeInc</code>的调用方。<code>makeInc</code>本质上正在做的是根据它接收的参数创建一个自定义函数。
例如:</p>
<pre><code>x = makeInc(10)
</code></pre>
<p><code>makeInc</code>将首先接受10,然后返回一个函数,该函数接受参数<code>y</code>,并将<code>y</code>增加10。
这里,<code>x</code>是一个函数,它接受任何参数<code>y</code>,然后将其递增10:</p>
<pre><code>x(42) # Returns 52
</code></pre>
<h3><code>nonlocal</code></h3>
<p>但是,使用嵌套函数时需要注意:</p>
<pre><code>def outer():
x = 10
def inner():
x = 20
inner()
print(x) # prints 10
</code></pre>
<p>在这里,您可以假设最后一个<code>print</code>语句将打印20。但是没有!当您在内部函数中赋值<code>x = 20</code>时,它会创建一个名为<code>x</code>的新局部变量,该变量初始化为20。外层<code>x</code>保持不变。要修改外部<code>x</code>,请使用<code>nonlocal</code>关键字:</p>
<pre><code>def outer():
x = 10
def inner():
nonlocal x = 20
inner()
print(x) # prints 20
</code></pre>
<p>如果直接读取<code>x</code>内部的<code>inner()</code>而不是分配给它,则不需要<code>nonlocal</code></p>