python中的动态函数

时间:2012-11-16 10:48:06

标签: python

  

可能重复:
  Local variables in Python nested functions

这是我的问题,我需要在python中动态创建函数。我在参数中有一个列表,我需要为这个列表的每个元素创建一个函数。

以下是一个例子:

list_func = []
list_param = ['foo','bar']

for param in list_param:
    def print_func():
        print(param)

    list_func += [print_func]

for func in list_func:
    func()

使用此代码,第二个循环将只打印最后一个参数。 这是输出:

bar
bar

我需要

foo
bar

由于

4 个答案:

答案 0 :(得分:2)

请使用functools.partial

>>> import functools
>>> def print_func(param):
...     print(param)
...     
>>> list_func = [functools.partial(print_func, x) for x in ["foo", "bar"]]
>>> list_func[0]()
foo
>>> list_func[1]()
bar

或者,您可以定义可调用类:

class Printer(object):
    def __init__(self, param):
        self.param = param

    def __call__(self):
        print(self.param)

然后list_func = [Printer(x) for x in ["foo", "bar"]]。当函数变得复杂时,这可能是一个好主意。

答案 1 :(得分:1)

您可以使用lambda

In [87]: list_func = []

In [88]: list_param = ['foo','bar']

In [89]: for param in list_param:
    list_func.append(lambda i=param:i)
   ....:     


In [91]: list_func[0]()
Out[91]: 'foo'

In [92]: list_func[1]()
Out[92]: 'bar'

答案 2 :(得分:1)

我刚刚修改了你的代码:

list_func = []
list_param = ['foo','bar']

def make_print_func(param):
    def print_func():
        print(param)
    return print_func

list_func += [make_print_func(param) for param in list_param]

for func in list_func:
    func()

现在有一个函数make_print_func可以生成动态所需的函数。

输出是这样的:

foo
bar

答案 3 :(得分:1)

list_func = []
list_param = ['foo', 'bar']

for param in list_param:
    def print_func(arg=param): #Look at this string
        print(arg)

    list_func.append(print_func)

for func in list_func:
    func()