Как я могу печатать одну (другую) часть списка каждый раз, когда выполняется условный оператор?

#python #list #python-2.7 #loops

#python #Список #python-2.7 #циклы

Вопрос:

Итак, у меня есть функция, которая в основном предлагает пользователю найти определенное предопределенное число (76 / семьдесят шесть). Каждый раз, когда делается неверное предположение, им выдается подсказка, за которой следует возможность угадать снова. Я хочу иметь возможность давать им разные подсказки из моего списка для каждого неправильного предположения. Это также сложно, потому что у меня должно быть определенное количество подсказок, поэтому после того, как список исчерпан, пользователю должно быть предложено просто угадать снова без указаний. Я еще не придумал свои подсказки, но вот код:

 hint_list = ['filler_1','filler_2', 'filler_3', 'filler_4', 'filler_5']

def try_and_respond():
    guess = raw_input('Guess: ')
    if guess.isdigit():
        guess = int(guess)
        correct = guess == 76
    else:
        correct = guess.lower() == 'seventy-six'
    if correct:
        print 'n33[1;36;40m Fantastic! 76 is correct.'
    elif not correct:
        print 'n33[1;31;40mIncorrect. Here is a hint: 33[1;30;47m'
        print hint_list[0]
        try_and_respond()
 

Комментарии:

1. Должно ли это быть случайным? Или просто повторите цикл, начиная с самого начала, в том же порядке?

2. @orlp Тот же порядок

3. Есть ли ни один из двух ответов, которые удовлетворяют? Если ни один из них не удовлетворяет, пожалуйста, прокомментируйте, чтобы вы могли получить лучшие ответы. Если у вас есть удовлетворительные ответы, пожалуйста, проголосуйте / примите. Если слишком много пользователей с низкой репутацией не принимают ответы, то существует риск того, что все больше и больше людей не будут помогать пользователям с низкой репутацией, что было бы очень жаль

Ответ №1:

Ведите счетчик, чтобы решить, какую подсказку показывать следующей.

Если вы хотите иметь подсказки в случайном порядке, используйте random.shuffle()

 # import random  # uncomment if random hint order
hint_list = ['filler_1','filler_2', 'filler_3', 'filler_4', 'filler_5']

# uncomment next line for random hint order
# random.shuffle(hint_list)

incorrect_count = 0
def try_and_respond():
    global incorrect_count
    guess = raw_input('Guess: ')
    if guess.isdigit():
        guess = int(guess)
        correct = guess == 76
    else:
        correct = guess.lower() == 'seventy-six'
    if correct:
        print 'n33[1;36;40m Fantastic! 76 is correct.'
    else:
        if incorrect_count < len(hint_list):
            print 'n33[1;31;40mIncorrect. Here is a hint: 33[1;30;47m'
            print hint_list[incorrect_count]
            incorrect_count  = 1
        try_and_respond()

try_and_respond()
 

И вот модифицированная версия без рекурсии, но вместо этого явный цикл и некоторый код, чтобы сделать код совместимым с python3, но пусть он все равно выполняется с python2

 # import random  # uncomment if random hint order
import sys

# It's 2020, So I suggest to
# make the code also python 3 compatible.
if sys.version_info[0] < 3:
    input = raw_input

hint_list = ['filler_1','filler_2', 'filler_3', 'filler_4', 'filler_5']

# uncomment next line for random hint order
# random.shuffle(hint_list)

incorrect_count = 0
def try_and_respond():
    global incorrect_count
    guess = input('Guess: ')
    if guess.isdigit():
        guess = int(guess)
        correct = guess == 76
    else:
        correct = guess.lower() == 'seventy-six'
    if correct:
        print('n33[1;36;40m Fantastic! 76 is correct.')
    else:
        if incorrect_count < len(hint_list):
            print('n33[1;31;40mIncorrect. Here is a hint: 33[1;30;47m')
            print(hint_list[incorrect_count])
            incorrect_count  = 1
    return correct

while not try_and_respond():
    try_and_respond()

 

Комментарии:

1. пожалуйста, обратите внимание, что ваш код «немного странный» Idt не использует цикл, но рекурсию для запроса дальнейших времен В моем ответе я просто указал путь списка подсказок и не трогал остальную часть кода. Я мог бы отредактировать свой ответ позже, чтобы добавить измененную версию вашего скрипта, которую я считаю более распространенной

2. просто заменено: print hint_list[0] на print hint_list[incorrect_count] мой плохой

3. Просто прочитайте свой ответ на @orlp, если вы не хотите случайного порядка и перестанете давать подсказки, тогда просто удалите import random и random.shuffle(hint_list) из моего ответа

Ответ №2:

Для циклического изменения набора значений часто легко использовать оператор modulo % .

Попробуйте выполнить следующее:

 hint_idx = 0
while True:
    print(hints[hint_idx])
    hint_idx = (hint_idx   1) % len(hints)
 

Комментарии:

1. Я думаю, что OP попросил показать каждую подсказку, а затем прекратить давать подсказки. Тем не менее, неплохо показать оператор по модулю. Другие люди, читающие этот вопрос, возможно, захотят перебрать.