2013-01-04 130 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