0

我有一些我想通过字典调用但传递固定值的函数。

def doSum(a,b):
        print a+b
def doProd(a,b):
        print a*b

如果我通过输入传递

d = {'sum': doSum,'prod':doProd}
d['prod'](2,4)

它工作正常并打印 8。

但是如果我尝试类似的东西

d = {'sum': doSum(2,4),'prod':doProd(2,4)}
d['prod']

它打印 6 和 8。如何更改代码,以便它只运行我使用 dict 中具有固定参数的键指定的函数?

4

3 回答 3

3

用于functools.partial()存储要传入的具有默认值的函数。

您仍然需要调用该函数:

from functools import partial
d = {'sum': partial(doSum, 2, 4),'prod': partial(doProd, 2, 4)}
d['sum']()

一个partial对象,当被调用时,将转身调用被包装的函数,传入你已经用 存储的参数partial,以及你传入的任何其他参数:

>>> addtwo = partial(doSum, 2)
>>> addtwo(6)
8
>>> addtwo(4)
6

最后但同样重要的是,看看operator模块;该模块已经为您包含一个doSumdoProd功能:

>>> import operator
>>> operator.add(2, 4)
6
>>> operator.mul(2, 4)
8

这些函数返回结果而不是打印值。在上面的示例中,是 python 交互式解释器代替打印。

于 2013-07-19T10:31:37.973 回答
3

作为 Martijn 的 anwser 的“老派”替代品,您还可以使用 lambda 函数:

d = {
    "sum": lambda: doSum(2, 4),
    "prod": lambda: doProd(2, 4),
    }
d["sum"]()
于 2013-07-19T10:53:03.167 回答
1

6 和 8 的打印实际上是在创建字典时完成的:

>>> d = {'sum': doSum(2,4),'prod':doProd(2,4)}
6
8

因为此时函数正在执行。然后调用d['prod']just 什么都不做,因为这里的值是None(因为函数doProd没有返回任何东西)。

如果您打印字典,您将拥有:

>>> print d
{'sum': None, 'prod': None}
于 2013-07-19T10:37:51.603 回答