随机调用要执行的函数

时间:2017-01-09 08:01:57

标签: 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()

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

那么如何让它只问一次相同的问题呢?

3 个答案:

答案 0 :(得分:8)

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

from random import sample

funcs = [french_toast, pancakes]
for func in sample(funcs, len(funcs)):
    func()

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

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

from random import shuffle

funcs = [french_toast, pancakes]
shuffle(funcs)
for func in funcs:
    func()

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

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()

并打电话给他们:

call_funcs_randomly([french_toast, pancakes])

如注释所述,请勿使用random作为函数名称,它可能会屏蔽模块random,导致奇怪的错误。

答案 1 :(得分:3)

我会使用random.sample Link。只需为您的问题创建一个索引列表,然后对其中的两个进行抽样。

编辑:

另外,您可以使用random.shuffle Link

random.shuffle(questions)
for question in questions:
    # process your random question once 

答案 2 :(得分:1)

你的上一个问题怎么样(random不是一个好名字!你可能会覆盖同名的模块[尽管你现在的方式很好])

def random_questions():
    eligible_questions = [pancakes, french_toast]
    while eligible_questions:
        question = random.choice(eligible_questions)
        eligible_questions.remove(question)
        question()

将问题放在列表中,选择一个random.choice,将其从列表中删除并执行。如果问题列表为空,请停止。这样每个问题都只选择一次。

如果您想添加更多问题,可以轻松扩展。

第二个想法:Jim Fasarakis-Hilliard's answer中的shuffle版本更清洁了!

相关问题