多个If和Elif的Python之间的区别

在Python中,是否有区别说:

if text == 'sometext': print(text) if text == 'nottext': print("notanytext") 

  if text == 'sometext': print(text) elif text == 'nottext': print("notanytext") 

只是想知道如果多个ifs可能会导致任何不需要的问题,如果最好的做法是使用elifs

多个if是指你的代码将会去检查所有if条件,在elif的情况下,如果条件满足的话不会检查其他条件。

其他简单的方法来看看使用if和elif之间的区别是这里的例子:

 def analyzeAge( age ): if age < 21: print "You are a child" if age > 21: print "You are an adult" else: #Handle all cases were 'age' is negative print "The age must be a positive integer!" analyzeAge( 18 ) #Calling the function >You are a child >The age must be a positive integer! 

在这里你可以看到,当18被用作input时,答案是(令人惊讶的)2个句子。 那是错的。 它应该只是第一句话。

这是因为,如果陈述正在评估。 计算机把它们看作是两个单独的陈述:

  • 第一个是真的18,所以“你是一个孩子”印。
  • 第二个if语句是错误的,因此else部分被执行打印“年龄必须是正整数”。

elif修复了这个问题,并把两个if语句“粘在一起”作为一个:

 def analyzeAge( age ): if age < 21: print "You are a child" elif age > 21: print "You are an adult" else: #Handle all cases were 'age' is negative print "The age must be a positive integer!" analyzeAge( 18 ) #Calling the function >You are a child 
 def multipleif(text): if text == 'sometext': print(text) if text == 'nottext': print("notanytext") def eliftest(text): if text == 'sometext': print(text) elif text == 'nottext': print("notanytext") text = "sometext" timeit multipleif(text) 100000 loops, best of 3: 5.22 us per loop timeit elif(text) 100000 loops, best of 3: 5.13 us per loop 

你可以看到elif稍快一些。 这可能会更明显,如果有更多的ifs和更多的elifs。

在你上面的例子中有不同之处,因为你的第二个代码缩进了elif ,它实际上在if块内,在这个例子中,在语法和逻辑上是不正确的。

Python使用行缩进来定义代码块(大多数C语言使用{}来封装一段代码,但是Python使用行缩进),所以在编码时,应该认真考虑缩进。

你的样品1:

 if text == 'sometext': print(text) elif text == 'nottext': print("notanytext") 

ifelif都缩写相同,所以它们与相同的逻辑有关。 你的第二个例子:

 if text == 'sometext': print(text) elif text == 'nottext': print("notanytext") 

如果在另一个块包含它之前, elif被缩进的更多,所以它被认为在if块的内部。 而且由于里面如果没有其他嵌套的ifELIF被Python解释器视为语法错误。

这是另一种思考方式:

假设你有两个具体的条件,if / else catchall结构是不够的:

例:

我有一个3×3的井字棋板,我想打印两个对angular线的坐标,而不是其他的方块。

井字趾坐标系统

我决定使用,如果/ ELIF结构,而不是…

 for row in range(3): for col in range(3): if row == col: print('diagonal1', '(%s, %s)' % (i, j)) elif col == 2 - row: print('\t' * 6 + 'diagonal2', '(%s, %s)' % (i, j)) 

输出是:

 diagonal1 (0, 0) diagonal2 (0, 2) diagonal1 (1, 1) diagonal2 (2, 0) diagonal1 (2, 2) 

可是等等! 我想包括对angular线2的所有三个坐标,因为(1,1)也是对angular线2的一部分。

'elif'引起了对'if'的依赖,所以如果原来的'if'被满足了,即使'elif'逻辑满足条件,'elif'也不会启动。

我们把第二个“elif”改成“if”。

 for row in range(3): for col in range(3): if row == col: print('diagonal1', '(%s, %s)' % (i, j)) if col == 2 - row: print('\t' * 6 + 'diagonal2', '(%s, %s)' % (i, j)) 

我现在得到我想要的输出,因为两个'if'语句是相互排斥的。

 diagonal1 (0, 0) diagonal2 (0, 2) diagonal1 (1, 1) diagonal2 (1, 1) diagonal2 (2, 0) diagonal1 (2, 2) 

最终知道你想达到什么样的结果将决定你编码的条件关系/结构的types。