<p>这个<code>with_default_value</code>函数通常被称为“闭包”(从技术上讲,闭包是返回的<em>内部</em>函数,这里<code>newfunc</code>——参见示例<a href="http://en.wikipedia.org/wiki/Closure_(computer_science)" rel="nofollow noreferrer">here</a>)。更一般地说,<code>with_default_value</code>是一个<em>高阶函数</em>(“HOF”):它以函数(<code>func</code>)为参数,并返回一个函数(<code>newfunc</code>)作为结果。在</p>
<p>我已经看到一些答案将这与Python中的<em>decorator</em>概念和构造混淆在一起,这绝对是<strong>而不是</strong>这种情况——特别是因为您经常提到<code>func</code>是一个内置的,比如<code>int</code>。decorator也是高阶函数,但更具体:它返回一个修饰的,即“enriched”版本的函数参数(必须是<em>唯一的</em>参数--“Decorators with arguments”是通过一个更高级别的函数/闭包嵌套获得的,<em>不是</em>通过给decorator HOF一个以上的参数),它被重新分配到与函数参数完全相同的名称(因此通常具有相同的签名——否则使用decorator将是非常特殊的、非惯用的、不可读的,等等)。在</p>
<p>因此,忘掉与case完全无关的decorators,而只关注<code>newfunc</code>闭包。一个词汇嵌套的函数可以引用(尽管不是重新绑定)封闭函数的所有局部变量名(包括参数名,因为参数是局部变量)——这就是它被称为闭包的原因:它对这些“自由变量”是“闭合的”。在这里,<code>newfunc</code>可以引用<code>func</code>和{<cd11>}——而且确实如此。在</p>
<p>在Python中,高阶函数是非常自然的事情,尤其是因为函数是一类对象(因此,没有什么特别的事情需要做,可以将它们作为参数传递,作为函数值返回,甚至可以将它们存储在列表或其他容器中,等等),而且函数和其他类型的对象之间没有名称空间的区别,也没有仅仅因为提到了函数就自动调用函数等等(这更难——有点难,或者更难,这取决于在其他语言中,确实有很多这样的区别)。在Python中,提到一个函数就是——提到;只有当函数对象(通过名称或其他方式引用)后跟括号时才会发生调用。在</p>
<p>这就是这个例子的全部内容——如果您对其他方面仍有疑问,请随时编辑您的问题、评论等!在</p>
<p><strong>编辑</strong>:因此OP礼貌地评论,要求提供更多“关闭工厂”的例子。这里有一个——想象一下某种抽象的图形用户界面工具包,您正在尝试:</p>
<pre><code>for i in range(len(buttons)):
buttons[i].onclick(lambda: mainwin.settitle("button %d click!" % i))
</code></pre>
<p>但这并不正确-<code>i</code>中的<code>i</code>是延迟绑定的,所以当一个按钮被点击时,^{<cd12>的值总是会是最后一个<em>按钮的索引,不管单击了哪个按钮。有各种可行的解决方案,但关闭工厂是一种很好的可能性:</p>
^{pr2}$
<p>这里,我们使用闭包工厂来调整变量的绑定时间!-)以某种特定的形式,这是关闭工厂的一个非常常见的用例。在</p>