В то время как петли правильное размещение

Мне нужна помощь в правильном использовании следующих трех циклов while:

while choice is None:  ...
while not isinstance (choice, int):  ...
while int(choice) not in range(0,1):  ...

Возможно, что-то вроде этого:

while choice is None and not isinstance (choice, int) and int(choice) not in range(0,1):
    print("Invalid option!")
    choice = input("Choose key: ")

Как мне это правильно вложить?

choice = None
choice = input("Choose key: ")

while choice is None:
    choice = input("Choose key: ")

while not isinstance (choice, int):
    print("choice is an integer and I equal 0 or 1")
    print("Also if I am None or not an int, I will loop until I meet I am")

while int(choice) not in range(0,1):
    choice = input("Choose key: ")
    choice = int(choice)

Я бы предпочел использовать рекурсию для таких вещей :)

Sasha 10.08.2018 14:47

Непонятно, что вы хотите. Какова цель цикла (ов) while? Вы пытаетесь попросить пользователя ввести данные, пока он не даст верный ответ? Пожалуйста, посмотрите минимальный воспроизводимый пример и опишите желаемый результат.

Aran-Fey 10.08.2018 14:47

Использовать while True и операторы if с break? Это может быть понятнее, чем серия циклов while.

9769953 10.08.2018 14:47

Итак, ваша цель - получить действительный целочисленный ввод?

N Chauhan 10.08.2018 14:49

Обратите внимание, что choice никогда не будет равен None, за исключением первой строки.

9769953 10.08.2018 14:49

@Jaxi Recursion - неправильный выбор для такого типа цикла в Python, поскольку он накладывает произвольный верхний предел и снижает производительность по сравнению с циклом while.

chepner 10.08.2018 14:53

Да, я пытаюсь получить действительное целое число, которое соответствует целому числу из диапазона (0,1). Спасибо за ссылки выше!

Evan 10.08.2018 15:03
0
8
87
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Если вам нужен целочисленный ввод ...

while True:
    try:
        choice = int(input('Enter choice: '))
    except ValueError:
        print('Invalid choice')
    else:
        # add an if statement here to add another condition to test the int against before accepting input
        break
# .... do whatever next with you integer

input возвращает объект str, точка. Он никогда не вернет None, он никогда не вернет int. Просто (попробуйте) преобразовать choice в int, затем проверьте полученное значение, нарушая только при вводе 0 или 1.

while True:
    choice = input("Choose key: ")
    try:
        choice = int(choice)
    except ValueError:
        continue
    if choice in (0, 1):
        break

Огромное спасибо! Я новичок в программировании. Я не ожидал чего-то такого чистого и элегантного. Спасибо, Чепнер!

Evan 10.08.2018 15:06

Вместо этого я бы принял @ ответ Криса, поскольку он задерживает вызов int до тех пор, пока вы не получите ввод, который, как вы знаете, не вызовет исключения.

chepner 10.08.2018 15:35
Ответ принят как подходящий

Вы можете красиво сжать это, переместив все в один цикл:

while True:
    choice = input("Choose key: ")
    if choice in ("0", "1"):
        choice = int(choice)
        break

Это элегантное решение! Я не рассматривал возможность просто протестировать "1", "0" вместо преобразования. Аккуратный.

N Chauhan 10.08.2018 15:02

Если я правильно понимаю, это не столько вложенность, сколько упорядочивание, верно? Как насчет:

In [10]: choice = None

In [11]: while (
...:     not choice or
...:     not choice.isdigit() or
...:     int(choice) not in range(0,2)
...: ):
...:     print("Invalid option!")
...:     choice = input("Choose key: ")
choice = None
while choice not in range(0,1):
    choice = int(input("Choose key: "))

Я не знаю, пытался ли ты это сделать

isinstance() не выдаст ошибку, он просто вернет False
N Chauhan 10.08.2018 15:00

В качестве примечания, я не рекомендую использовать isinstance() для проверки типов, так как это непифонично. Следуя девизу Easier to Ask for Forgiveness than Permission (EAFP), предпочтительно использовать блок try/except для попытки преобразования в целое число. При кодировании мы предполагаем, что может что-то делает, и, если мы не можем, обработать исключение соответствующим образом.

N Chauhan 10.08.2018 15:05

Я еще мало знаю о python и dev в целом, так как я новичок. Я не знал, как правильно использовать блоки try / except, и хотел использовать то, что OP использовал в своем коде для isinstance()part. Буду иметь это в виду в следующий раз, спасибо за совет :)

Vex - 10.08.2018 15:11

Выполните поиск по запросу "EAFP" или "утиный ввод", если вам интересно :)

N Chauhan 10.08.2018 15:13

Другие вопросы по теме