В то время как истина l oop для проверки чисел в пределах диапазона, а также проверка ValueError? - PullRequest
0 голосов
/ 25 января 2020

Я пытаюсь проверить, находится ли inputSeconds в диапазоне от 0 до 83699, а также проверить, использует ли пользователь целые числа (с проверкой ValueError).

Я пробовал много разных итераций этого же кода, перемещая вещи вокруг ... Я все еще очень плохо знаком с Python, и я застрял в этом надолго, любой помощь приветствуется. 100

Вот фрагмент кода, с которым я борюсь:

while True:
    try:
        inputSeconds = int(input("♡ Seconds: "))
        break
    except ValueError:
        print("Please enter a valid integer.")
    else:
        if 0 <= inputSeconds <= 86399:
            break
        else:
            print("Please enter a value between 0 and 86399.")

Проверка ValueError работает нормально, но проверка диапазона игнорируется; код просто продолжит работу и вычислит любое число, добавленное туда. Спасибо, что нашли время посмотреть на мой код ♡

1 Ответ

2 голосов
/ 25 января 2020

Как вы, наверное, знаете, ключевое слово break выходит из текущего l oop. Это означает, что вы должны писать его только в той точке кода, где l oop достигло того, чего вы хотели.

В этом l oop вы хотите получить число от пользователя между 0 и 86399, поэтому вы не должны break, пока не определите число в этом диапазоне. При чтении и написании кода полезно подумать о том, что «известно» на каждом этапе кода: я прокомментировал код ниже, чтобы сказать, что «известно» на каждом этапе.

while True:
    try:
        # at this line, we know nothing
        inputSeconds = int(input("♡ Seconds: "))
        # at this line, we know that int worked, so inputSeconds is a number.
        break
    except ValueError:
        # at this line, we know that int didn't work, so we don't have a number.
        print("Please enter a valid integer.")
    else:
        # this line will never be reached, because of the break at the end of
        # the try block.
        if 0 <= inputSeconds <= 86399:
            break
        else:
            print("Please enter a value between 0 and 86399.")

# at this line, the loop stopped because of the break statement in the try block,
# so we know what we knew before that break statement: inputSeconds is a number.

Ваше заявление break происходит в той точке кода, где мы знаем, что inputSeconds - это число. Но логически этого недостаточно, чтобы остановить l oop, потому что цель l oop - убедиться, что inputSeconds - это число и , что оно находится в диапазоне. Поэтому мы не должны break в этот момент. Вот фиксированный код, помеченный тем, что мы знаем на каждом этапе:

while True:
    try:
        # at this line, we know nothing
        inputSeconds = int(input("♡ Seconds: "))
        # at this line, we know that int worked, so inputSeconds is a number.
    except ValueError:
        # at this line, we know that int didn't work, so we don't have a number.
        print("Please enter a valid integer.")
    else:
        # this line is reached when the try block finishes, so we know the same
        # thing we knew at the end of the try block: inputSeconds is a number.
        if 0 <= inputSeconds <= 86399:
            # now we know that inputSeconds is a number and it is within range.
            break
        else:
            # now we know that inputSeconds is a number and it is not within range.
            print("Please enter a value between 0 and 86399.")

# at this line, the loop stopped because of the break statement in the else block,
# so we know what we knew before that break statement: inputSeconds is a number
# and it is within range.

Обратите также внимание на то, как операторы print происходят на этапах кода, где мы знаем, что не так: мы печатаем «Пожалуйста, введите правильное целое число» , когда мы знаем, что введенное пользователем не было целым числом, и мы печатаем «Пожалуйста, введите значение от 0 до 86399» , когда мы знаем, что пользователь введите число, которое находится за пределами диапазона. Таким образом, этот способ мышления о коде полезен для написания правильного кода, а не только когда речь идет о циклах и break операторах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...