2012-11-16 65 views
0

可能重複:
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 

感謝

+6

閱讀蟒蛇大約後期綁定。 – rantanplan

+1

我並不完全確定你試圖適應什麼。但是,你會不會更好地使用類? –

回答

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"]]。當你的函數變得複雜時,這可能是一個好主意。

+0

感謝您的幫助,我認爲可召集班是我的問題的最乾淨的解決方案。我無法使用functool,因爲我的print_func不能有參數。 – IxDay

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' 
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 
+0

謝謝你的回覆,這正是我需要的,但是larsmans的可調用類也許有點乾淨。 – IxDay

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()