<p><strong>函数curring的目的是方便地从更一般的函数中获取专门的函数。</strong>您可以通过在不同的时间预先设置一些参数并在之后保持这些参数不变来实现这一目的。</p>
<p>这与命名无关。在Python中,您可以随时轻松地重命名变量/函数。</p>
<p>示例:</p>
<pre><code>def simple_function(a):
def line(b=0):
def compute(x):
return [a+b * xi for xi in x]
return compute
return line
x = range(-4, 4, 1)
print('x {}'.format(list(x)))
print('constant {}'.format(simple_function(3)()(x)))
print('line {}'.format(simple_function(3)(-2)(x)))
</code></pre>
<p>给予</p>
<pre><code>x [-4, -3, -2, -1, 0, 1, 2, 3]
constant [3, 3, 3, 3, 3, 3, 3, 3]
line [11, 9, 7, 5, 3, 1, -1, -3]
</code></pre>
<p>现在还没有那么激动人心。它只将类型为<code>f(a,b,c)</code>的函数调用替换为类型为<code>f(a)(b)(c)</code>的调用,这甚至可能被视为Python中不太优雅的风格。</p>
<p>但它允许你做:</p>
<pre><code>line_through_zero = simple_function(0)
print('line through zero {}'.format(line_through_zero(1)(x))) # only slope and x
</code></pre>
<p>它给予</p>
<pre><code>line through zero [-4, -3, -2, -1, 0, 1, 2, 3]
</code></pre>
<p>因此,curring的优点是,您可以获得具有固定参数的专用函数,并且可以使用这些函数,而不是编写更通用的表单并在每次调用时设置固定的参数。</p>
<p>咖喱的替代品是:<code>partial</code>,<code>lambda</code>和<code>default parameters</code>。因此,在实践中,咖喱可能是有用的,但你也可以绕过它,如果你想。</p>
<p>另见<a href="http://mtomassoli.wordpress.com/2012/03/18/currying-in-python/" rel="nofollow noreferrer">Currying in Python</a></p>