8

有没有办法随机选择一个函数?

例子:

from random import choice

def foo():
    ...
def foobar():
    ...
def fudge():
    ...

random_function_selector = [foo(), foobar(), fudge()]

print(choice(random_function_selector))

上面的代码似乎执行了所有 3 个函数,而不仅仅是随机选择的一个。这样做的正确方法是什么?

4

5 回答 5

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

print choice(random_function_selector)()

Python 函数是一等对象:您可以通过名称引用它们而不调用它们,然后再调用它们。

在您的原始代码中,您调用了所有三个,然后在结果中随机选择。这里我们随机选择一个函数,然后调用它。

于 2013-01-04T03:12:57.210 回答
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()
于 2013-01-04T03:13:09.520 回答
4

几乎 - 试试这个:

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

print(choice(random_function_selector)())

这会将函数本身分配到random_function_selector列表中,而不是调用这些函数的结果。然后你得到一个随机函数choice,并调用它。

于 2013-01-04T03:13:49.207 回答
0
  1. 生成一个随机整数,最多可以有多少个元素
  2. 根据这个数字调用一个函数

随机导入

choice = random.randomint(0,3)
if choice == 0:
  foo()
elif choice == 1:
  foobar()
else:
  fudge()
于 2013-01-04T03:12:13.540 回答
-1

一种直截了当的方法:

# 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()
于 2013-01-04T03:14:39.130 回答