Ваш цикл 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