使用continue而不是if-elif

时间:2014-03-20 17:18:07

标签: 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]

现在我正在阅读continue命令herehere,我想知道这是否是更好的方法:

  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]

使用continue代替if elif会有什么好处,还是完全一样?

4 个答案:

答案 0 :(得分:4)

如果您忘记了continue,那么与您意外使用if而非elif相比,您将更难注意到并更正错误。 ifelif从它们包含的缩进块中伸出,使它们更容易被注意到。此外,如果添加新块,很容易忘记将continue放在最后一个块的末尾。使用continue进行此操作的问题与C switch语句的问题基本相同,而且几代C程序员可以告诉您有关忘记break switch的问题的恐怖故事

在绩效方面,不太可能存在任何可衡量的差异。由于两个代码片段是等效的,因此差异将归结为字节码编译器的实现细节及其产生的跳转指令。

更换像

这样的测试会有更重要的改进
if key in status_msg.keys():

if key in status_msg:

测试某个词是否在dict的keys中需要创建一个键列表然后逐个浏览它们。直接测试事物是否在dict中是一种快速哈希查找。

答案 1 :(得分:2)

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

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()

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

我认为elif版本更优越:它是面向未来的,表明你的意图,并且是对称的。表现可能是相同的,即使不是,它在名义上也是不同的和不相关的。

答案 2 :(得分:1)

在您给出的示例中,虽然它在某种程度上是一个偏好问题,但我更倾向于if / elif,因为我相信它更清楚地表达了您想要打印这两个值之一的逻辑。

continue更适合于更大的循环,其中应该完全跳过循环的某些实例(但这些实例太复杂,无法清楚地编程到用于控制循环的范围或列表理解中)或某些实例循环需要的处理要少得多,因此应尽早退出。

您给出的示例中的问题是,如果您稍后在循环结束时添加更多通用代码,则key处于status_msgs时,代码将不会立即执行。 {1}}。

答案 3 :(得分:0)

同样的事情。如果存在任何性能差异,您可以使用足够的循环或样本数据对其进行分析,以便进行比较。