<p>你的例子写得没有帮助。但在其他情况下,它是有用的,例如decorator(在函数和返回函数上调用的函数,用于修改为将来调用它们的函数的行为)和闭包。闭包情况可以是一种方便(例如,代码的其他部分不希望在每次调用中都传递10个参数,而其中8个参数始终是相同的值;这通常由<code>functools.partial</code>涵盖,但闭包也可以工作),或者它可以是一种缓存时间节约。对于后者的一个例子,想象一个愚蠢的函数,它测试一组小于某个界限的数中的哪一个是素数,方法是计算所有达到该界限的素数,然后过滤这些素数集中的输入</p>
<p>如果您将其写为:</p>
<pre><code>def get_primes(*args):
maxtotest = max(args)
primes = sieve_of_eratosthenes(maxtotest) # (expensive) Produce set of primes up to maxtotest
return primes.intersection(args)
</code></pre>
<p>然后,每次通话你都要重新筛选埃拉托什尼,这就淹没了设置交叉口的成本。如果将其实现为闭包,则可以执行以下操作:</p>
<pre><code>def make_get_primes(initialmax=1000):
primes = sieve_of_eratosthenes(initialmax) # (expensive) Produce set of primes up to maxtotest
currentmax = initialmax
def get_primes(*args):
nonlocal currentmax
maxtotest = max(args)
if maxtotest > currentmax:
primes.update(partial_sieve_of_eratosthenes(currentmax, maxtotest)) # (less expensive) Fill in additional primes not sieved
currentmax = maxtotest
return primes.intersection(args)
return get_primes
</code></pre>
<p>现在,如果您需要一段时间的测试仪,您可以执行以下操作:</p>
<pre><code>get_primes = make_get_primes()
</code></pre>
<p>而且每次对<code>get_primes</code>的调用都很便宜(如果缓存的素数已经覆盖了您,则基本上是免费的,如果需要计算更多,则更便宜)</p>