任何一个复杂的系统都是由三种基本结构组成:顺序结构、分支结构、循环结构。下面对这几种结构进行介绍。
顺序结构最简单,程序从上到下依次执行,就如同生活中一条笔直的马路,一路畅通无阻,结构如图2-16所示。
图2-16 顺序结构图
【例2-9】 顺序结构实例演示。
'''把苹果装冰箱,分几步''' print('******程序开始******') print('1.打开冰箱门') print('2.把苹果放进去') print('3.把冰箱门关上') print('******程序结束******') 运行程序,输出如下: ******程序开始****** 1.打开冰箱门 2.把苹果放进去 3.把冰箱门关上 ******程序结束******
分支结构是指当程序执行到某步时,需根据实际情况选择性地执行某部分代码,就如同生活中的十字路口,需要根据具体情况选择走哪条路,每次只能选择一条路,不可能同时走多条路。
Python中的分支结构可以分为三种:单分支、双分支以及多分支。
if语句只有if没有else,只针对满足条件的情况进行一些额外操作,其执行流程如图2-17所示。
if语句的语法格式为
if语句表达式: 语句块
其中:
·语句块只有当表达式的值为True时才会执行;否则,程序就会直接跳过这个语句块,去执行紧跟在这个语句块之后的语句。
·这里的语句块,既可以包含多条语句,也可以只有一条语句。当语句块由多条语句组成时,要有统一的缩进形式,否则就会出现逻辑错误,即语法检查没错,但是结果却非预期。
if-else语句是一种双选结构,如果表达式结果为True则执行语句块1,否则执行语句块2。if-else语句的执行流程如图2-18所示。
图2-17 if语句执行流程
图2-18 if-else语句执行流程
if-else语句的语法格式为
if布尔表达式: 语句块1 else: 语句块2
其中:
·else语句不能独立存在。
·else语句的缩进与它所对应的if语句缩进相同。
如果需要在多组操作中选择一组执行,就会用到多选结构,即if-elif-else语句。该语句利用一系列布尔表达式进行检查,并在某个表达式为True的情况下执行相应的代码。if-elif-else语句的备选操作较多,但是有且只有一组操作被执行,其执行流程如图2-19所示。
if-elif-else语句的语法格式为
if条件表达式1: 语句体1 elif条件表达式2: 语句体2 … elif条件表达式n: 语句体n else: 语句体n+1
图2-19 if-elif-else语句执行流程
【例2-10】 演示了数字猜谜游戏。
number=7 guess=-1 print("数字猜谜游戏!") while guess!=number: guess=int(input("请输入你猜的数字:")) if guess==number: print("恭喜,你猜对了!") elif guess<number: print("猜的数字小了...") elif guess>number: print("猜的数字大了...")
运行程序,输出如下:
数字猜谜游戏! 请输入你猜的数字:8 猜的数字大了... 请输入你猜的数字:5 猜的数字小了... 请输入你猜的数字:6 猜的数字小了... 请输入你猜的数字:7 恭喜,你猜对了!
Python 3.10增加了match-case的条件判断,不需要再使用一连串的if-else来判断了。match后的对象会依次与case后的内容进行匹配,如果匹配成功,则执行匹配到的表达式,否则直接跳过,“_”可以匹配一切。
match-case语法格式如下:
match subject: case<pattern_1>: <action_1> case<pattern_2>: <action_2> case<pattern_3>: <action_3> case_: <action_wildcard>
其中,case_:类似于C和Java中的default:,当其他case都无法匹配时,匹配这条,保证永远会匹配成功。
【例2-11】 对比if-elif-else和match-case语句。
循环结构是指重复执行某些代码,直到条件不满足为止,就如同生活中的盘山公路,一圈圈绕行,直到到达目的地为止。
Python中实现循环结构的语句主要有两种:while循环和for循环。
while循环是一种判别式循环,当条件为True时,执行循环体;当条件为False时结束循环,执行循环后的操作。流程图如图2-20所示。
图2-20 while循环流程图
while循环的语法格式为
while循环继续条件: 循环体
其中:
·循环体可以是一个单一的语句或一组具有统一缩进的语句。
·每个循环都包含一个循环继续条件,即控制循环执行的布尔表达式,每次都计算该布尔表达式的值,如果它的计算结果为True,则执行循环体;否则,终止整个循环并将程序控制权转移到while循环后的语句。
·while循环是一种条件控制循环,它是根据一个条件的真假来控制的。
【例2-12】 利用while循环打印1~100的所有数字。
#循环的初始化条件 num=1 #当num小于100时,会一直执行循环体 while num<100: print("num=",num) #迭代语句 num+=1 print("循环结束!")
运行程序,输出如下:
num=1 num=2 num=3 ... num=97 num=98 num=99 循环结束!
从结果中会发现,程序只输出了1~99,却没有输出100。这是因为,当循环至num的值为100时,此时条件表达式为假(100<100),当然就不会再去执行代码块中的语句,因此不会输出100。
注意,在使用while循环时,一定要保证循环条件有变成假的时候,否则这个循环将成为一个死循环。所谓死循环,指的是无法结束循环的循环结构,例如将上面while循环中的num+=1代码注释掉,再运行程序会发现,Python解释器一直在输出“num=1”,永远不会结束(因为num<100一直为True),除非强制关闭解释器。
图2-21 for循环流程图
for循环是一种遍历型的循环,它会依次对某个序列中全体元素进行遍历,遍历完所有元素之后便终止循环,其流程图如图2-21所示。
for循环的语法格式为:
for控制变量in可遍历序列: 循环体
其中:
·关键字in是for循环的组成部分,而非运算符in。
·“可遍历序列”中保存了多个元素,如列表、元组、字符串等。
·“可遍历序列”被遍历处理,每次循环时,都会将“控制变量”设置为“可遍历序列”的当前元素,然后执行循环体。当“可遍历序列”中的元素被遍历一遍后,即没有元素可供遍历时,退出循环。
【例2-13】 利用for循环输出九九乘法口诀表。
for i in range(1,10): for j in range(1,i+1): print(f'{j} * {i}={i * j}',end='\t') print()
运行程序,输出如下:
1 * 1=1 1 * 2=2 2 * 2=4 1 * 3=3 2 * 3=6 3 * 3=9 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