我知道很多人在break
和if condition: quit == True
循环中对while
与until
进行辩论。我听说break
的一个共同观点是,它不是冗长的,它可能会导致糟糕的代码结构。虽然我正在为CS110开发一个项目,但我需要创建一个菜单,这会循环直到用户输入'Q'
,然后将命令添加到列表中直到输入'X'
,然后它会执行那些命令。如果命令以'X'
开头,你可以做其他的事情,比如播放一首歌,但我不希望这对用户来说是显而易见的。这是我在Python中的代码
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
与标准方式之间的有效媒介,因为缺乏更好的词汇?在其他项目中是否存在可预见的问题?
答案 0 :(得分:2)
就语义而言,这与break
的效果基本相似。您正在使用关键字提前中止循环。因此,出于同样的原因,您不会使用break
,因此您不会使用continue
。
话虽这么说,你的结构确实使事情变得复杂:首先,它引入了一个额外的循环条件变量,除了为break
提供解决方法之外别无其他责任。它确实使代码更复杂(例如,您不会立即看到quit
仅 更改了continue
发生的位置。其次,它需要重新评估循环条件,尽管您已经知道它的结果。因此,如果我们要查看字节代码,而不是跳到循环的末尾(与break
一样),我们跳转到开始,重新检查条件并然后跳转到结束。
所以,为了让它更容易,我绝对会在那里使用break
。请注意,不使用break
的常见原因不是关键字本身,而是它引入了循环的额外退出(就像在函数早期使用returns
一样);而且你在那里使用continue
并没有改变它。所以要么使用break
,要么根本不中断循环。