0 <2 = ... Неверно? - PullRequest
       33

0 <2 = ... Неверно?

0 голосов
/ 22 февраля 2019

Python 3.7

Попытка создать игру по угадыванию чисел.Вот мой код:

#This is the guess the number game!
import random
secretNumber = random.randint(0,20)

print('I am thinking of a secret number between 0 and 20, can you guess what it is in six tries or less?')

for guessTimes in range(1,7):
    try:
        guessNumber = int(input())
        print(type(guessNumber))
        print('Guess Number: ' +str(guessNumber))
    except ValueError:
        guessNumber = None
        print('Secret Number: ' +str(secretNumber))
        print('You have to give me a valid integer for your guess.', end = ' ')
    if guessNumber and guessNumber < secretNumber:
        print('You have guessed a number that is too low...')
    elif guessNumber and guessNumber > secretNumber:
        print('You have guessed a number that is too high...')
    elif guessNumber and guessNumber == secretNumber:
        print('Great job, you guessed the secret number in only ' +str(guessTimes)+ ' tries!')
        print('You should go PRO!')
        break
    if guessTimes > 6:
        print('Sorry, that was six tries and lots of fail, better luck next time!')
    elif guessTimes == 1:
        print('That is ' +str(guessTimes)+ ' failed attempt thus far, you have ' +str(6-guessTimes)+ ' chances remaining. Please try again.')
    elif guessTimes > 1:
        print('That is ' +str(guessTimes)+ ' failed attempts thus far, you have ' +str(6-guessTimes)+ ' chances remaining. Please try again.')
    guessTimes += 1
    continue

Похоже, все это прекрасно работает для всех значений предположения, которые находятся в диапазоне от 1 до 123 412 351.Но по какой-то причине всякий раз, когда я вводю 0 в качестве предположения, код пропускает строку:

if guessNumber and guessNumber < secretNumber:
        print('You have guessed a number that is too low...')

Извините, это не очень важный вопрос, но я бился головойнекоторое время против этого и не могу понять, почему эта строка не оценивается как True, когда guessNumber == 0.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Обе None и 0 являются "ложными" в Python, поэтому if guessNumber and guessNumber < secretNumber: короткие цепи при тестировании guessNumber, так как это 0 и 0 ложные.

Вы будетенужно сузить проверку, чтобы только поймать None, изменив тесты вида if guessNumber and ...: на if guessNumber is not None and ...:.

Альтернативное решение состоит в том, чтобы полностью избежать проверки догадки, когда они дали недопустимое значение.Вы можете сделать это довольно легко, расширив try / except до try / except / else:

for guessTimes in range(1,7):
    try:
        guessNumber = int(input())
        print(type(guessNumber))
        print('Guess Number: ' +str(guessNumber))
    except ValueError:
        print('Secret Number: ' +str(secretNumber))
        print('You have to give me a valid integer for your guess.', end = ' ')
    else:
        # Only run when no ValueError occurs
        if guessNumber < secretNumber:
            print('You have guessed a number that is too low...')
        elif guessNumber > secretNumber:
            print('You have guessed a number that is too high...')
        elif guessNumber == secretNumber:
            print('Great job, you guessed the secret number in only ' +str(guessTimes)+ ' tries!')
            print('You should go PRO!')
            break

    if guessTimes == 1:
        print('That is ' +str(guessTimes)+ ' failed attempt thus far, you have ' +str(6-guessTimes)+ ' chances remaining. Please try again.')
    else:
        print('That is ' +str(guessTimes)+ ' failed attempts thus far, you have ' +str(6-guessTimes)+ ' chances remaining. Please try again.')
else:
    # Run when loop exits without break
    print('Sorry, that was six tries and lots of fail, better luck next time!')

Преимущество здесь в том, что вы не беспокоитесь о настройке иливообще тестировать guessNumber, когда он является мусором (без использования None в качестве значения флага или тому подобного), поэтому, когда это не мусор, вам вообще не нужно проверять флаг None.

Примечание: в новом коде я удалил guessTimes += 1 и continue, поскольку for i in range(1, 7): уже сделал приращение для вас, а continue, поскольку последнее утверждение в цикле бессмысленно.Я также переместил вывод "слишком много догадок" в else в цикле for;вы никогда не сделали бы этот код таким, как написано (поскольку цикл заканчивается на guessTimes как 6, guessTimes > 6 всегда ложно), и он сохраняет проверки, чтобы просто автоматически это происходило, если цикл завершается без break.

0 голосов
/ 22 февраля 2019

Число, если оно используется в условном выражении, например if, обрабатывается как boolean (false, если 0, в противном случае - true)

if guessNumber and guessNumber < secretNumber:
     print('You have guessed a number that is too low...')

Здесь есть два условия в операторе if и первомстановится ложным, поскольку guessNumber для входа 0 ложно и, следовательно, строка пропускается.

Удалите номер догадки из условия, и все хорошо

if guessNumber < secretNumber:
     print('You have guessed a number that is too low...')
...