Можно ли использовать «пока что-то» вместо «пока истина» в этом фрагменте кода? - PullRequest
0 голосов
/ 20 июня 2019

Я читал на нескольких страницах в Интернете, что использование «while True» и ручное прерывание цикла while с помощью «break» - плохая практика. В данном конкретном случае я бы не хотел использовать «while True», и мне интересно, возможно ли это.

while True:
    x = input()
    try:
        x = float(x)
        break
    except ValueError:
        continue

Я пытался сделать это:

while x is not float:
    x = input()
    try:
        x = float(x)
    except ValueError:
        continue

Но цикл никогда не прерывается. Есть ли возможное решение, или лучше оставить это как цикл «В то время как Истина»?

Ответы [ 3 ]

1 голос
/ 20 июня 2019

Если это весь цикл, проблем с использованием break не так много. Основная причина, по которой вам следует стараться избегать break, заключается в том, что из-за этого могут возникнуть большие петли или петли с большим количеством ветвей (if и т. Д.) Внутри.

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

1 голос
/ 17 июля 2019

С PEP 315 у нас есть это утверждение:

Пользователям языка рекомендуется использовать форму while-True с внутренним if-break, когда цикл do-while был бы уместен.

Это утверждение относится к этой части PEP 315 :

Последующие усилия по возрождению ПКП в апреле 2009 года не увенчались успехом, поскольку не было найдено синтаксиса, который мог бы конкурировать со следующей формой:

while True:
    <setup code>
    if not <condition>:
        break
    <loop body>

Вы не цитируете источники, которые утверждают, что это «плохая практика», но эти выдержки из PEP 315 противоречат им.

1 голос
/ 20 июня 2019

Вы можете использовать isinstance , чтобы проверить, является ли x экземпляром float или нет, согласно предложению @Enzo

#Define x as None here
x = None

#Run loop until you find x which is a float
while not isinstance(x, float):
    x = input()
    try:
        #If x can be cast to a float, the loop will break
        x = float(x)
    except ValueError:
        continue
...