2014-10-29 3 views
0

У меня возникли некоторые проблемы с вырваться из этих петель:Вырыв из петли?

done = False 
while not done: 
    while True: 
     print("Hello driver. You are travelling at 100km/h. Please enter the current time:") 
     starttime = input("") 
     try: 
      stime = int(starttime) 
      break 
     except ValueError: 
      print("Please enter a number!") 
    x = len(starttime) 
    while True: 
     if x < 4: 
      print("Your input time is smaller than 4-digits. Please enter a proper time.") 
      break 
     if x > 4: 
      print("Your input time is greater than 4-digits. Please enter a proper time.") 
      break 
     else: 
      break 

Он признает ли число < 4 или> 4, но даже тогда, когда число вводится в длину 4-х цифр, он возвращается к началу программа, а не продолжает следующий сегмент кода, которого нет здесь.

+0

где вы меняете это на True? –

+0

try: stime = int (время начала) # вы имеете в виду starttime = int (время запуска). – Crispy

ответ

0

Причина, по которой он «возвращается в начало программы», заключается в том, что вы вложили петли внутри цикла while. Оператор break очень прост: он завершает цикл (для или пока), который выполняет программа в настоящий момент. Это не влияет ни на что вне рамки этого конкретного цикла. Вызов прерывания внутри вашей вложенной петли неизбежно закончится в той же точке.

Если вы хотите закончить все выполнение в любом конкретном блоке кода, независимо от того, насколько глубоко вы вложены (и то, с чем вы сталкиваетесь, является симптомом проблем с глубоко вложенным кодом), вы должны переместите этот код в отдельную функцию. В этот момент вы можете использовать return для завершения всего метода.

Вот пример:

def breakNestedWhile(): 
    while (True): 
     while (True): 
      print("This only prints once.") 
      return 

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

+0

Почему у вас есть парсеры вокруг Истины? –

+0

А, дурная привычка - иногда проскальзывает синтаксис C#. – furkle

0

Вы, очевидно, хотите использовать переменную done в качестве флага. Поэтому вы должны установить его непосредственно перед вашим последним перерывом (когда вы закончите).

... 
else: 
    done = 1 
    break 
0

input() может принимать опциональный быструю строку. Я попытался немного почистить поток, надеюсь, что он будет полезен в качестве ссылки.

x = 0 
print("Hello driver. You are travelling at 100km/h.") 
while x != 4: 
    starttime = input("Please enter the current time: ") 
    try: 
     stime = int(starttime) 
     x = len(starttime) 
     if x != 4: 
      print("You input ({}) digits, 4-digits are required. Please enter a proper time.".format(x))     
    except ValueError: 
     print("Please enter a number!") 
Смежные вопросы