Python. Счетчик цикла while

Обучаюсь кодингу на Python, решил написать небольшую игру по отгадыванию случайного числа:

print("Здравствуйте! Мы предлагаем поиграть в отгадывание числа." \
      "\nПрограмма загадает случайное число от 1 до 100." \
      "\nПопробуйте отгадать число за наименьшее число попыток," \
      "\nа мы будем подсказывать, больше или меньше предложенное Вами число.")
number = 5
guess = int(input("\nВаша догадка: "))
tries = 1
while guess != number:
    tries += 1
    if guess > number:
        guess = int(input("Ваше число больше загаданного, попробуйте ещё раз: "))
    if guess < number:
        guess = int(input("Ваше число меньше загаданного, попробуйте ещё раз: "))
print("Поздравляем! Вы отгадали число с", tries, "попытки.")

В целом код отлично работает, но счетчик попыток часто дает сбой. Экспериментальным путем с использованием заранее известного числа, например, number = 5, выяснилось, что счетчик начинает работать некорректно при определенной последовательности вводимых чисел больше или меньше.

То есть, если 5 раз подряд ответить неверно guess = 4, например, и на 6 раз ответить правильно, счетчик будет работать как надо. Так же будет и если 5 раз подряд ответить неверно guess = 6, счетчик будет работать верно.

Но при различных комбинациях больше и меньше счетчик выдает число меньше на 1 действительного числа попыток.

Эта ошибка исправляется дублированием tries += 1 в оба if:

while guess != number:
    if guess > number:
        guess = int(input("Ваше число больше загаданного, попробуйте ещё раз: "))
        tries += 1
    if guess < number:
        guess = int(input("Ваше число меньше загаданного, попробуйте ещё раз: "))
        tries += 1

Но эта логическая ошибка не дает мне покоя. Буду очень благодарен объяснению, если оно Вам известно.


Ответы (2 шт):

Автор решения: Arseni Mourzenko

Представим, что после выполнения строки:

guess = int(input("\nВаша догадка: "))

guess равняется девяти. При первой итерации:

tries += 1

прибавит единицу к счётчику, и попросит ввести новое значение. Предположим, что вы ввели четыре.

if guess < number

будет True, следовательно программа попросит ввести новое значение, выполняя следующую строку:

guess = int(input("Ваше число меньше загаданного, попробуйте ещё раз: "))

При этом, счётчик остался без изменений.

→ Ссылка
Автор решения: Dezmonder

Дело в том, что у вас проверяются оба условия. Грубо говоря, после того как проверяется if guess > number:, пользователь вводит новое число, и потом сразу (итерация цикла не заканчивается при этом), идёт вторая проверка if guess < number:.

Варианты решения вашей проблемы:

  1. Самый верный:
while guess != number:
    tries += 1
    if guess > number:
        guess = int(input("Ваше число больше загаданного, попробуйте ещё раз: "))

    elif guess < number:  # можно даже просто else, так как на равенство вы проверяете выше
        guess = int(input("Ваше число меньше загаданного, попробуйте ещё раз: "))

Тут используется конструкция if elif. Если выполняется одно из условий, то условия дальше не проверяются.

2.

    if guess > number:
        guess = int(input("Ваше число больше загаданного, попробуйте ещё раз: "))
        continue
    if guess < number:
        guess = int(input("Ваше число меньше загаданного, попробуйте ещё раз: "))
        continue

Тут используется continue, который заканчивает выполнение итерации не прерывая сам цикл.

3.

    if guess > number:
        st = 'больше'
    if guess < number:
        st = 'меньше'

    guess = int(input("Ваше число " + st + " загаданного, попробуйте ещё раз: "))

Тут мы сначала проверяем оба условия, выбираем подходящую строку, и только потом выводим пользователю сообщение, где он задаёт новое число

→ Ссылка