何时使用if if elif in python

Sea*_*etz 17 python conditional idioms

如果我有一个带有多个条件语句的函数,其中每个分支都被执行从函数返回.我应该使用多个if语句,还是使用/ elif/else?例如,假设我有一个功能:

def example(x):
    if x > 0:
        return 'positive'
    if x < 0:
        return 'negative'
    return 'zero'
Run Code Online (Sandbox Code Playgroud)

写作更好:

def example(x):
    if x > 0:
        return 'positive'
    elif x < 0:
        return 'negative'
    else:
        return 'zero'
Run Code Online (Sandbox Code Playgroud)

两者都有相同的结果,但是比另一个更有效或被认为更惯用?

编辑:

有几个人说在第一个例子中,if语句总是被评估,这对我来说似乎并非如此

例如,如果我运行代码:

l = [1,2,3]

def test(a):
    if a > 0:
        return a
    if a > 2:
        l.append(4)

test(5)
Run Code Online (Sandbox Code Playgroud)

我仍然会等于[1,2,3]

Gar*_*tty 16

我会将我的评论扩展到答案.

在所有案件都返回的情况下,这些确实是等同的.在选择它们之间变得重要的是那么更具可读性.

您的后一个示例使用该elif结构明确声明这些情况是互斥的,而不是依赖于它们隐含地来自返回的事实.这使得该信息更加明显,因此代码更易于阅读,并且不易出错.

比如说,有人决定还有另一个案例:

def example(x):
    if x > 0:
        return 'positive'
    if x == -15:
        print("special case!")
    if x < 0:
        return 'negative'
    return 'zero'
Run Code Online (Sandbox Code Playgroud)

突然间,如果用户希望这种情况相互排斥,那么就存在一个潜在的错误(显然,考虑到这个例子,这没有多大意义,但可能在更现实的情况下).如果使用elifs,则会消除这种歧义,并且在添加代码的人员可以在他们添加代码时可以看到的行为时,该行为可见.

如果我遇到你的第一个代码示例,我可能会认为选择使用ifs而不是elifs隐含的情况并不是互斥的,所以改变值的方法x可能会用来改变if执行的(显然是这种情况是明显的,相互排斥的,但同样,我们谈的是不那么明显的情况 - 并且一致性很好,所以即使在一个简单的例子中,当它很明显时,最好坚持一种方式).


mar*_*rco 6

检查一下以了解区别:

>>> a = 2
>>> if a > 1: a = a+1
...
>>> if a > 2: a = a+1
...
>>> a
4
Run Code Online (Sandbox Code Playgroud)

与

>>> a = 2
>>> if a > 1: a = a+1
... elif a > 2: a = a+1
...
>>> a
3
Run Code Online (Sandbox Code Playgroud)

第一种情况等效于两个不同if的带有空else语句的(或想象else: pass);在第二种情况下elif是第一条if陈述的一部分。

  • 如原始发布者所述,如果所有案件都返回,这仍然没有任何效果。 (2认同)

per*_*eal 5

在某些情况下,elif需要正确的语义。当条件不互相排斥时就是这种情况:

if x == 0:   result = 0
elif y == 0: result = None
else:        result = x / y
Run Code Online (Sandbox Code Playgroud)

在某些情况下,它是有效的,因为解释器不需要检查所有条件,这就是您的示例中的情况。如果 x 是负数那么为什么要检查正数情况?在这种情况下, Anelif还使代码更具可读性,因为它清楚地表明只会执行一个分支。