使用 continue 代替 if-elif

plo*_*ver 1 python

假设我正在迭代一个输入列表,该输入列表可以是两个字典之一中的键。

  for key in inputs:
      if key in status_msg.keys():
          print status_msg[key]
      elif key in error_msg.keys():
          print error_msg[key]
Run Code Online (Sandbox Code Playgroud)

现在我正在此处和此处阅读有关该continue命令的信息,我想知道这是否是更好的方法:

  for key in inputs:
      if key in status_msg.keys():
          print status_msg[keys]
          continue
      if key in error_msg.keys():
          print error_msg[key]
Run Code Online (Sandbox Code Playgroud)

continue使用代替会有什么好处吗?if elif或者它完全相同吗?

use*_*ica 5

如果您忘记了,那么比您不小心使用代替 时continue更难注意到并纠正错误。s和s 从它们包含的缩进块中伸出,使它们更容易被注意到。另外,如果添加一个新块,很容易忘记在最后一个块的末尾添加 。使用 using 的问题本质上与 C switch 语句的问题相同,一代又一代的 C 程序员可以告诉您关于忘记退出es 的恐怖故事。ifelififelifcontinuecontinuebreakswitch

从性能角度来看,不太可能有任何可测量的差异。由于两个代码片段是等效的,因此差异将归结为字节码编译器及其生成的跳转指令的实现细节。

更显着的改进将来自于替换诸如

if key in status_msg.keys():
Run Code Online (Sandbox Code Playgroud)

和

if key in status_msg:
Run Code Online (Sandbox Code Playgroud)

测试某些内容是否在字典中keys需要创建一个键列表,然后逐一检查它们。测试该事物是否直接在字典中是快速哈希查找。


Jim*_*art 5

在您的具体示例中,控制流程是相同的。如果代码保持不变,那就没有区别。它甚至可能编译为相同的字节码。

然而,该elif版本更清楚地表达了您的意图。您告诉任何人阅读您希望key在 中找到的代码status_msg,如果不存在,您希望在 中找到它error_msg。在我看来,代码的其他部分只有error_msg在status_msg未填充时才会填充。

这个continue版本让事情变得更加模糊。error_msg每种情况下都已填充吗?该continue版本也不太适合未来:如果您想在打印后做其他事情,无论在哪里key找到,该怎么办?如果你考虑这段代码:

for key in inputs:
    if key in status_msg.keys():
        print status_msg[keys]
        continue
    if key in error_msg.keys():
        print error_msg[key]
    do_something()
Run Code Online (Sandbox Code Playgroud)

thendo_something()仅当key不在 中时执行status_msg。条件句是不对称的;一个中止迭代,另一个让控制流向块的其余部分。对于稍后处理代码的人来说,这可能并不明显,特别是如果条件包含更复杂的逻辑/更多的行。

我认为这个elif版本更优越:它面向未来,表达了您的意图,并且是对称的。性能可能是相同的,即使不是,名义上也是不同的并且无关紧要。