让我们说我在一个输入列表中进行迭代,这些输入可以是两个词典中的一个。
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
命令here和here,我想知道这是否是更好的方法:
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
会有什么好处,还是完全一样?
答案 0 :(得分:4)
如果您忘记了continue
,那么与您意外使用if
而非elif
相比,您将更难注意到并更正错误。 if
和elif
从它们包含的缩进块中伸出,使它们更容易被注意到。此外,如果添加新块,很容易忘记将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)
同样的事情。如果存在任何性能差异,您可以使用足够的循环或样本数据对其进行分析,以便进行比较。