2016-10-10 92 views
-1

我知道如何運行沒有參數的函數。在這種情況下,我想運行具有隨機順序參數的函數嗎?Python 3:如何用隨機順序的參數運行函數?

它顯示的結果,但不是隨機的,有一些錯誤:請幫我糾正我的代碼。謝謝:)

import random 
def hi(name): 
    print('a ' + name) 

def howold(old, name): 
    print(name + 'is ' + old + "years old") 

def howmuch(money): 
    print(money + ' dollars') 


functions = [hi('John'),howold('20', 'John'),howmuch('50')] 
random.shuffle(functions) 
for i in functions: 
    i() 
+3

你的函數直接調用該行'功能= [喜( '約翰'),howold('20 ','John'),多少('50')]。因此他們打印一條消息並返回None。你的列表是[None,None,None],然後嘗試調用None(),這不起作用。 –

+1

@ S.deMelo好的。出於某種原因,我沒有注意到被調用的方法。它最初看起來像函數正在與字符串進行比較。 – idjaw

+0

@ S.deMelo作爲回答發佈郵件 – idjaw

回答

1

當該行執行:

functions = [hi('John'),howold('20', 'John'),howmuch('50')] 

Python會在調用你的3個功能hi()howold()然後howmuch()訂單,然後將其結果存儲在名爲functions的列表中。所以所有的print()都會在這一點上運行。正如你所說,這就是爲什麼「它顯示的結果,但不是隨機的」。由於您的所有功能都不會返回任何內容,因此您的functions將等於[None, None, None]

然後將以下代碼:

random.shuffle(functions) 
for i in functions: 
    i() 

將嘗試執行無()。這會產生一個錯誤,正如你所說的「有一些錯誤」:這個錯誤是TypeError: 'NoneType' object is not callable

如何解決:例如使用functools.partial()

from functools import partial 
functions = [partial(hi, 'John'), partial(howold, '20', 'John'), partial(howmuch, '50')] 
random.shuffle(functions) 
for i in functions: 
    i() 

官方文檔在這裏:https://docs.python.org/2/library/functools.html#functools.partial

-1

在你的循環,我是一個函數,而不是一個字符串,因此比較字符串不會工作,你在其他結束。而是使用if i.__name__ == 'hi

3

嘗試類似的東西:

functions = [(hi, ['John']), (howold, ['20', 'John']), (howmuch, ['50'])] 

random.shuffle(functions) 
for func, args in functions: 
    func(*args) 
2

functions列表包含在循環已經評價函數的結果,而不是一個部分應用的不帶參數的函數(這樣就可以用i()給他們打電話) 。

您可以使用lambda表達式產生不帶參數的這樣的新功能:

functions = [lambda: hi('John'), 
      lambda: howold('20', 'John'), 
      lambda: howmuch('50')] 
random.shuffle(functions) 

for f in functions: 
    f()