使用`continue`作为break语句

时间:2014-10-30 00:47:37

标签: python structure break readability continue

我知道很多人在breakif condition: quit == True循环中对whileuntil进行辩论。我听说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与标准方式之间的有效媒介,因为缺乏更好的词汇?在其他项目中是否存在可预见的问题?

1 个答案:

答案 0 :(得分:2)

就语义而言,这与break的效果基本相似。您正在使用关键字提前中止循环。因此,出于同样的原因,您不会使用break,因此您不会使用continue

话虽这么说,你的结构确实使事情变得复杂:首先,它引入了一个额外的循环条件变量,除了为break提供解决方法之外别无其他责任。它确实使代码更复杂(例如,您不会立即看到quit 更改了continue发生的位置。其次,它需要重新评估循环条件,尽管您已经知道它的结果。因此,如果我们要查看字节代码,而不是跳到循环的末尾(与break一样),我们跳转到开始,重新检查条件并然后跳转到结束。

所以,为了让它更容易,我绝对会在那里使用break。请注意,不使用break的常见原因不是关键字本身,而是它引入了循环的额外退出(就像在函数早期使用returns一样);而且你在那里使用continue并没有改变它。所以要么使用break,要么根本不中断循环。