首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建一个函数的副本,其中一些vars是固定的

创建一个函数的副本,其中一些vars是固定的
EN

Stack Overflow用户
提问于 2016-08-05 12:06:29
回答 4查看 67关注 0票数 2

假设我有一个函数

代码语言:javascript
复制
def multiply_by(x, multiplier):
    return x * multiplier

如何创建该函数的副本并修复该函数中的乘数?

代码语言:javascript
复制
multiply_by_5 = multiply_by?    <-- here I need python magic

这样的话,multiply_by_5只有一个参数x,乘数是5?所以

代码语言:javascript
复制
multiply_by_5(2)
10

在Python2.7中有什么方法可以做到这一点吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-08-05 12:12:14

您可以在关键字参数中使用functools.partial

代码语言:javascript
复制
>>> 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
票数 3
EN

Stack Overflow用户

发布于 2016-08-05 12:19:23

正如@niemmi的回答所建议的那样,functools.partial可能是最好的选择。

但是,也可以使用咖喱函数完成类似的工作:

代码语言:javascript
复制
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语法:

代码语言:javascript
复制
def multiply_by(multiplier):
    return lambda x: multiplier * x

请注意,partial更简洁、更高效,并且以标准方式更直接地表达您的意图。上面的技术是称为闭包的概念的一个例子,这意味着在内部作用域中定义的函数可能引用在包围作用域中定义的变量,并“关闭”它们,记住它们,甚至变异它们。

由于这一技术更为通用,您的代码读者可能需要更多的时间来理解代码中的确切含义,因为您的代码可能是任意复杂的。

专门用于乘法(和其他运算符)的partial可以与operator.mul相结合。

代码语言:javascript
复制
>>> import functools, operator
>>> multiply_by_5 = functools.partial(operator.mul, 5)
>>> multiply_by_5(2)
10
票数 2
EN

Stack Overflow用户

发布于 2016-08-05 12:29:07

这里有一个不使用functools.partial的替代方案。相反,我们在函数中定义了一个函数。内部函数“记住”它所需要的外部函数的任何局部变量(包括外部函数的参数)。实现这一目标的魔力叫做闭锁

代码语言:javascript
复制
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))

输出

代码语言:javascript
复制
0 0 0
1 3 5
2 6 10
3 9 15
4 12 20

如果需要,可以在闭包中使用现有的multiply_by函数,但由于额外函数调用的开销,效率略低。例:

代码语言:javascript
复制
def multiply_factory(multiplier):
    def fixed_multiply(x):
        return multiply_by(x, multiplier)
    return fixed_multiply

可以使用lambda语法更简洁地编写:

代码语言:javascript
复制
def multiply_factory(multiplier):
    return lambda x: multiply_by(x, multiplier)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38788869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档