2013-01-04 133 views
3

你好同胞堆棧溢出用戶。我想知道是否有方法隨機選擇一個函數?隨機選擇函數

例如:

from random import choice 
random_function_selector = [foo(), foobar(), fudge()] 

print choice(random_function_selector) 

def foo() : 
    # some code follows. 

我一直在想約20分鐘,怎麼可以這樣做,我甚至通過Python文檔檢查。實際上,自寫這篇文章以來,我似乎已經有了一種頓悟......而不是使用可變的列表,也許我應該使用不可變類型,如元組。

注意:很抱歉,如果這可能是一個noob問題,但我沒有編程那麼久。

回答

12
from random import choice 
random_function_selector = [foo, foobar, fudge] 

print choice(random_function_selector)() 

Python函數是第一代的功能類對象:您可以通過名稱引用它們而不用調用它們,然後再調用它們。

在您的原始代碼中,您正在調用所有三個代碼,然後在結果中隨機選擇。這裏我們隨機選擇一個函數,然後調用它。

+1

是啊!我並沒有想過給他們打電話,我想python在我嘗試訪問foo而不是foo()時並不知道我的意思。感謝讓事情看起來更清晰:)。 – S3pHiRoTh

0
  1. 生成一個隨機整數取決於你有多少元素具有
  2. 呼叫根據這個數字

進口隨機

choice = random.randomint(0,3) 
if choice == 0: 
    foo() 
elif choice == 1: 
    foobar() 
else: 
    fudge() 
6
from random import choice 

#Step 1: define some functions 
def foo(): 
    pass 

def bar(): 
    pass 

def baz(): 
    pass 

#Step 2: pack your functions into a list. 
# **DO NOT CALL THEM HERE**, if you call them here, 
#(as you have in your example) you'll be randomly 
#selecting from the *return values* of the functions 
funcs = [foo,bar,baz] 

#Step 3: choose one at random (and call it) 
random_func = choice(funcs) 
random_func() #<-- call your random function 

#Step 4: ... The hypothetical function name should be clear enough ;-) 
smile(reason=your_task_is_completed) 

只是爲了好玩:

請注意,如果你真的想之前定義的功能選擇列表,你實際上定義的功能,你可以做到這一點間接的附加層(雖然我不推薦它 - 沒有優勢,做這種方式,據我可以看到... ...):

def my_picker(): 
    return choice([foo,bar,baz]) 

def foo(): 
    pass 

def bar(): 
    pass 

def baz(): 
    pass 

random_function = my_picker() 
result_of_random_function = random_function() 
2

幾乎 - 試試這個來代替:

from random import choice 
random_function_selector = [foo, foobar, fudge] 

print(choice(random_function_selector)()) 

此分配函數本身進入random_function_selector列表,而不是調用這些函數的結果。然後用choice得到一個隨機函數,然後調用它。

0

一個簡單的方法:

# generate a random int between 0 and your number of functions - 1 
x = random.choice(range(num_functions)) 
if (x < 1): 
    function1() 
elif (x < 2): 
    function2() 
# etc 
elif (x < number of functions): 
    function_num_of_functions() 
+1

雖然我沒有倒下,但不難看出爲什麼 - 比起Ned的迴應,你的代碼非常冗長而且沒有Pythonic。 – Peter

+0

哈哈耶蟒蛇人(我不是)對「Pythonic」非常防守,這是完全公平和正確的。想象一下,對於一個來自非python範式的人來說,這個策略很容易理解。奈德的當然非常理想的答案。 – mfrankli

+1

'random.randint(...)'可能比'random.choice(range(...))'更容易理解......至少...... – mgilson