随机调用要执行的函数

Ker*_*tto 0 python random python-2.x

我做了这个简短的问卷调查:

from random import randint

def pancakes():
    q = raw_input("Do you like pancakes?")
    if q == "yes":
        print("Great!")
    elif q == "no":
        print("Hmmm...")

def french_toast():
    q = raw_input("Do you like french toast?")
    if q == "yes":
        print("Oh!")
    elif q == "no":
        print("Same here!")

def random():
    num = 2
    while num > 0:
        random = randint(1, 2)
        if random == 1:
            num = num -1
            pancakes()
         elif random == 2:
             num = num -1
             french_toast()

random()
Run Code Online (Sandbox Code Playgroud)

我的目标是以随机顺序提出问题.但有时同样的问题会被问到两次,因为它是随机选择的.

那么我怎么能让它只问一次相同的问题呢?

Jim*_*ard 8

而不是while循环,我建议你for结合使用循环random.sample.事先创建一个函数列表以提供给sample:

from random import sample

funcs = [french_toast, pancakes]
for func in sample(funcs, len(funcs)):
    func()
Run Code Online (Sandbox Code Playgroud)

现在,这将遍历所有函数,在每次迭代中随机选择一个函数.

或者,您可以shuffle使用列表(就地执行)random.shuffle然后遍历它,这也会更快(尽管速度不应该是这里最大的关注点):

from random import shuffle

funcs = [french_toast, pancakes]
shuffle(funcs)
for func in funcs:
    func()
Run Code Online (Sandbox Code Playgroud)

如果需要,将它们放在一个函数中:

from random import shuffle

# use *funcs for passing arbitrary number of 
# functions as positional arguments.
def call_funcs_randomly(funcs):
    shuffle(funcs)
    for func in funcs:
        func()
Run Code Online (Sandbox Code Playgroud)

并打电话给他们:

call_funcs_randomly([french_toast, pancakes])
Run Code Online (Sandbox Code Playgroud)

正如注释所指出的那样,不要将其random用作函数名称,它有可能屏蔽模块random导致奇怪的错误.