有没有比这更好的方法来编写“依赖参数”的 Python 函数?

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)

这个函数有一个属性,对于任何浮点数mb,对象line(m, b)是一个 Python 函数,当line(m, b)在浮点数上调用时x,它返回一个浮点数line(m, b)(x)。浮点数line(m, b)(x)可以解释为在点 处具有斜率m和 y 轴截距的线b的值x。这是编写“依赖参数”mb.

  1. 这种编写依赖于某些参数的 Python 函数的方法是否有特殊名称?
  2. 是否有更 Pythonic 和/或计算效率更高的方法来编写与line上述相同的函数?

Sha*_*ger 6

这称为闭包,它是编写闭包的一种完全合理的方式,也是最有效的方法之一(无论如何在 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 参考解释器中),而且如您所见,它们也更冗长,所以我通常建议使用闭包除非您的需求需要类实例的更大灵活性/功能。