• 技术文章 >Python技术 >Python基础教程

    Python if else条件语句详解

    silencementsilencement2019-07-01 10:23:59原创3139

    if 分支使用布尔表达式或布尔值作为分支条件来进行分支控制。Python 的 if 分支既可作为语句使用,也可作为表达式使用。下面先介绍 if 分支作为语句使用的情形。

    if 语句可使用任意表达式作为分支条件来进行分支控制。Python 的 if 语句有如下三种形式:

    第一种形式:

    if expression:
        statements...

    第二种形式:

    if expression
        statements...
    else:
        statements...

    第三种形式:

    if expression:
        statements...
    elif expression:
        statements...
    ...//可以有零条或多条elif语句
    else:
        statement...

    在上面 if 语句的三种形式中,第二种形式和第三种形式是相通的,如果第三种形式中的 elif 块不出现,则变成了第二种形式。

    对于上面的 if 分支语句,执行过程是非常简单的,即如果 if 条件为“真”,程序就会执行 if 条件后面的多条语句;否则就会依次判断 elif 条件,如果 elif 条件为“真”,程序就会执行 elif 条件后面的多条语句……如果前面所有条件都为“假”,程序就会执行 else 后的代码块(如果有)。

    在上面的条件语句中,if expression:、elif expression:及 else:后缩进的多行代码被称为代码块,一个代码块通常被当成一个整体来执行(除非在运行过程中遇到return、break、continue等关键字),因此这个代码块也被称为条件执行体。

    Python是一门很“独特”的语言,它的代码块是通过缩进来标记的(大部分语言都使用花括号或 end 作为代码块的标记),具有相同缩进的多行代码属于同一个代码块。如果代码莫名其妙地乱缩进,Python 解释器会报错(前文说过,Python 不是格式自由的语言)。

    例如如下程序:

    s_age = input("请输入您的年龄:")
    age = int(s_age)
    if age > 20 :
        # 只有当age > 20时,下面用整体缩进的代码块才会执行
        # 整体缩进的语句是一个整体,要么一起执行,要么一起不执行
        print("年龄已经大于20岁了")
        print("20岁以上的人应该学会承担责任...")

    运行上面代码,如果输入年龄小于 20,将会看到如下运行结果:

    请输入您的年龄:18

    从上面代码可以看出,如果输入的年龄小于 20,则程序没有任何输出,整体缩进的语句作为整体都不会执行。

    运行上面代码,如果输入年龄大于 20,将会看到如下运行结果:

    请输入您的年龄:24
    年龄已经大于20岁了
    20岁以上的人应该学会承担责任...

    从上面代码可以看出,如果输入的年龄大于 20 ,则程序会执行整体缩进的代码块。

    代码块一定要缩进,否则就不是代码块。例如如下程序:

    s_age = input("请输入您的年龄:")
    age = int(s_age)
    if age > 20 :
    print("年龄已经大于20岁了")

    上面程序的 if 条件与下面的 print 语句位于同一条竖线上,这样在 if 条件下就没有受控制的代码块了。因此,上面程序执行时会报出如下错误:

    IndentationError: expected an indented block

    if 条件后的条件执行体一定要缩进。只有缩进后的代码才能算条件执行体。

    接下来读者会产生一个疑问:代码块(条件执行体)到底要缩进多少呢?这个随意。你可以缩进 1 个空格、2 个空格、3 个空格…… 或 1 个 Tab 位,这都是符合语法要求的。但从编程习惯来看,Python 通常建议缩进 4 个空格。

    有些时候,Python 解释器不会报错,但并不代表程序没有错误。例如如下代码:

    s_age = input("请输入您的年龄:")
    age = int(s_age)
    if age > 20 :
        print("年龄已经大于20岁了")
    print("20岁以上的人应该学会承担责任...")

    解释执行上面程序,程序不会报任何错误。但如果输入一个小于 20 的年龄,则可看到如下运行过程:

    请输入您的年龄:12
    20岁以上的人应该学会承担责任...
    从运行过程可以看出,我们输入的年龄明明小于20,但运行结果还是会打印“20岁以上…”。这是为什么呢?就是因为这条 print 语句没有缩进。如果这行代码不缩进,那么 Python 就不会把这行代码当成条件执行体,它就不受 if 条件的控制,因此无论用户输入什么年龄,print 语句总会执行。

    如果忘记正确地缩进,很可能导致程序的运行结果超出我们的预期。例如如下程序:

    #定义变量b,并为其赋值
    b = 5
    if b > 4 :
        #如果b>4,则执行下面的条件执行体,只有一行代码作为代码块
        print("b大于4")
    else:
        #否则,执行下面的条件执行体,只有一行代码作为代码块
        b -= 1
    #对于下面代码而言,它己经不再是条件执行体的一部分,因此总会执行
    print("b不大于4")

    上面代码中,最后一行代码总会执行,因为这行代码没有缩进,因此它就不属于 else 后的条件执行体,else 后的条件执行体只有 b -= 1 这一行代码。

    如果要让 print("b不大于4") 语句也处于 else 控制之下,则需要让这行代码也缩进 4 个空格。

    if、else、elif 后的条件执行体必须使用相同缩进的代码块,将这个代码块整体作为条件执行体。当if后有多条语句作为条件执行体时,如果忘记了缩进某一行代码,则会引起语法错误。看下面代码:

    # 定义变量c,并为其赋值
    c = 5
    if c > 4:
        # 如果c>4,则执行下面的执行体,将只有c--一行代码为执行体
        c -= 1
    # 下面是一行普通代码,不属于执行体
    print("c大于4")
    # 此处的else将没有if语句,因此编译出错
    else
        # 否则,执行下面的执行体,只有一行代码作为代码块
        print("c不大于4")

    在上面代码中,因为 if 后的条件执行体的最后一条语句没有缩进,所以系统只把 c-= 1 一行代码作为条件执行体,当 c-=1 语句执行结束后,if 语句也就执行结束了。后面的 print("c大于4") 己经是一行普通代码,不再属于条件执行体,从而导致 else 语句没有if语句,引发编译错误。

    运行上面代码,将看到如下错误:

    SyntaxError : invalid syntax

    不要随意缩进

    需要说明的是,虽然 Python 语法允许代码块随意缩进 N 个空格,但同一个代码块内的代码必须保持相同的缩进,不能一会缩进 2 个空格,一会缩进 4 个空格。

    例如如下代码:

    s_age = input("请输入您的年龄:")
    age = int(s_age)
    if age > 20 :
        print("年龄已经大于20岁了")
         print("20岁以上的人应该学会承担责任...")

    上面程序中第 2 个 print 语句缩进了 5 个空格,在这样的情况下,Python 解释器认为这条语句与前一条语句(缩进了 4 个空格)不是同一个代码块(这就是游标卡尺笑话的由来),因此 Python 解释器会报错。运行上面代码,将会报出如下错误:

    IndentationError : unexpected indent

    把代码改为如下形式:

    s_age = input("请输入您的年龄:")
    age = int(s_age)
    if age > 20 :
        print("年龄已经大于20岁了")
       print("20岁以上的人应该学会承担责任...")

    上面程序中第二条 print 语句只缩进了 3 个空格,它与前一条 print 语句(缩进了 4 个空格)同样不属于同一个代码块,因此 Python 解释器还是会报错。运行上面代码,则会报出如下错误:

    IndentationError: unindent does not match any outer indentation level

    通过上面介绍可以看出,Python 代码块中的所有语句必须保持相同的缩进,既不能多,也不能少。

    不要遗忘冒号

    从 Python 语法解释器的角度来看,Python 冒号精确表示代码块的开始点这个功能不仅在条件执行体中如此,后面的循环体、方法体、类体全部遵守该规则。

    如果程序遗忘了冒号,那么 Python 解释器就无法识别代码块的开始点。例如如下程序:

    age = 24
    if age > 20
        print("年龄已经大于20岁了")
        print("20岁以上的人应该学会承担责任...")

    上面 if 条件后忘了写冒号,因此 Python 就不知道条件执行体的开始点。运行上面程序,将会报出如下错误:

    SyntaxError : invalid syntax
    if 条件的类型

    从前面的示例可以看到,Python 执行 if 语句时,会判断 if 条件是 True 还是 False 。那么 if 条件是不是只能使用 bool 类型的表达式呢?

    不是。if 条件可以是任意类型,当下面的值作为 bool 表达式时,会被解释器当作 False 处理:

    False、None、0、""、()、[]、{}

    从上面介绍可以看出,除了 False 本身,各种代表“空”的 None、空字符串、空元组、空列表、空字典都会被当成 False 处理。

    例如如下代码:

    s = ""
    if s :
        print('s不是空字符串')
    else:
        print('s是空字符串')
    # 定义空列表
    my_list = []
    if my_list:
        print('my_list不是空列表')
    else:
        print('my_list是空列表')
    # 定义空字典
    my_dict = {}
    if my_dict:
        print('my_dict不是空字典')
    else:
        print('my_dict是空字典')

    从上面的粗体字代码可以看出,这些 if 条件分别使用了 str 类型、list 类型、dict 类型,由于这些 str、list、dict 都是空值,因此 Python 会把它们当成 False 处理。

    专题推荐:if-else条件语句
    上一篇:Python中的返回值是什么 下一篇:Python pass语句及其作用

    相关文章推荐

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网