多个if和elif之间的区别?


76

在python中,说之间有什么区别:

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

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

只是想知道多个ifs是否会导致任何不必要的问题,以及使用elifs是否是更好的做法。

Answers:


107

多个if表示您的代码将去检查所有if条件,就像在elif的情况下一样,如果一个if条件满足则不会检查其他条件。


46

查看if和elif用法之间区别的另一种简便方法是此示例:

def analyzeAge( age ):
   if age < 21:
       print "You are a child"
   if age >= 21: #Greater than or equal to
       print "You are an adult"
   else:   #Handle all cases where '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作为输入时,答案(令人惊讶地)是2个句子。那是错的。它应该只是第一句话。

那是因为两个if语句都在被评估。计算机将它们视为两个单独的语句:

  • 第一个适用于18岁,因此将打印“ You are a child”。
  • 第二个if语句为false,因此执行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 where 'age' is negative 
       print "The age must be a positive integer!"

analyzeAge( 18 )  #Calling the function
>You are a child

编辑:纠正拼写


10
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 eliftest(text)
100000 loops, best of 3: 5.13 us per loop

您可以看到elif稍快一些。如果有更多的if和更多的elif,这将更加明显。


5

这是对此的另一种思考方式:

假设您有两个特定条件,即if / else catchall结构不能满足要求:

例:

我有一个3 X 3井字游戏板,我想打印两个对角线而不是其余正方形的坐标。

井字坐标系统

我决定使用和if / 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)

可是等等!我想包括对角线2的所有三个坐标,因为(1,1)也是对角线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)

最终知道要实现哪种类型或结果将决定您要编写哪种类型的条件关系/结构。


2

在上面的示例中,存在差异,因为您的第二个代码使elif缩进,它实际上位于if块内部,并且在此示例中在语法和逻辑上是不正确的。

Python使用行缩进来定义代码块(大多数类似C的语言使用{}来封装代码块,但是python使用行缩进),因此在编码时,应认真考虑缩进。

您的样本1:

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

两者如果elif的缩进相同,因此它们都涉及到相同的逻辑。您的第二个示例:

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

在另一个块将elif缩进之前,它比if缩进更多,因此将其视为在if块内。并且由于if内没有其他嵌套的if,因此Python解释器将elif视为语法错误。


1

elif只是一种表达方式else: if

多个if在测试后执行多个分支,而elif是相互排斥的,而在测试后从头执行一个分支。

以user2333594为例

    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!"

可以改写为:

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

另一个示例可能是:

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

1

当您使用multiple时if,您的代码将返回到每个if语句中,以检查表达式是否适合您的条件。有时,有时会为单个表达式发送许多结果,这甚至是您无法期望的。但是elif,当表达式适合您的任何条件时,使用会终止该过程。


0

这是我分解控制流语句的方式:


# if: unaffected by preceding control statements
def if_example():
    if True:
        print('hey')
    if True:
        print('hi')  # will execute *even* if previous statements execute

将打印heyhi


# elif: affected by preceding control statements
def elif_example():
    if False:
        print('hey')
    elif True:
        print('hi')  # will execute *only* if previous statement *do not*

将打印hi 因为前面的语句评价False


# else: affected by preceding control statements
def else_example():
    if False:
        print('hey')
    elif False:
        print('hi')
    else:
        print('hello')  # will execute *only* if *all* previous statements *do not*

将打印,hello因为所有先前的语句执行失败


0

如果是:

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

if即使只有第一条if语句,也会执行相同缩进级别的所有语句True

如果是:

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

当一个if语句为时True,前面的语句将被省略/不执行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.