<p>在python中,Everything是一个对象,可以传递,包括函数<code>func</code>可以是任何可调用的,包括lambda、函数、方法和类具有<code>__call__</code>方法的任意对象</p>
<p>以下是这些选项的一些示例:</p>
<ol>
<li><p>A<code>lambda</code>是一个非常容易定义的特殊单表达式函数。它很方便,因为您可以匿名内联使用它:</p>
<pre><code> accumulate([0, 7, 19, 13], lambda a, b: b - a)
</code></pre>
<p>因为一切都是一个对象,所以lambda不必是匿名的:</p>
<pre><code> func = lambda a, b: b - a
accumulate([0, 7, 19, 13], func)
</code></pre>
</li>
<li><p>函数可能是最普遍的可调用函数。使用<code>def</code>语句生成函数:</p>
<pre><code> def func(a, b):
return b - a
accumulate([0, 7, 19, 13], func)
</code></pre>
<p>注意,当您将它分配给一个名称时,它看起来非常像<code>lambda</code>。lambda和返回单个表达式的函数在大多数方面的行为几乎完全相同</p>
<p>您也可以使用内置功能:</p>
<pre><code> accumulate([0, 7, 19, 13], operator.rsub)
</code></pre>
<p>甚至大多数类方法也作为函数存在于类对象中。如果您有一个统一的列表,例如,所有<code>int</code>,您可以利用这一点:</p>
<pre><code> accumulate([0, 7, 19, 13], int.__rsub__)
</code></pre>
<p>这是因为<code>int.__rsub__</code>是一个接受两个参数的函数,它位于类<code>int</code>中。当您执行<code>(3).__rsub__(4)</code>时,您将该函数绑定到一个实例,从而将其转换为只包含一个显式参数的方法</p>
</li>
<li><p>更深奥的可调用类型是具有<code>__call__</code>方法的类的实例:</p>
<pre><code> class Subtractor:
def __call__(self, a, b):
return b - a
accumulate([0, 7, 19, 13], Subtractor())
</code></pre>
<p>注意<code>Subtractor()</code>中的括号。它们创建一个新实例,该实例是可调用的,因为类定义了<code>__call__</code></p>
</li>
<li><p>类函数对象的一种特殊情况是<code>staticmethod</code>和<code>classmethod</code>对象。它们不是严格意义上的函数,而是将函数对象包装在类中。如果您有实用程序类,<code>@staticmethod</code>装饰器可以应用于不依赖于类或实例状态的函数:</p>
<pre><code> class Subtractor:
@staticmethod
def func1(a, b):
return b - a
@classmethod
def func2(cls, a, b):
return b - a
accumulate([0, 7, 19, 13], Subtractor.func1)
accumulate([0, 7, 19, 13], Subtractor().func2)
</code></pre>
<p><code>func1</code>的行为类似于正常函数。事实上,它根本不会绑定到实例:您还可以执行<code>accumulate([0, 7, 19, 13], Subtractor().func1)</code>^但是,{<cd18>}必须绑定到类而不是实例。您也可以调用<code>accumulate([0, 7, 19, 13], Subtractor.func2)</code></p>
</li>
</ol>