2017-01-09 5 views
0

Я сделал эту небольшую анкету:Случайным вызов функций для выполнения

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

BTW, это не очень хорошая идея, чтобы дать вашим переменным то же имя, что и стандартный модуль, особенно тот, который использует ваш скрипт. Это ничего не повредит в этом скрипте, но это немного запутанно для всех, кто читает ваш код. –

ответ

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, приводящий к нечетным искажениям.

+0

Вы действительно предлагаете те же вещи, что и я, одновременно.его действительно смешно :-) – BloodyD

+0

Даже если это не должно быть большой проблемой, теперь это разрешено вашим ответом :) –

+0

да, но мне было смешно, как два разных человека одновременно думают об одних и тех же вещах. – BloodyD

3

я бы использовал random.sampleLink. Просто создайте список индексов на свои вопросы и попробуйте 2 из них.

EDIT:

кроме того, вы можете использовать random.shuffleLink:

random.shuffle(questions) 
for question in questions: 
    # process your random question once 
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, удалите его из списка и выполните его. если список вопросов пуст. таким образом, каждый вопрос выбирается ровно один раз.

Это легко расширить, если вы хотите добавить еще вопросы.

с другой мыслью: shuffle версия в Jim Fasarakis-Hilliard's answer много чище!