假设我有一个函数
def multiply_by(x, multiplier):
return x * multiplier如何创建该函数的副本并修复该函数中的乘数?
multiply_by_5 = multiply_by? <-- here I need python magic这样的话,multiply_by_5只有一个参数x,乘数是5?所以
multiply_by_5(2)
10在Python2.7中有什么方法可以做到这一点吗?
发布于 2016-08-05 12:12:14
您可以在关键字参数中使用functools.partial:
>>> def multiply_by(x, multiplier):
... return x * multiplier
...
>>> from functools import partial
>>> multiply_by_5 = partial(multiply_by, multiplier=5)
>>> multiply_by_5(2)
10发布于 2016-08-05 12:19:23
正如@niemmi的回答所建议的那样,functools.partial可能是最好的选择。
但是,也可以使用咖喱函数完成类似的工作:
def multiply_by(multiplier):
def multiply(x):
return multiplier * x
return multiply
>>> multiply_by_5 = multiply_by(5) # no magic
>>> multiply_by_5(2)
10或者使用lambda语法:
def multiply_by(multiplier):
return lambda x: multiplier * x请注意,partial更简洁、更高效,并且以标准方式更直接地表达您的意图。上面的技术是称为闭包的概念的一个例子,这意味着在内部作用域中定义的函数可能引用在包围作用域中定义的变量,并“关闭”它们,记住它们,甚至变异它们。
由于这一技术更为通用,您的代码读者可能需要更多的时间来理解代码中的确切含义,因为您的代码可能是任意复杂的。
专门用于乘法(和其他运算符)的partial可以与operator.mul相结合。
>>> import functools, operator
>>> multiply_by_5 = functools.partial(operator.mul, 5)
>>> multiply_by_5(2)
10发布于 2016-08-05 12:29:07
这里有一个不使用functools.partial的替代方案。相反,我们在函数中定义了一个函数。内部函数“记住”它所需要的外部函数的任何局部变量(包括外部函数的参数)。实现这一目标的魔力叫做闭锁。
def multiply_factory(multiplier):
def fixed_multiply(x):
return x * multiplier
return fixed_multiply
multiply_by_3 = multiply_factory(3)
multiply_by_5 = multiply_factory(5)
for i in range(5):
print(i, multiply_by_3(i), multiply_by_5(i))输出
0 0 0
1 3 5
2 6 10
3 9 15
4 12 20如果需要,可以在闭包中使用现有的multiply_by函数,但由于额外函数调用的开销,效率略低。例:
def multiply_factory(multiplier):
def fixed_multiply(x):
return multiply_by(x, multiplier)
return fixed_multiply可以使用lambda语法更简洁地编写:
def multiply_factory(multiplier):
return lambda x: multiply_by(x, multiplier)https://stackoverflow.com/questions/38788869
复制相似问题