Вырваться из цикла True с функцией - PullRequest
0 голосов
/ 10 мая 2018

Итак, у меня есть верный цикл -

while True:
  getStatus()
  print('Ended')

Я надеюсь, что смогу вырваться, если ответ 999. Вот что я пытался:

def getStatus():
  answer = input('What is the box ID? ')
  if answer == 999:
    return False 
  elif type(answer) == int:
    boxId = answer + 1
    print(boxId)

Однако, даже если ввод «999», он возвращается назад и спрашивает «Что такое идентификатор блока? ' снова.

Как мне выйти из истинного цикла while?

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Вы можете изменить его на -

if (not getstatus ()): перерыв

Таким образом, вы можете использовать возвращаемое значение, чтобы выйти из бесконечного цикла. Это просто!

0 голосов
/ 10 мая 2018

Ваш цикл while продолжает работать, потому что это именно то, что вы сказали.После того, как функция, которую вы вызываете из своего тела, возвращается, вы игнорируете возвращаемое значение, безоговорочно печатаете "Ended" и затем делаете все это снова, поскольку условие в цикле, очевидно, все еще верно.

Если вы хотите, чтобы функциячтобы контролировать, продолжает ли цикл работать, вы должны использовать его возвращаемое значение в качестве условия в цикле, с чем-то вроде этого:

running = True
while running:
    running = getStatus()
print("Ended") # move this outside the loop!

Это требует, чтобы getStatus возвращало истинное значение, когда вы хотите сохранитьзацикливание и значение фальси, когда вы хотите остановиться.Ваша текущая реализация этой функции не делает этого.Он возвращает False при вводе 999, но явно не возвращает ничего, если вы вводите другие данные (что в Python эквивалентно возвращению None).Так как False и None не соответствуют действительности, приведенный выше код на самом деле не будет работать (вы могли бы исправить это с помощью чего-то вроде running = getStatus() is None, но это было бы ужасно).Вы должны изменить функцию, чтобы иметь явный оператор return во всех ее ветвях (включая случай для нецелочисленных входов, где она не входит ни в ваши блоки if, ни elif).

Если цикл и логика функции тесно переплетены, возможно, имеет смысл перенести цикл в саму функцию, вместо того, чтобы он был отдельным и нуждался в использовании возвращаемого значения, чтобы сигнализировать, когда нужно остановиться.В одной функции вы можете использовать break для непосредственного выхода из цикла:

def getStatus():
    while True:
        answer = input('What is the box ID? ')
        if answer == 999:
            break
        elif isinstance(answer, int): # isinsance() is better than type(...) == ...
            boxId = answer + 1
            print(boxId)
        else:
            print("I'm sorry, I didn't understand that.") # still good to handle this case
...