2014-10-29 312 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? – 2014-10-29 01:53:16

+0

嘗試: stime = int(starttime)#你的意思是starttime = int(starttime)。 – Crispy 2014-10-29 01:57:57

回答

0

「返回程序開始」的原因是因爲你在while循環內嵌套了while循環。 break語句非常簡單:它結束程序當前正在執行的(for或while)循環。這對特定循環範圍之外的任何內容都沒有影響。在嵌套循環中調用break將不可避免地結束於同一點。

如果你想要的是在任何特定的代碼塊中結束所有的執行,無論你嵌套的深度如何(以及你遇到的是深嵌套代碼的問題的症狀),你應該將該代碼移入單獨的函數。那時你可以使用return來結束整個方法。

下面是一個例子:

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

所有這一切都是次要的事實,有沒有真正的理由讓你做的事情你現在的樣子以上 - 這是幾乎從來沒有一個好主意,while循環嵌套,你有兩個while循環具有相同的條件,這似乎毫無意義,並且你已經有了一個布爾標誌,完成了,這是你永遠不會用到的。如果你實際上在嵌套while循環中設置了True,那麼parent while循環在你破解之後不會執行。

+0

爲什麼你有真正的parens? – 2014-10-29 01:50:58

+0

啊,壞習慣 - 有時C#語法會滑過。 – furkle 2014-10-29 01:51:40

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!")