2013-07-19 31 views
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.如何更改代码,使其只能运行我使用固定参数在键中指定的函数字典?

+0

那是不完全的结果你想要吗? – YXD

回答

3

作为一个“老派”替代的Martijn的anwser你也可以使用lambda函数:

d = { 
    "sum": lambda: doSum(2, 4), 
    "prod": lambda: doProd(2, 4), 
    } 
d["sum"]() 
+0

谢谢,我喜欢那种老派的方法。如果我可以避免,不要导入模块 – chrise

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 module;该模块已包含doSumdoProd功能为您提供:

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

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

+0

谢谢fr指出那个模块。从来没有听说过它。 – chrise

1

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

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

因为这些功能在这个时刻执行。然后拨打d['prod']只是没有做什么,因为这里的值是None(因为功能doProd没有返回任何东西)。

如果打印的字典,你将有:

>>> print d 
{'sum': None, 'prod': None}