2014-10-30 71 views
0

我知道很多人在breakif condition: quit == Truewhileuntil循環之間辯論。我聽說break的一個共同意見是它不是冗長的,它可能導致可怕的代碼結構。雖然我正在爲CS110開發一個項目,但我需要製作一個菜單,直到用戶輸入'Q',然後將命令添加到列表中,直到輸入'X',然後它纔會執行這些命令。如果該命令以'X'開頭,則可以執行其他操作,例如播放歌曲,但我不希望對用戶顯而易見。這是我在Python代碼使用`continue`作爲break語句

usrCommands = [] 

def menu(): 
    global usrCommands 

    # Take user input 
    quit = False 
    while not quit : 
     print("Please enter a command for the Finch :") 
     print("\tW - Move Forward") 
     print("\tS - Move Backward") 
     print("\tA - Turn Left") 
     print("\tD - Turn Right") 
     print("\tX - Execute Commands") 
     print("\tQ - Quit") 
     usrIn = input("> ").upper() 
     print() 

     # Parse for valid input 
     contains = False 
     for letter in 'WSADQ' : 
      if usrIn.find(letter) != -1: 
       contains = True 
     # execute if command is invalid unless the command starts with 'X' 
     if not((contains and len(usrIn) == 1) or (usrIn.find('X') == 0)): 
      displayInvalid() 
      continue 
     if usrIn == 'Q' : 
      quit = True 
      continue 

     if usrIn != 'X': 
      usrCommands.append(usrIn) 
     print(usrCommands) 

我的問題是在

if usrIn == 'Q' : 
    quit = True 
    continue 

塊。在這裏,我的語法與if的語法相同,但以正常方式終止了while循環,但不是將其包含在最後,而是與使用break語句具有相同的效果。但是,在這裏您可以很容易地看到quit現在等於True。這是否是break和這樣做的標準方式之間的有效媒介,因爲缺乏更好的單詞?其他項目中是否存在可預見的問題?

+1

它在語義上等同於'break',而添加更多的代碼:我會說它更糟。對'break'沒問題的人會更喜歡'break';不喜歡「休息」的人不喜歡它,因爲跳躍,並且會遇到與「繼續」相同的問題。但是,這是一個意見問題,並可能因此而輕易結束。 – Amadan 2014-10-30 00:49:37

+0

@Amadan,如果它確實關閉,哦。這不是一個重要的問題,只是我對 – Lightfire228 2014-10-30 00:54:30

+0

感到好奇對我來說,在這種情況下,休息似乎是一個更明確的指示,因此更合乎邏輯的選擇。我不認爲有什麼關於休息的混亂。它只會結束循環。但那只是我的個人意見。 – Totem 2014-10-30 00:59:14

回答

2

就語義而言,這在本質上與break非常相似。您正在使用關鍵字提前中止循環。因此,出於同樣的原因,您不會使用break,那麼您不會在那裏使用continue。這就是說,你的結構確實使事情複雜化:首先,它引入了一個額外的循環條件變量,除了爲break提供解決方案之外,沒有其他責任。但它確實使代碼更復雜(例如,您不會立即看到quit只有發生了更改,而continue發生了更改)。其次,它需要重新評估循環條件,儘管你已經知道它的結果。因此,如果我們要查看字節代碼,而不是跳轉到循環結尾(與break一樣),我們跳轉到開始,重新檢查條件,然後,然後跳轉到結尾。

所以,只是爲了更容易,我絕對會在那裏使用break。請注意,不使用break的常見原因不是關鍵字本身,而是它引入了循環中的額外退出事件(就像早期在函數中使用returns一樣);並且在那裏使用continue並沒有改變這一點。所以要麼使用break,要麼根本不打斷循環。

+0

所以你會建議我使用'while True:'並且明確地調用break?我知道這是一個非常有見地的問題,但是,在這種情況下,這會被認爲是適當的'break'嗎? – Lightfire228 2014-10-30 01:04:34

+1

我不是一個只允許單個退出點的純粹主義者,所以是的,我個人更喜歡簡單的'break'來儘早結束循環。我相信它更好地表達了意圖,並允許簡化整體結構。 – poke 2014-10-30 01:13:49