多个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")
if和elif都缩写相同,所以它们与相同的逻辑有关。 你的第二个例子:
if text == 'sometext': print(text) elif text == 'nottext': print("notanytext")
如果在另一个块包含它之前, elif被缩进的更多,所以它被认为在if块的内部。 而且由于里面如果没有其他嵌套的if , ELIF被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。