jos*_*ics 2 python lambda closures function
考虑line如下定义的 Python 函数:
def line(m, b):
def inner_function(x):
return m * x + b
return inner_function
Run Code Online (Sandbox Code Playgroud)
这个函数有一个属性,对于任何浮点数m和b,对象line(m, b)是一个 Python 函数,当line(m, b)在浮点数上调用时x,它返回一个浮点数line(m, b)(x)。浮点数line(m, b)(x)可以解释为在点 处具有斜率m和 y 轴截距的线b的值x。这是编写“依赖参数”m和b.
line上述相同的函数?这称为闭包,它是编写闭包的一种完全合理的方式,也是最有效的方法之一(无论如何在 CPython 参考解释器中)。
我所知道的唯一其他常见模式是等效于 C++ 的函子,其中一个类将状态作为属性,并将附加参数传递给__call__,例如以匹配您的情况:
class Line:
def __init__(self, m, b):
self.m = m
self.b = b
def __call__(self, x):
return self.m * x + self.b
Run Code Online (Sandbox Code Playgroud)
它的使用方式相同,要么创建/存储实例并重用它,要么在您的示例中创建它,使用一次,然后将其丢弃 ( Line(m, b)(x))。函子虽然比闭包慢(因为属性访问比从嵌套范围读取更昂贵,至少在 CPython 参考解释器中),而且如您所见,它们也更冗长,所以我通常建议使用闭包除非您的需求需要类实例的更大灵活性/功能。