2024 Python3.10 系统入门+进阶(四):Python流程控制语句

一、程序结构

计算机在解决某个具体问题时,主要有3种情形,分别是顺序执行所有的语句、选择执行部分语句和循环执行部分语句。程序设计中的3种基本结构为顺序结构、选择结构和循环结构。这3种结构的执行流程如下图所示:
在这里插入图片描述
其中,第一幅图是顺序结构的流程图,编写完毕的语句按照编写顺序依次被执行;第二幅图是选择结构的流程图,它主要根据条件语句的结果选择执行不同的语句;第三幅图是循环结构的流程图,它是在一定条件下反复执行某段程序的流程结构,其中,被反复执行的语句称为循环体,决定循环是否终止的判断条件称为循环条件。本文之前编写的多数实例采用的都是顺序结构。例如,定义一个字符串类型的变量,然后输出该变量,代码如下:

name = 'Amo'
print(name)

选择结构和循环结构的应用场景:看过金庸的小说《射雕英雄传》的人,可能会记得,黄蓉与瑛姑见面时,曾出过这样一道数学题:"今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问几何?" 解决这道题,有以下两个要素:

  • 需要满足的条件是一个数,除以三余二,除以五余三,除以七余二。这就涉及条件判断,需要通过选择语句实现。
  • 依次尝试符合条件的数。这就需要循环执行,需要通过循环语句实现。

二、选择结构

2.1 最简单的if语句

Python 中使用 if 关键字来组成选择语句,简单的语法格式如下:

if 表达式:
   语句块

其中,表达式可以是一个单纯的布尔值或变量,也可以是比较表达式或逻辑表达式(例如:a > b and a != c),如果表达式为真,则执行 "语句块";如果表达式的值为假,就跳过 "语句块",继续执行后面的语句,这种形式的 if 语句相当于汉语里的关联词语 "如果……就……",其流程图如下图所示:
在这里插入图片描述
示例:判断一个数是否为偶数。

num = int(input('请输入一个数字:'))
# if num % 2 == 0:
if num & 1 == 0:
    print(f'{num}是偶数!')

2.2 if…else语句

如果遇到只能二选一的条件,例如,某大学毕业生到知名企业实习期满后留用,现在需要选择 Python 开发的方向,示意图如下图所示:
在这里插入图片描述
Python 中提供了 if…else 语句解决类似问题,其语法格式如下:

if 表达式:
    语句块1
else:
    语句块2

使用 if…else 语句时,表达式可以是一个单纯的布尔值或变量,也可以是比较表达式或逻辑表达式,如果满足条件,则执行 if 后面的语句块,否则,执行 else 后面的语句块,这种形式的选择语句相当于汉语里的关联词语 "如果……否则……",其流程图如下图所示:
在这里插入图片描述
示例:验证瑛姑给出的答案是否正确。

print("今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问几何?")
number = int(input("请输入瑛姑给出的数:"))  # 输入一个数
if number % 3 == 2 and number % 5 == 3 and number % 7 == 2:  # 判断是否符合条件
    print(number, "符合条件")
else:  # 不符合条件
    print(number, "不符合条件")

注意: 在使用 else 语句时,else 一定不可以单独使用,它必须和关键字 if 一起使用。

2.3 if…elif…else语句

大家平时在网上购物时,通常都有多种付款方式供大家选择,如下图所示:
在这里插入图片描述
上图中提供了3种付款方式,这时用户就需要从多个选项中选择一个。在开发程序时,如果遇到多选一的情况,则可以使用 if…elif…else 语句,该语句是一个多分支选择语句,通常表现为 "如果满足某种条件,就会进行某种处理,否则,如果满足另一种条件,则执行另一种处理……"。 if…elif…else 语句的语法格式如下:

if 表达式1:
    语句块1
elif 表达式2:
    语句块2
elif 表达式3:
    语句块3else:
    语句块n

使用 if…elif…else 语句时,表达式可以是一个单纯的布尔值或变量,也可以是比较表达式或逻辑表达式,如果表达式为真,执行语句;而如果表达式为假,则跳过该语句,进行下一个 elif 的判断,只有在所有表达式都为假的情况下,才会执行 else 中的语句。if…elif…else 语句的流程如下图所示:
在这里插入图片描述
注意: if 和 elif 都需要判断表达式的真假,而 else 则不需要判断;另外,elif 和 else 都必须与 if 一起使用,不能单独使用。

示例:使用 if…elif…else 多分支语句实现根据用户输入的玫瑰花的朵数输出其代表的含义,代码如下:

print("在古希腊神话中,玫瑰集爱情与美丽于一身,所以人们常用玫瑰来表达爱情。")
print("但是不同朵数的玫瑰花代表的含义是不同的。")
# 获取用户输入的朵数,并转换为整型
number = int(input("输入您想送几朵玫瑰花,小默会告诉您含义:"))
if number == 1:  # 判断输入的数是否为1,代表1朵
    # 如果等于1则输出提示信息
    print("1朵:你是我的唯一!")
elif number == 3:  # 判断是否为3朵
    print("3朵:I Love You!")
elif number == 10:  # 判断是否为10朵
    print("10朵:十全十美!")
elif number == 99:  # 判断是否为99朵
    print("99朵:天长地久!")
elif number == 108:  # 判断是否为108朵
    print("108朵:求婚!")
else:
    print("小默也不知道了!可以考虑送1朵、3朵、10朵、99朵或108朵呦!")

使用 if 选择语句时,尽量遵循以下原则:

  1. 当使用布尔类型的变量作为判断条件时,假设布尔型变量为 flag,较为规范的格式如下:
    if flag:  # 表示为真
    if not flag:  # 表示为假
    
    不符合规范的格式如下:
    if flag == True:
    if flag == False:
    
  2. 使用 "if 1 == a:" 这样的书写格式可以防止错写成 "if a = 1:" 这种形式,从而避免逻辑上的错误。

2.4 if语句的嵌套

前面介绍了3种形式的 if 选择语句,这3种形式的选择语句之间都可以互相嵌套。在最简单的 if 语句中嵌套 if…else 语句,形式如下:

if 表达式1:
    if 表达式2:
        语句块1
    else:
        语句块2

if…else 语句中嵌套 if…else 语句,形式如下:

if 表达式1:
    if 表达式2:
        语句块1
    else:
        语句块2
else:
    if 表达式3:
        语句块3
    else:
        语句块4

场景描述:国家质量监督检验检疫局发布的《车辆驾驶人员血液、呼气酒精含量阈值与检验》中规定:车辆驾驶人员血液中的酒精含量小于 20mg/100ml 不构成饮酒驾驶行为;酒精含量大于或等于 20mg/100m、小于 80mg/100ml 为饮酒驾车;酒精含量大于或等于 80mg/100ml 为醉酒驾车。现编写一段 Python 代码判断是否酒后驾车。

print("为了您和他人的安全,严禁酒后开车!")
proof = int(input("请输入每100毫升血液的酒精含量:"))  # 获取用户输入的酒精含量,并转换为整型
if proof < 20:  # 酒精含量小于20毫克,不构成饮酒行为
    print("您还不构成饮酒行为,可以开车,但要注意安全!")
else:  # 酒精含量大于或等于20毫克,已经构成饮酒驾车行为
    if proof < 80:  # 酒精含量小于80毫克,达到饮酒驾驶标准
        print("已经达到酒后驾驶标准,请不要开车!")
    else:  # 酒精含量大于或等于80毫克,已经达到醉酒驾驶标准
        print("已经达到醉酒驾驶标准,千万不要开车!")

在上面的代码中,应用了 if 语句的嵌套,其具体的执行流程如下图所示:
在这里插入图片描述
注意:

  1. 多分支结构,只要有一个分支被执行,其他分支都不会被执行
  2. 前一个条件被测试过,下一个条件相当于隐含着这个条件

2.5 条件表达式

我们从一个具体的例子切入本小节内容。假设现在有两个数字,我们希望获得其中较大的一个,那么可以使用 if else 语句,例如:

a = 3
b = 4
if a > b:
    max_value = a
else:
    max_value = b

但是 Python 提供了一种更加简洁的写法,如下所示:

max_value = a if a > b else b

这是一种类似于其它编程语言中三目运算符 ? : 的写法。Python 是一种极简主义的编程语言,它没有引入 ? : 这个新的运算符,而是使用已有的 if else 关键字来实现相同的功能。使用 if else 实现条件表达式的格式如下:

exp1 if condition else exp2

condition 是判断条件,exp1 和 exp2 是两个表达式。如果 condition 成立即结果为真,就执行 exp1,并把 exp1 的结果作为整个表达式的结果;如果 condition 不成立即结果为假,就执行 exp2,并把 exp2 的结果作为整个表达式的结果。前面的语句 max_value = a if a > b else b 的含义是:

  • 如果 a > b 成立,就把 a 作为整个表达式的值,并赋给变量 max_value;
  • 如果 a> b 不成立,就把 b 作为整个表达式的值,并赋给变量 max_value。

Python 条件表达式支持嵌套,如此可以构成更加复杂的表达式。在嵌套时需要注意 if 和 else 的配对,例如:

max_value = a if a > b else c if c > d else d
# 等价: max_value = a if a > b else (c if c > d else d)

使用 Python 条件表达式判断两个数字的关系:

C:\Users\amoxiang>python
Python 3.10.11 (tags/v3.10.11:7d4cc5a, Apr  5 2023, 00:38:17) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> a = int(input("Input a: "))
Input a: 100
>>> b = int(input("Input b: "))
Input b: 80
>>> print("a大于b") if a > b else (print("a小于b") if a < b else print("a等于b"))
a大于b

该程序是一个嵌套的条件表达式。程序先对 a>b 求值,如果该表达式为 True,程序就返回执行第一个表达式 print("a大于b"),否则将继续执行 else 后面的内容,也就是:

(print("a小于b") if a < b else print("a等于b")

进入该表达式后,先判断 a<b 是否成立,如果 a<b 的结果为 True,将执行 print("a小于b"),否则执行 print("a等于b")

三、循环结构

3.1 while循环

while 循环是通过一个条件来控制是否要继续反复执行循环体中的语句。语法如下:

while 条件表达式:
    循环体 # 说明:循环体是指一组被重复执行的语句

当条件表达式的返回值为真时,则执行循环体中的语句,执行完毕后,重新判断条件表达式的返回值,直到表达式返回的结果为假时,退出循环。while 循环语句的执行流程如下图所示:
在这里插入图片描述
我们用现实生活中的例子来理解 while 循环的执行流程。在体育课上,体育老师要求同学们沿着环形操场跑圈,要求当听到老师吹的哨子声时就停下来。同学们每跑一圈,可能会请求一次老师吹哨子。如果老师吹哨子,则停下来,即循环结束,否则继续跑步,即执行循环。下面通过一个具体的实例来解决应用场景中的第二个要素:依次尝试符合条件的数,此时,需要用到第一个要素确定是否符合条件。

助力瑛姑 ①:while循环版解题法。 使用 while 循环语句实现从0开始依次尝试符合条件的数,直到找到符合条件的数时,才退出循环。具体的实现方法是:首先定义一个用于存储数据的变量 number 和一个作为循环条件的变量 flag(默认值为真),然后编写 while 循环语句,在循环体中,将变量 number 的值加1,并且判断 number 的值是否符合条件,当符合条件时,将变量 flag 设置为假,从而退出循环。具体代码如下:

print("今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问几何?")
flag = True  # 作为循环条件的变量
number = 0  # 赋予初始的数据为0
while flag:
    if number % 3 == 2 and number % 5 == 3 and number % 7 == 2:  # 判断是否符合条件
        print("答曰:这个数是", number)  # 输出符合条件的数
        flag = False  # 将循环条件的变量赋值为否
    number += 1  # 数据加1

运行程序,将显示如下图所示的效果:
在这里插入图片描述
注意:在使用 while 循环语句时,一定不要忘记添加将循环条件改变为 False 的代码(例如上述中的第7行代码一定不能少),否则,将产生死循环。

3.2 for循环

for 循环是一个依次重复执行的循环。通常适用于枚举或遍历序列,以及迭代对象中的元素。语法如下:

for 迭代变量 in 可迭代对象:
    循环体

其中,迭代变量用于保存读取出的值;可迭代对象是指可以被迭代遍历的对象,在 Python 中常见的数据类型如 列表(list)、元组(tuple)、字典(dictionary)、集合(set) 等都属于可迭代对象;循环体为一组被重复执行的语句。for 循环语句的执行流程如下图所示:
在这里插入图片描述
我们用现实生活中的例子来理解 for 循环的执行流程。在体育课上,体育老师要求同学们排队进行踢毽球测试,每个同学一次机会,毽球落地则换另一个同学,直到全部同学都测试完毕,即循环结束。

补充知识点:range()函数——生成器函数。 range() 函数用于生成一个新的 range 对象,多用于 for 循环语句中,用于生成指定范围的整数。range() 函数的语法格式如下:

range(start, stop[, step])

参数说明:

  • start:表示起始整数(包含起始整数),默认起始值为0,起始整数可以省略,如果省略则表示从0开始;
  • end:表示结束整数(但不包括该值,如 range(7) 得到的值为 0~6,不包括7),结束数值不能省略。当 range() 函数中只有一个参数时,即表示指定计数的结束值。结束整数可以大于0,也可以小于或等于0,但是结束整数小于或等于0时,生成的 range 对象是不包含任何元素的;
  • step:表示步长,即两个数之间的间隔,参数 step 可以省略,如果省略则表示步长为1。例如,range(1,7) 将得到 1,2,3,4,5,6
  • 返回值:返回一个 range 对象。

注意:

  1. range() 函数接收的参数必须是整数,不能是浮点数等其他数据类型,否则会提示类型错误。
  2. 在使用 range() 函数时,如果只有一个参数,那么表示指定的是 stop 结束整数;如果是两个参数,则表示指定的是 start 开始整数和 end 结束整数;只有三个参数都存在时,最后一个参数才表示 step 步长。

示例1:根据提供的参数生成一个 range 对象。

C:\Users\amoxiang>python
Python 3.10.11 (tags/v3.10.11:7d4cc5a, Apr  5 2023, 00:38:17) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print(range(15))
range(0, 15)
>>> print(range(50, 100, 1))
range(50, 100)
>>> print(range(50, 100, 10))
range(50, 100, 10)

示例2:for 循环结合 range() 函数进行数值循环。

C:\Users\amoxiang>python
Python 3.10.11 (tags/v3.10.11:7d4cc5a, Apr  5 2023, 00:38:17) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> for i in range(1, 3):
...     print(i)
...
1
2
>>> for i in range(1, 10, 2):
...     print(i, end=' ')
...
1 3 5 7 9 >>>

示例3:遍历字符串。使用 for 循环语句除了可以循环数值,还可以逐个遍历字符串,例如,下面的代码可以将横向显示的字符串转换为纵向显示:

C:\Users\amoxiang>python
Python 3.10.11 (tags/v3.10.11:7d4cc5a, Apr  5 2023, 00:38:17) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> s1 = '腹有读书气自华'
>>> print(s1)  # 横向显示
腹有读书气自华
>>> for ch in s1:
...     print(ch)  # 纵向显示
...
腹
有
读
书
气
自
华
>>>

说明: for 循环语句还可以用于迭代(遍历)列表、元组、集合和字典等,具体的方法将在后续文章中进行介绍。

3.3 循环嵌套

在 Python 中,允许在一个循环体中嵌入另一个循环,这称为循环嵌套。例如,在电影院找座位号,需要知道第几排第几列才能准确找到自己的座位号,假如寻找下图所示的在第二排第三列座位号,首先寻找第二排,然后在第二排再寻找第三列,这个寻找座位的过程就类似循环嵌套。
在这里插入图片描述
在 Python 中,for 循环和 while 循环都可以进行循环嵌套。例如,在while 循环中套用 while 循环的格式如下:

while 条件表达式1:
    while 条件表达式2:
        循环体2
    循环体1

在 for 循环中套用 for 循环的格式如下:

for 迭代变量1 in 对象1:
    for 迭代变量2 in 对象2:
        循环体2
    循环体1

在 while 循环中套用 for 循环的格式如下:

while 条件表达式:
    for 迭代变量 in 对象:
        循环体2
    循环体1

在 for 循环中套用 while 循环的格式如下:

for 迭代变量 in 对象:
    while 条件表达式:
        循环体2
    循环体1

除了上面介绍的4种嵌套格式外,还可以实现更多层的嵌套,因为与上面的嵌套方法类似,这里就不再一一列出了。使用嵌套的 for 循环打印九九乘法表,代码如下:

for i in range(1, 10):  # 输出9行
    for j in range(1, i + 1):  # 输出与行数相等的列
        print(str(j) + "×" + str(i) + "=" + str(i * j) + "\t", end='')
    print('')

上述的代码使用了双层 for 循环(循环流程如下图所示),第一个循环可以看成是对乘法表行数的控制,同时也是每一个乘法公式的第二个因数;第二个循环控制乘法表的列数,列数的最大值应该等于行数,因此第二个循环的条件应该是在第一个循环的基础上建立的。
在这里插入图片描述
程序运行结果如下图所示:

3.4 跳转语句

当循环条件一直满足时,程序将会一直执行下去,就像一辆迷路的车,在某个地方不停地转圈。如果希望在中间离开循环,也就是 for 循环结束重复之前,或者 while 循环找到结束条件之前。有两种方法来做到:

  1. 使用 continue 语句直接跳到循环的下一次迭代。
  2. 使用 break 完全中止循环。

3.4.1 break语句

break 语句可以终止当前的循环,包括 while 和 for 在内的所有控制语句。以独自一人沿着操场跑步为例,原计划跑10圈。可是在跑到第2圈的时候,遇到自己的女神或者男神,于是果断停下来,终止跑步,这就相当于使用了 break 语句提前终止了循环。break 语句的语法比较简单,只需要在相应的 while 或 for 语句中加入即可。在 while 语句中使用 break 语句的形式如下:

while 条件表达式1:
    执行代码
    if 条件表达式2:
        break

其中,条件表达式2用于判断何时调用 break 语句跳出循环。在 while 语句中使用 break 语句的流程如下图所示:
在这里插入图片描述
在 for 语句中使用 break 语句的形式如下:

for 迭代变量 in 可迭代对象:
    if 条件表达式:
        break

其中,条件表达式用于判断何时调用 break 语句跳出循环。在 for 语句中使用 break 语句的流程如下图所示:
在这里插入图片描述
示例:

print("今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问几何?")
for number in range(100):
    if number % 3 == 2 and number % 5 == 3 and number % 7 == 2:  # 判断是否符合条件
        print("答曰:这个数是", number)  # 输出符合条件的数
        break  # 跳出for循环

未添加 break 语句时的效果:
在这里插入图片描述
添加 break 语句时的效果:
在这里插入图片描述
说明: break 语句一般会结合 if 语句进行搭配使用,表示在某种条件下,跳出循环。如果使用嵌套循环,break 语句将跳出最内层的循环。

3.4.2 continue语句

continue 语句的作用没有 break 语句强大,它只能终止本次循环而提前进入到下一次循环中。仍然以独自一人沿着操场跑步为例,原计划跑步10圈。当跑到第2圈一半的时候,遇到自己的女神或者男神也在跑步,于是果断停下来,跑回起点等待,制造一次完美邂逅,然后从第3圈开始继续。continue 语句的语法比较简单,只需要在相应的 while 或 for 语句中加入即可。

continue 语句一般会与 if 语句搭配使用,表示在某种条件下,跳过当前循环的剩余语句,然后继续进行下一轮循环。如果使用嵌套循环,continue 语句将只跳过最内层循环中的剩余语句。

在 while 语句中使用 continue 语句的形式如下:

while 条件表达式1:
    执行代码
    if 条件表达式2:
        continue

其中,条件表达式2用于判断何时调用 continue 语句跳出循环。在 while 语句中使用 continue 语句的流程如下图所示:
在这里插入图片描述
在 for 语句中使用 continue 语句的形式如下:

for 迭代变量 in 可迭代对象:
    if 条件表达式:
        continue

其中,条件表达式用于判断何时调用 continue 语句跳出循环。在 for 语句中使用 continue 语句的流程如下图所示:
在这里插入图片描述
场景模拟:几个好朋友一起玩逢七拍腿游戏,即从1开始依次数数,当数到包含7的数或7的倍数时,则不报出该数,而是拍一下腿。现在编写程序,从1数到99,假设每个人都没有出错,计算一共要拍多少次腿。

total = 99  # 记录拍腿次数的变量
for number in range(1, 100):  # 创建一个从1到100(不包括)的循环
    if number % 7 == 0:  # 判断是否为7的倍数
        continue  # 继续下一次循环
    else:
        s1 = str(number)  # 将数值转换为字符串
        if '7' in s1:  # 判断是否以数字是否包含7
            continue  # 继续下一次循环
    total -= 1  # 可拍腿次数-1
print("从1数到99共拍腿", total, "次。")  # 显示拍腿次数

3.5 else子句

循环可以和 else 配合使用,else 下方缩进的代码指的是当循环正常结束之后要执行的代码。 while 和 for 都可以配合 else 使用。举例:

for i in range(0):  # 可迭代对象没有迭代
    pass
else:
    print('ok')

for i in range(0, 10):
    break
else:
    print('ok')
for i in range(0, 10):
    continue
else:
    print('ok')

有上例可知,一般情况下,循环正常执行,只要当前循环不是被 break 打断的,就可以执行 else 子句,哪怕是 range(0) 也可以执行 else 子句。while 结合 else 的语法格式和用法与 for 循环一样,此处不再赘述,语法格式如下:

while 条件:
    条件成立重复执行的代码
else:
    循环正常结束之后要执行的代码

3.6 pass空语句

在 Python 中还有一个 pass 语句,表示空语句。它不做任何事情,一般起到占位作用。例如,在应用 for 循环输出1~10之间(不包括10)的偶数时,在不是偶数时,应用 pass 语句占个位置,方便以后对不是偶数的数进行处理。代码如下:

for i in range(1, 10):
    if i % 2 == 0:  # 判断是否为偶数
        print(i, end=' ')
    else:  # 不是偶数
        pass  # 占位符,不做任何事情

pass 语句和注释之间的区别在于:解释器会完全忽略注释,但不会忽略 pass 语句。

至此今天的学习就到此结束了,笔者在这里声明,笔者写文章只是为了学习交流,以及让更多学习Python语言的读者少走一些弯路,节省时间,并不用做其他用途,如有侵权,联系博主删除即可。感谢您阅读本篇博文,希望本文能成为您编程路上的领航者。祝您阅读愉快!


在这里插入图片描述

    好书不厌读百回,熟读课思子自知。而我想要成为全场最靓的仔,就必须坚持通过学习来获取更多知识,用知识改变命运,用博客见证成长,用行动证明我在努力。
    如果我的博客对你有帮助、如果你喜欢我的博客内容,请 点赞评论收藏 一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。
 编码不易,大家的支持就是我坚持下去的动力。点赞后不要忘了 关注 我哦!

  • 22
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Amo Xiang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值