多个 if 和 elif 之间的区别?

2025-02-11 09:50:00
admin
原创
47
摘要:问题描述:在 python 中,以下说法有区别吗:if text == 'sometext': print(text) if text == 'nottext': print("notanytext") 和 if text == 'sometext': pr...

问题描述:

在 python 中,以下说法有区别吗:

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

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

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


解决方案 1:

多个 if 意味着您的代码将检查所有的 if 条件,而在 elif 的情况下,如果一个 if 条件满足,它就不会检查其他条件。

解决方案 2:

另一个简单方法来查看 if 和 elif 用法之间的区别的方法是以下示例:

# According to the UN Convention of the Rights of the Child
ADULT_AGE = 18
def analyze_age(age):
   if age < ADULT_AGE and age > 0:
       print("You are a child")
   if age >= ADULT_AGE:
       print("You are an adult")
   else:
       print("The age must be a positive integer!")

analyze_age(16)
>You are a child
>The age must be a positive integer!

这里你可以看到,当输入 18 时,答案(令人惊讶地)是 2 个句子。这是错误的。它应该只是第一句话。

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

  • 第一个对于 18 来说是正确的,因此打印“你是个孩子”。

  • 第二个 if 语句为假,因此执行 else 部分,打印“年龄必须是正整数”。

elif修复了这个问题并使两个 if 语句“粘在一起”成为一个

def analyze_age(age):
   if age < ADULT_AGE and age > 0:
       print("You are a child")
   elif age >= ADULT_AGE:
       print("You are an adult")
   else:
       print("The age must be a positive integer!")

analyze_age(16)
>You are a child

解决方案 3:

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,这一点会更加明显。

解决方案 4:

这是另一种思考方式:

假设有两个特定情况,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('    ' * 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('    ' * 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)

最终了解您想要实现的类型或结果将决定您编码的条件关系/结构类型。

解决方案 5:

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

多个 if 在测试后执行多个分支,而 elif 是互斥的,在测试后实际上执行一个分支。

以用户2333594为例

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

解决方案 6:

在上面的例子中存在差异,因为您的第二个代码缩进了 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缩进更多,在另一个块将其括起来之前,因此它被视为在if块内。并且由于if内部没有其他嵌套的if,因此 Python 解释器将elif视为语法错误。

解决方案 7:

当您使用多个 时if,您的代码将返回每个if语句以检查表达式是否符合您的条件。有时,会出现单个表达式发送许多结果的情况,这些结果甚至不是您预料到的。但是,elif当表达式符合您的任何条件时,使用 会终止该过程。

解决方案 8:

以下是我分解控制流语句的方法:


# 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因为所有前面的语句都无法执行

解决方案 9:

如果是:

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,其前面的语句将被省略/不执行。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用