python - 有没有比这更好的方法来编写“依赖参数”的 Python 函数?
问题描述
line
考虑如下定义的 Python 函数:
def line(m, b):
def inner_function(x):
return m * x + b
return inner_function
此函数具有对于任何 floatm
和的属性b
,该对象line(m, b)
是 Python 函数,当line(m, b)
在 float 上调用时x
,它返回一个 float line(m, b)(x)
。浮点数line(m, b)(x)
可以解释为在点 具有斜率m
和 y 截距的线b
的值x
。这是编写“取决于参数”的 Python 函数的一种方法,m
并且b
.
- 这种编写依赖于某些参数的 Python 函数的方法是否有特殊名称?
- 是否有更 Pythonic 和/或计算效率更高的方法来编写与上述功能相同的函数
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
它的使用方式相同,要么创建/存储实例并重用它,要么如您的示例中那样,创建它,使用它一次,然后将其丢弃(Line(m, b)(x)
)。函子虽然比闭包慢(因为属性访问比从嵌套范围读取更昂贵,至少在 CPython 参考解释器中),而且如您所见,它们也更冗长,所以我通常推荐闭包除非您的需求需要类实例更大的灵活性/功能。
推荐阅读
- groovy - Compilation fails for Repast ReLogo code in groovy
- javascript - How can I pass data to a component without props in React?
- php - Doctrine Inheritance: Discriminator from Entity attribute and not table column?
- ios - 如何指定要打开的模拟器
- java - spring field service 需要一个 bean 类型
- wordpress - 无法在 Google Cloud Compute Engine 上获得 SSL 配置
- javascript - Javascript interferring with GTM
- javascript - '修复所有可自动修复的问题'并没有解决尽可能多的问题 vscode-eslint
- vuejs2 - 无法让 .vue 单文件组件与 NWjs 一起使用
- python - 使用气流蜂巢运算符并输出到文本文件