条件语句

【Python】Python中的条件语句_缩进


导读

大家好,很高兴又和大家见面啦!!!

在上一篇内容中我们介绍了Python中运算符与注释的相关内容。下面我们先简单的回顾一下相关内容:

  • 在Python中我们可以通过快捷键Ctrl+/来进行快速注释,也可以通过三引号进行多行注释;
  • Python中的运算符总共有7大类:
  • 算术运算符:'+'、'-'、'*'、'/'、'%'、'**'、'//'
  • 关系运算符:'>'、'>='、'=='、'<='、'<'、'!='
  • 赋值运算符:'='、'+='、'-='、'*='、'/='、'%='、'**='、'//='、':='
  • 位运算符:'&'、'|'、'^'、'~'、'<<'、'>>'
  • 逻辑运算符:'and'、'or'、'not'
  • 成员运算符:'in'、'not in'
  • 身份运算符:'is'、'is not'

通过前面内容的介绍,我们已经对Python中的基础知识有了一个大致的了解,从今天的内容开始,我们将会开始进入Python中的语法学习。

Python中的基础语法主要有条件语句、循环语句、函数等内容,接下来我们会通过三个篇章分别介绍Python中的这三种基础语法。

在今天的内容中,我们将会介绍第一种基础语法——条件语句。下面我们就直接开始今天的内容吧!

一、基础概念

1.1 语句

在C语言中,由一个分号';'隔开的,就是一条语句。

但是在Python 通常是一行写完一条语句,但如果语句很长,我们可以使用反斜杠 '\' 来实现多行语句,如下所示:

# 语句
a = 10  # 这是一条语句
a = 123456789 + \
    234567891 + \
    345678912
# 上述内容为一条多行语句

需要注意的是多行语句实际上也是一条语句。

1.2 语句的分类:

语句可分为以下五类:

(1)表达式语句;(2)函数调用语句;(3)控制语句;(4)复合语句;(5)空语句;

条件语句属于控制语句的一种。

1.3 控制语句:

  1. 定义

用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成。

C语言中有九种控制语句,而Python中只有6种控制语句。

  1. 分类:

控制语句可以分为三大类——条件控制语句、循环执行语句、转向语句:

  • 条件判断语句也叫分支语句,用于通过特定的条件判断来选择具体执行的内容:
  • C语言中有两种分支语句——if语句、Switch语句(开关语句)
  • Python中只有一种分支语句——if语句
  • 循环执行语句,用于重复执行特定的语句内容:
  • C语言中有三种循环语句——do while语句、while语句、for语句
  • Python中只有两种循环语句——while语句、for语句
  • 转向语句,用于改变语句执行的逻辑:
  • C语言中有四种转向语句——break语句、goto语句、continue语句、return语句
  • Python中只有三中转向语句——break语句、continue语句、return语句

1.4 分支语句

在计算机语言中,选择结构的体现就是选择语句,选择语句也叫做条件语句,又叫做分支语句,是通过一条或多条语句的执行结果(True 或者 False)来决定执行的代码块,如下所示:

【Python】Python中的条件语句_if语句_02

上面所示的流程图中展现的是有两条分支的条件语句,当然在很多情况下条件语句不止两条分支,会存在三条及以上的分支。

在C语言中我们通过if……else语句以及Switch语句可以很好的通过计算机语言来描述这些分支,Python为了保证解决问题的方法只有一个,所以保留了if……else语句,舍弃了Switch语句,那么在Python中的if……else语句与C/C++中的会有什么区别呢?下面我们就一起来看看Python中的if语句。

二、if语句

在C/C++中if语句有三种语句形式:

  • 单分支语句——if……语句
  • 双分支语句——if……else语句
  • 多分支语句——if……else if……else语句

在C/C++的if语句中主要涉及两个关键字——if与else,因此我们在定义常量、变量以及标识符时其常量名、变量名以及标识符名是不能与这两个关键字重名的。

那同样的语句在Python中又会涉及到哪些关键字呢?

2.1 关键字

在前面我们介绍关键字时我们有说过通过关键字import引入keyword模版,再通过kwlist方法就能将Python中的关键字给打印出来,如下所示:

import keyword
print(keyword.kwlist)
# [
#     'False', 'True'——布尔值关键字
#     'None'——特殊常量关键字
#     'and',  'or', 'not'——逻辑运算符关键字
#     'in'——成员运算符关键字
#     'is'——身份运算符关键字
#     'import'——模版导入关键字
#     'if',  'elif', 'else'——分支语句关键字
#     'while', 'for'——循环语句关键字
#     'break', 'continue', 'return'——转向语句关键字
#     'def'——函数关键字
# 其它关键字
#     'as', 'assert', 'async', 'await', 'class',
#     'del', 'except', 'finally', 'from', 'global',
#     'lambda', 'nonlocal', 'pass', 'raise', 'try',  'with', 'yield'
# ]

这里我给大家将我们目前已经见过的关键字都给标注了出来,可以看到在不知不觉中我们已经接触了一大部分的Python中的关键字了。

当然现在不是我们应该感慨的时候,我们应该将注意力放在分支语句关键字上,在分支语句关键字中相比于C/C++而言,多了一个关键字——elif

大家可以大胆推测一下这个关键字时干嘛用的。没错它就是C/C++中的else if的一个组合关键字,它是用于多分支语句中进行条件判断的关键字。

因此Python的if语句中的三种语句形式为:

  • 单分支语句:if语句
  • 双分支语句:if……else语句
  • 多分支语句:if……elif……else语句

相比于C/C++而言多分支语句看起来更加的简洁一点,接下来我们就来好好认识一下这三种语句形式;

2.2 单分支语句

在单分支语句中,不管是C/C++还是Python,都是由关键字if来进行语句引导。下面我们来看一下这两种语言的语句格式:

我们先来看一下C/C++中的单分支语句格式。

if (1) {
		;
		;
	}

在C/C++中,单分支语句由3部分组成:

  1. if引导词——语句的入口,后面紧跟着判断语句。程序在运行到if这里时会停下来优先运行引导词后的判断语句的内容
  2. 判断语句——语句块的开门钥匙,位于引导词后的圆括号()中,后面紧跟着语句块。程序会根据判断语句的值来选择是否执行语句块中的内容:
  • 值为真——正常执行语句块中的内容
  • 值为假——不执行语句块中的内容
  1. if语句块——语句执行的具体内容,位于大括号{}内。在C/C++中,当语句块中只有一条语句时,可以省略大括号{}

在上面展示的格式中,1代表的就是判断语句,在计算机语言中只有0才代表假,非零为真,只有当判断语句为真时才能执行语句块中的内容;在语句块中的分号;表示的是语句块中所执行的一条语句,语句块中可以存在一条或多条语句,也可以是如上所示的空语句。

下面我们来看一下Python中的单分支语句格式:

if True:
    pass

在这个例子中,True就是语句的判断语句,前面有一个空格' '与引导词if进行分隔,后面需要接一个冒号':'表示判断语句的结束,第二行中的pass是Python中的关键字,意思是空语句,这里通过pass代表的是if语句的语句块中需要执行的内容,前面带有一次缩进;

2.2.1 两种语言的区别

在C/C++中,会通过圆括号()将判断语句的全部内容给括起来,会通过大括号{}将语句块的全部内容给括起来;

在Python中,判断语句不再使用圆括号(),而是将圆括号()改为了空格' '与冒号':'

  • 通过空格' '将引导词与判断语句给隔开
  • 通过冒号':'来结束判断语句

语句块的执行条件不变,仍然是值为真就执行语句块中的内容,值为假则绕过分支语句执行后续内容;

语句块则是由缩进来表示,引导词与语句块的缩进级别至少相差1。

2.2.2 行与缩进

通过缩进来表示语句块,对我们来说还是比较陌生的,所谓的缩进实际上就是代码开头的空格,正常情况下我们将四个空格也就是一个Tab称为一级缩进。下面我们通过一个例子来进一步理解Python中的缩进,如下所示:

# 缩进
if True:    # 无缩进
    if True:    # 一级缩进
        pass    # 二级缩进
    pass    # 一级缩进
pass    # 无缩进

在前面的介绍中我们有提到过,在Python中一行就代表一条语句,而对于条件语句、循环语句等这种特殊的语句格式,一条语句则是由引导词、判断语句与语句块组成。

在语句块中可以存在多条语句,在C/C++中,我们通过大括号'{}'来决定语句块的开始与结束,因此不需要担心语句内容不在语句块中;

但是在Python中舍弃了大括号在特殊语句中的这种用法,而是通过缩进来控制。以引导词这一行的缩进级别为起始点,下方语句中第一个同级别缩进语句为终点,这两行中间的内容就为语句块中的内容。如上例中:

  • 第一个if引导词的缩进级别为0,也就是无缩进,最后一个空语句的缩进级别也为0,因此这两行中间的内容全部都为语句块中的内容;
  • 在第二个if语句中,引导词所在的行对应的缩进级别为一级,第二个空语句的级别也为一级,因此这两行中间的内容全部都为语句块中的内容。

不难发现,缩进级别为0的if语句的语句块中的内容的缩进级别至少是1级,而缩进级别为1级的if语句的语句块中的内容的缩进级别至少是2级。

通过这个例子大家应该就能理解什么是缩进,以及如何通过缩进来控制语句块了。下面我们再来说一下缩进的一些注意事项:

  • 语句块的缩进空格数是可变的,不一定需要4个空格或者一个Tab:

【Python】Python中的条件语句_Python_03

在这个例子中我们就通过两个空格来表示一级缩进,通过两个Tab表示第二次缩进,可以看到并不影响程序的运行;

  • 同一个语句块中,缩进的空格数需要一致:

【Python】Python中的条件语句_if语句_04

此时我们将51行的空语句的缩进改为了4个空格也就是一个Tab,程序在运行时就出现了错误——IndentationError缩进错误。

因此当我们在写代码的过程中,建议使用Tab来表示缩进,这样可以避免很多不必要的麻烦。

2.2.3 形象理解

如果将代码的运行看做一条路的话,那么分支语句就是岔路口,单分支语句就是一条岔路口,双分支语句就是两条岔路口,多分支语句就是多条岔路口。

C/C++中的if、else if、else与Python中的if、elif、else这些引导词就是这些岔路口的路标,我们根据这个路标可以找到路口所设的关卡,这些关卡就好比一道密码门,每一道密码门中都会有相应的开门密码,这时程序就会面临三种情况:

  • 当我们满足该岔路口中关卡开启的条件时,我们才能继续沿着这条岔路口前行;
  • 当我们不满足时,我们只能去到下一个岔路口继续检验;
  • 当我们不满足所有岔路口中的关卡开启条件时,我们只能绕过这条路口继续前行

希望大家通过这个比喻能够更好的理解分支语句及其运行的过程。

2.3 双分支语句

有了对单分支语句的理解后,下面我们再来快速的认识一下Python中的双分支语句与多分支语句。

2.3.1 if……else……语句结构

双分支语句也就是在单分支语句的基础上多了一个分支语句,正常是通过if……else……的语句结构来实现,语句格式如下所示:

if True:
    pass
else:
    pass

和C/C++一样,在else分支中,else引导词后是不需要跟判断语句的。下面我们来该语句的一个实例运用:

【Python】Python中的条件语句_if语句_05

在这这个例子中,我们通过分支语句来判断输入的值与10之间的大小关系,可以看到,当其中一个分支语句块的内容执行后,另一个分支的语句块内容是不会执行的,这就是双分支语句的使用——用来解决只有两种情况的问题。

2.3.2 if……elif……语句结构

在双分支语句中,如果我们想将两种分支的判断内容表示出来,我们则可以通过if……elif……的语句结构来实现:

if True:
    pass
elif False:
    pass

这种语句结构可以用于当我们需要对某种特定条件指向特定操作的情况,如下所示:

【Python】Python中的条件语句_if语句_06

在这个例子中,我们只需要处理值为0和值在1~10这两种情况,这时我们就可以通过该结构来实现这两种分支的处理,不过需要说明的是,该语句虽然形式上是双分支语句,但实际上是属于多分支语句的内容。

2.4 多分支语句

多分支语句指的是if……elif……else……的语句结构,如下所示:

if 1 < 1:
    pass
elif 1 == 1:
    pass
else:
    pass

多分支语句一般用于至少有3种情况的问题,在C语言的多分支语句中,else语句部分可以有else if语句来替代,也就是说多分支语句还可以写成:

if (1) {
		;
		;
	}
	else if (2) {
		;
		;
	}
	else if (3) {
		;
		;
	}

这里的1、 2、 3分别指的是不同的判断语句,也就是执行该分支所对应的不同情况,每一个分支代码块中的空语句指的是相应代码块中可以执行的语句内容。

同理,在Python中,同样可以通过elif来替代else,如下所示:

if 1 < 1:
    pass
elif 1 == 1:
    pass
elif 1 > 1:
    pass

这种写法就是像三种情况的判断条件都给明确的展示了出来,并不会对结果的运行有任何的影响,并且在多分支语句中如果不需要执行else语句块中的内容,则可以省略else语句,如下所示:

【Python】Python中的条件语句_if语句_07

在这个例子中,我们只需要对输入的值为1、 2、 3这三种情况执行特殊的代码,对于其他输入的值,我们并不需要执行任何代码,此时,我们就可以通过省略else

相信有朋友已经发现了当我们在双分支语句中省略else时,该语句就变成了单分支语句,对三分支语句省略else时,该语句就变成了双分支语句,因此我们可以认为:

  • 单分支语句为特殊的双分支语句
  • if……elif……双分支语句为特殊的三分支语句

Python中的分支语句除了形式上与C/C++的分支语句有些差异外,其使用方法是不存在任何差异的,因此,Python中的分支语句同样有以下的使用方式:

  1. 嵌套使用——在分支语句的语句块中继续使用分支语句
  2. 省略else——当分支语句的语句块中存在转向语句或者是用不到else分支的情况时可以省略else

三、match…case语句

Python 3.10 增加了 match...case 的条件判断,不需要再使用一连串的 if-else 来判断了。match...case 提供了一种更强大的模式匹配方法。模式匹配是一种在编程中处理数据结构的方式,可以使代码更简洁、易读。

这里的match…case语句实际上就是C/C++中的Switch…case语句,其语法格式如下所示:

match subject:
    case <pattern_1>:
        <action_1>
    case <pattern_2>:
        <action_2>
    case <pattern_3>:
        <action_3>
    case _:
        <action_wildcard>

在match…case语句中的参数内容如下所示:

  • match语句后跟一个表达式,然后使用case语句来定义不同的模式。
  • case后跟一个模式,可以是具体值、变量、通配符等。
  • 可以使用if关键字在case中添加条件。
  • _通常用作通配符,匹配任何值。

下面我们直接通过一个例子来理解match语句的用法:

【Python】Python中的条件语句_缩进_08

可以看到,相比于Switch语句,match语句的使用会更加的方便。如果将Switch语句比作一条路,那么其case就是进入这条路的不同路口,而break语句则是将不同入口给隔离出来的,如果不使用break,程序则会从对应分支进去后,一路执行其他分支的内容,如下所示:

【Python】Python中的条件语句_缩进_09

但是在match语句中,则不需要借助break,每一个case都是一个独立的分支,并且case后面所跟的内容也不仅是整型常量表达式,还可以是变量、函数和通用符等内容。

matchcase并不是Python中的关键字,因此我们在不使用该语句时可以定义与matchcase同名的变量,有关match……case的更多内容,大家可以阅读原文【Python match...case 语句】这里我就不再继续展开。

结语

今天的内容到这里就全部结束了,在下一篇内容中我们将介绍《Python中的循环语句》,大家记得关注哦!如果大家喜欢博主的内容,可以点赞、收藏加评论支持一下博主,当然也可以将博主的内容转发给你身边需要的朋友。最后感谢各位朋友的支持,咱们下一篇再见!!!