内容正文:
第 5 章
流 程 控 制
2
学习目标:
掌握程序流程图的绘制方法
了解条件语句
了解循环语句
了解多分支选择语句
了解跳转语句
思政内涵:
正确的判断和正确的流程是获得正确结果的关键。人生道路也是一样,只 有在人生道路中做出正确的决策判断,才能有良好的收获,广大学子应树立正 确的世界观、人生观和价值观。
第 5 章 流程控制
3
5.1 程序流程
计算机程序的执行过程就是程序流程。和其他编程语言一样,按照执行流 程划分,程序可分为三大结构,即顺序结构、分支(选择)结构和循环结 构。
顺序结构:自上而下依次执行每一条代码,不重复执行任何代码,也不 跳过任何代码。
分支结构:也称为选择结构,在运行过程中根据条件的不同可能会执行 不同的程序分支。
循环结构:在运行过程中有些代码需要反复执行。
程序流程可以用文字描述,也可以用图形描述。书写文字比较方便,但不 够直观;绘制图形比较麻烦,但看起来直观。流程图是一种普遍的程序控制流 程表示法,即使用图形符号来表示程序的执行过程。为了实现流程图的可读性
4
及一致性,通常使用美国国家标准学会制定的统一图形符号绘制流程图。常见 的流程图符号如表 5-1 所示。
表 5-1 常见的流程图符号
符号 名称 含义
端点、中断 标准流程的开始与结束,每个流程图只有一个起始点
进程 要执行的处理
判断 决策或判断
数据 表示数据的输入/输出
流向 表示执行的方向与顺序
文档 以文件的方式输入/输出
联系 同一流程图中从一个进程到另一个进程的交叉引用
第 5 章 流程控制
5
使用表 5-1 中带方向的箭头和相应的说明文字连接各图标,就形成了程序流
程图,如图5.1 所示。
图 5.1
程序流程图
6
5.2 条件语句
在编写代码时,可以使用条件语句为程序增设条件,使程序产生分支,进 而有选择地执行不同的语句。条件语句包括if 语句、if-else 语句、if-elif-else 语句等。
5.2.1 if 语句
if 语句是单分支条件语句,语法格式如下。
if 逻辑条件:
...
其中,“逻辑条件”一般是一个比较表达式,如果该表达式返回 True,则会 执行冒号下面缩进的代码块;如果该表达式返回 False,则会直接跳过冒号下面 缩进的代码块,按照顺序执行后面的程序。单分支流程图如图 5.2 所示。
第 5 章 流程控制
7
图 5.2 单分支流程图
下面使用if 语句实现一个考试成绩评估的程序,示例代码如程序段 P5.1 所 示。
8
P5.1 单分支条件语句
score = 100 if score > 60:
print("成绩合格,你很棒!") print("欢迎来到Python 语言课堂")
运行代码,输出结果如下。
成绩合格,你很棒!
欢迎来到Python 语言课堂
由以上示例的输出结果可知,程序执行了if 语句的代码段。
将以上示例中变量score 的值修改为 50,再次运行代码,输出结果如下。
欢迎来到Python 语言课堂
由该输出结果可知,修改score 的值后,程序未执行if 语句的代码段。
第 5 章 流程控制
9
5.2.2 if-else 语句
if-else 语句是双分支条件语句,语法格式如下。
if 逻辑条件:
...
else:
...
当逻辑条件表达式返回 True 时,会执行 if 后面的代码块;当条件表达式返 回False 时,会执行else 后面的代码块。双分支流程图如图 5.3 所示。
10
图 5.3 双分支流程图
使用if-else 语句编写的考试成绩评估程序示例代码如程序段P5.2 所示。
P5.2 双分支条件语句
score = 100
if score > =60:
第 5 章 流程控制
11
print("考试合格")
else:
print("考试不及格")
运行代码,输出结果如下。
考试合格
将以上示例中变量score 的值修改为 50,再次运行代码,输出结果如下。
考试不及格
通过比较两次的输出结果可知,程序第一次执行了if 语句的代码段,打印 了“考试合格”;修改 score 的值后,执行了else 语句的代码段,打印了“考 试不及格”。
12
5.2.3 if-elif-else 语句
if-elif-[elif]else 语句是多分支条件语句,语法格式如下。
if 逻辑条件 1:
... # 当条件 1 为True 时执行的代码
elif 逻辑条件 2:
... # 当条件 2 为True 时执行的代码
[elif 逻辑条件n:]
... # 当条件n 为True 时执行的代码
else:
... # 当所有条件都为False 时执行的代码
elif 指的是“else if”,表示带有条件的 else 子句。多向选择的语法看似很 复杂,其实非常简单,它只是在双向选择的基础上增加了一个或多个选择分支。
第 5 章 流程控制
13
使用多分支条件语句编写的考试成绩评估程序示例代码如程序段P5.3 所示。
P5.3 多分支条件语句
score = 90
if score >=90:
print("考试优秀") elif 80<=score <90:
print("考试良好") elif 70<=score <80:
print("考试中等") elif 60<=score <70:
print("考试及格")
else:
print("考试不及格")
14
程序可以根据score 的值做出“成绩优秀”“成绩良好”“成绩中等”“成绩 及格”和“成绩不及格”5 个等级的评估。
5.2.4 if 语句嵌套
if 语句是可以嵌套使用的,语法格式如下。
if 条件 1: if 条件 2:
... # 当条件 1 和条件 2 都为True 时执行的代码
else:
# 当条件 1 为True、条件 2 为False 时执行的代码
...
else:
if 条件 2:
第 5 章 流程控制
15
...
# 当条件 1 为 False、条件 2 为True 时执行的代码
else:
... # 当条件 1 和条件 2 都为False 时执行的代码
对于这种结构,我们不需要死记硬背,只需要从外到内根据条件一个个地 进行判断就可以了。示例代码如程序段P5.4 所示。
P5.4 if 语句的嵌套
gender = "女" height = 172
if gender == "男":
if height > 170:
print("高个子男生")
else:
16
print("矮个子男生")
else:
if height > 170:
print("高个子女生")
else:
print("矮个子女生")
运行代码,输出结果如下。
高个子女生
在以上代码中,性别 gender 是外层条件,身高 height 是内层条件。修改 变量gender 为“男”,修改 height 为 160,执行代码,输出结果如下。
矮个子男生
第 5 章 流程控制
17
5.3 循环语句
在程序开发过程中有些代码需要重复执行。Python 提供了循环语句,使用 该语句能以简洁的代码实现重复操作。Python 中的循环语句有两种,分别是 while 循环和for 循环。
5.3.1 while 循环语句
while 循环语句的语法格式如下。
while 条件表达式: 代码块
其中,代码块是指缩进格式相同的多行代码,在循环结构中,它又称为循 环体。
18
while 循环流程图如图 5.4 所示。
图 5.4 while 循环流程图
使用while 循环计算 1+2+3+…+100 的和,示例代码如程序段 P5.5 所示。
第 5 章 流程控制
19
P5.5 while 循环
i=1 sum=0
while i<=100:
sum +=i i +=1
print(sum)
运行代码,输出结果如下。
5050
在以上示例中,变量 i 是循环因子,其初始值为 1,会随循环次数累加;变 量sum 是所求的和,其初始值为 0。循环结束,执行循环之后的打印语句,输 出sum 的值。
20
while 循环还常用来遍历列表、元组和字符串,因为它们都支持通过下标索 引获取指定位置的元素。下面演示使用while 循环遍历字符串变量,示例代码 如程序段P5.6 所示。
P5.6 遍历字符串
my_char="http://www.ahu.net/python/" i = 0;
while i<len(my_char): print(my_char[i],end="") i = i + 1
运行代码,输出结果如下。
http://www.ahu.net/python/
若希望程序可以一直重复操作,则可以将循环条件的值设为 True,如此便
第 5 章 流程控制
21
进入无限循环。虽然在实际开发中有些程序需要无限循环(如游戏的主要程序、 操作系统的监控程序等),但无限循环会占用大量内存,影响程序和系统的性能, 开发者需酌情使用。
5.3.2 for 循环语句
for 循环常用于遍历字符串、列表、元组、字典、集合等序列类型,逐个获取 序列中的各个元素。
for 循环语句的语法格式如下。
for 迭代变量 in 字符串/列表/元组/字典/集合: 代码块
其中,迭代变量用于存放从序列类型变量中读取出来的元素,所以一般不 会在循环中对迭代变量手动赋值;代码块是指具有相同缩进格式的多行代码,
22
和循环结构联用,因此代码块又称为循环体。目标对象的元素个数决定了循环 的次数,目标对象中的元素被访问完之后循环结束。
for 循环流程图如图 5.5 所示。
图 5.5
for 循环流程图
第 5 章 流程控制
23
使用for 循环遍历字符串的示例代码如程序段P5.7 所示。
P5.7 for 循环遍历字符串
my_char = "http://www.ahu.net/python/" for ch in my_char:
print(ch,end="")
运行代码,输出结果如下。
http://www.ahu.net/python/
使用for 循环进行数值计算的示例代码如程序段P5.8 所示。
P5.8 for 循环计算
print("计算 1+2+…+100 的结果为:") result = 0
for i in range(101):
24
result += i
print(result)
运行代码,输出结果如下。
计算 1+2+…+100 的结果为:
5050
上面的代码中,使用了 range()函数,此函数是 Python 内置函数,用于生 成一系列连续整数,多用于for 循环中。
当用for 循环遍历列表或元组时,其迭代变量会先后被赋值为列表或元组 中的每个元素并执行一次循环体。示例代码如程序段P5.9 所示。
P5.9 for 循环遍历列表
my_list = [1,2,3] for ele in my_list:
第 5 章 流程控制
25
print('ele =', ele)
运行代码,输出结果如下。
ele = 1
ele = 2
ele = 3
在以上代码中,把遍历的列表改成元组,就可以使用 for 循环遍历元组, 读者可以自己修改代码练习。
当用for 循环遍历字典时,其迭代变量会先后被赋值为字典的每个元素的 键值并执行一次循环体。示例代码如程序段P5.10 所示。
P5.10 for 循环遍历字典
my_dict = {'python 教程':"http://www.ahu.net/python/",\ 'shell 教程':"http://www.ahu.net/shell/",\
26
'java 教程':"http://www.ahu.net/java/"}
for ele in my_dict: print('ele =', ele)
运行代码,输出结果如下。
ele = python 教程 ele = shell 教程 ele = java 教程
5.3.3 循环嵌套语句
循环之间可以互相嵌套,进而实现更为复杂的逻辑。循环嵌套按不同的循 环语句可以分为while 循环嵌套和for 循环嵌套。
第 5 章 流程控制
27
1. while 循环嵌套
while 循环嵌套是指while 语句中嵌套了while 或for 语句。以 while 语句 中嵌套while 语句为例,while 循环嵌套的语法格式如下。
while 条件 1:
条件 1 成立执行的语句
...
while 条件 2:
条件 2 成立执行的语句
...
下面使用while 循环嵌套打印一个九九乘法表,示例代码如程序段P5.11 所示。
28
P5.11 while 循环嵌套
j = 1
while j <= 9:
i = 1
while i <= j:
print(f'{i}*{j}={j*i}', end='\t') i += 1
print() j += 1
运行代码,输出结果如下。
1*1=1
1*2=2
1*3=3
2*2=4
2*3=6
3*3=9
第 5 章 流程控制
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72
9*9=81
29
2. for 循环嵌套
for 循环嵌套是指for 语句中嵌套了while 或for 语句。以for 语句中嵌套 for 语句为例,for 循环嵌套的语法格式如下。
for i in 相关容器(初始位置,最终位置,遍历步调):
... # 相关遍历要求代码
30
for j in 相关容器(初始位置,最终位置,遍历步调):
... # 相关遍历要求代码
下面使用for 循环嵌套打印一个数字金字塔,示例代码如程序段P5.12 所 示。
P5.12 for 循环嵌套
layer = int(input("请输入您想打印的数字三角形的层数:")) for i in range(1, layer + 1):
for j in range(1,i + 1): num = j print(num,end=" ")
j += 1
i += 1
print("")
第 5 章 流程控制
31
运行代码,输入数据,输出结果如下。
请输入您想打印的数字三角形的层数:5
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
5.4 多分支选择语句
Python 编程语言正在不断发展,每次更新都会添加新的特性和功能, Python 3.10 中增加了多分支选择语句,也称为match-case 语句,允许在多 个条件下控制程序流程。match-case 语句的语法格式如下。
32
match parameter:
case first :
do_something(first) case second :
do_something(second)
...
...
case n :
do_something(n) case _ :
nothing_matched_function()
match-case 语句使用match 关键字,通过参数parameter 与case 关键
第 5 章 流程控制
33
字后的参数匹配,如果匹配成功,则执行对应的case 代码段,“_”是通配符, 当没有任何匹配项时运行该代码段。
多分支选择的示例代码如程序段P5.13 所示。
P5.13 多分支选择
day=input("请输入一个数字(1~7):") match day:
case "1":
print("星期一")
case "2":
print("星期二")
case "3":
print("星期三")
case "4":
34
print("星期四")
case "5":
print("星期五")
case "6":
print("星期六")
case "7":
print("星期日") case _:
print("请输入一个有效数字!")
运行代码,根据提示输入数据,输出结果如下。
请输入一个数字(1~7):7 星期日
第 5 章 流程控制
35
5.5 跳转语句
循环语句在条件满足的情况下会一直执行,但在某些情况下需要跳出循环, 例如,实现音乐播放器循环模式的切歌功能等。Python 提供了控制循环的跳转 语句:break 语句和 continue 语句。
5.5.1 break 语 句
break 语句用于结束循环,若循环中使用了 break 语句,当程序执行到 break 语句时就会结束循环;若循环嵌套使用了 break 语句,当程序执行到 break 语句时就会结束本层循环。break 语句通常与if 语句配合使用,以便在
36
条件满足时结束循环。
例如,在使用for 循环遍历字符串"python"时,遍历到字符"o"就使用break 语句结束循环,具体代码如程序段P5.14 所示。
P5.14 break 语句
for ch in "python": if ch=="o":
break print(ch,end=" ")
运行代码,输出结果如下。
p y t h
从以上输出结果可以看出,程序没有输出字符"o"及后面的字符,说明当程 序遍历到字符"o"时跳出了整个循环,即结束了循环。
第 5 章 流程控制
37
5.5.2 continue 语句
continue 语句用于在满足条件的情况下跳出本次循环,该语句通常也与if 语句配合使用。例如,在使用 for 循环遍历字符串"python"时,遍历到字符"o" 就使用continue 语句跳出本次循环,具体代码如程序段P5.15 所示。
P5.15 continue 语句
for ch in "python": if ch=="o":
continue print(ch,end=" ")
运行代码,输出结果如下。
p y t h n
38
从以上输出结果可以看出,程序没有输出字符"o",说明当程序满足字符"o" 的条件时跳过了当次循环。
5.6 人机大战猜拳游戏程序设计案例
5.6.1 程序流程图
根据第 4 章计算思维设计的人机大战猜拳游戏的算法,可以画出程序流程
图。人机大战游戏程序流程图如图 5.6 所示。
第 5 章 流程控制
39
图 5.6
人机大战游戏程序流程图
40
5.6.2 程序设计
根据图 5.6 所示的流程图,编写人机大战猜拳游戏程序,代码如程序段 P5.16 所示。
P5.16 人机大战猜拳游戏程序
import random
handList = ['剪刀','石头','布']
personNumber = int(input("请选择:(剪刀-0;石头-1;布-2) 数字:")) personChoice = handList[personNumber]
computerNumber = random.randint(0,2) computerChoice = handList[computerNumber] if personChoice == computerChoice:
print("平局!")
第 5 章 流程控制
41
elif (personChoice == '剪刀' and computerChoice =="布"
or personChoice == '石头' and computerChoice =="剪刀" or personChoice == '布' and computerChoice =="石头"):
print("人赢了!")
else:
print("计算机赢了!")
以上程序是最基本的猜拳游戏实现代码。大家可以试着为程序增加一些新 的功能或设计人机交互界面等,通过实践提高编程能力。
$$