0

重複の可能性:
Python のネストされた関数のローカル変数

これが私の問題です。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()

このコードでは、2 番目のループで最後のパラメーターが出力されます。出力は次のとおりです。

bar
bar

私は欲しい

foo
bar

ありがとう

4

4 に答える 4

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"]]。関数が複雑になった場合、これは良い考えかもしれません。

于 2012-11-16T10:51:03.363 に答える
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'
于 2012-11-16T10:55:53.320 に答える
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
于 2012-11-16T10:58:58.950 に答える
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()
于 2012-11-16T11:00:37.573 に答える