![Python算法设计与分析从入门到精通](https://wfqqreader-1252317822.image.myqcloud.com/cover/845/44509845/b_44509845.jpg)
3.2 三大结构
Python语言中有三大程序结构,分别是顺序结构、条件分支结构和循环结构。一个复杂的程序中,常常同时包含这3种结构。
3.2.1 顺序结构
顺序结构就是按程序内语句的排列顺序运行程序的一种结构。我们之前所举的例子都是顺序结构的。这也是Python中最简单的结构。顺序结构的执行过程如图3.18所示。示例代码如下:
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P47_32789.jpg?sign=1738944850-yGzLCXpetiPvYE3oWuNDMKEhP0c3hY6o-0-73e5d09921fb77147bb6370a1e5a5cce)
在这段程序中,先执行第1行赋值语句,再执行第二条赋值语句,然后执行第3行input输入语句,最后执行print输出语句。从描述上看,排在前面的语句先执行,依次按顺序执行,这就是一个顺序结构的程序。
3.2.2 条件分支结构
在Python中,条件分支语句包括简单if语句、if…else语句以及if…elif…else语句3种形式。其基本道理都一样,根据一条或者多条语句的判定结果(True和False)来执行对应操作的语句,从而实现“分支”的效果。接下来分别介绍这几种分支结构形式。
1.简单if语句
Python中使用if关键字来组成选择语句。简单if语句的逻辑关系相当于汉语里的“如果……就……”,语法格式如下:
if 表达式: 语句块
其中,表达式可以是一个单纯的布尔值或变量,也可以是一个比较表达式或逻辑表达式(如a > b and a != c)。如果表达式的值为真,则执行其后的语句块;如果表达式的值为假,就跳过该语句块,继续执行后面的语句。流程图如图3.19所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P48_4376.jpg?sign=1738944850-51D4DF3ovhnqP2MYQc2q5aMe0a1gXlDh-0-4fe488fa6e5b0321371491393a69db87)
图3.18 顺序结构流程图
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P48_4377.jpg?sign=1738944850-IFNzLignsgLxoDjgDYmngB3PKszNEdCl-0-d43d8acf12c1c533e4a43fdf4b887b6f)
图3.19 简单if语句的流程图
【实例3.7】 使用简单if语句判断成绩是否及格。(实例位置:资源包\Code\03\07)
使用简单if语句判断语文考试成绩是否合格通过。如果成绩大于等于60分,表示通过考试;如果成绩小于60分,表示没有通过考试。具体代码如下:
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P48_32793.jpg?sign=1738944850-1ty4Xt7MjAMdapsoXX6UbAvsdJahgbVE-0-e660404cf17977cfc18c7ed0da0c5824)
当输入数字45和98时,程序运行结果如图3.20和图3.21所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P48_4413.jpg?sign=1738944850-BBZzT5syGuTJMMxbxFYvbQpUtCUAXN6c-0-9848411934b64f3faf84f7bf0728b87a)
图3.20 没有通过考试
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P48_4420.jpg?sign=1738944850-n69tPyuGWtDkuQUtDGozV9FCBxp3iUG9-0-70598c9b488259728e30ac73f147cda4)
图3.21 通过考试
2.if…else语句
if…else语句的逻辑关系相当于汉语里的“如果……否则……”,其语法格式如下:
if 表达式: 语句块1 else: 语句块2
其中,表达式可以是一个单纯的布尔值或变量,也可以是比较表达式或逻辑表达式。如果表达式结果为真,执行if后的语句块1;如果表达式结果为假,跳过if后语句,执行else后的语句块2。流程图如图3.22所示。
【实例3.8】 使用if…else语句判断成绩是否及格。(实例位置:资源包\Code\03\08)
将例3.7改为使用if…else语句实现,具体代码如下:
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P49_32796.jpg?sign=1738944850-X3v293JYxFqYn4ivtb9WLhbkPD7veoMy-0-5f14235392c067c787e972600bc14b66)
当输入数字55和95时,程序运行结果如图3.23和图3.24所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P49_4495.jpg?sign=1738944850-b7xb3VZY4s8yBEJSHCrwG8LNp2dLog9c-0-9f5fb092fa9579e63c7d8973ed6d448c)
图3.22 if…else语句的流程图
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P49_4499.jpg?sign=1738944850-tkvRnQGD5uDNezqQDAjlDTBxpaxeAZuM-0-2da8025beb61652a9afdf7e6f92be702)
图3.23 成绩不超过60
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P49_4508.jpg?sign=1738944850-Mg7nNozwo7ZZw5sQYZUR9CndaVtvXzDu-0-ec31ffb9bf1651bed61fc6dd9b3576a3)
图3.24 成绩超过60
3.if…elif…else语句
if…elif…else语句是一个多分支选择语句,其逻辑关系为“如果满足某种条件,执行某种处理;否则,如果满足另一种条件,执行另一种处理……”。语法格式如下:
if 表达式1: 语句块1 elif 表达式2: 语句块2 elif 表达式3: 语句块3 … else: 语句块n
使用if…elif…else语句时,表达式可以是一个单纯的布尔值或变量,也可以是比较表达式或逻辑表达式。如果表达式1的值为真,执行语句块1;如果表达式1的值为假,则跳过语句块1,进行下一个elif的判断;只有在所有表达式都为假的情况下,才会执行else中的语句n。流程如图3.25所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P50_4580.jpg?sign=1738944850-CKKMHWpGwDqHxhhIxOzizblqlxMoUoz3-0-6e93bd3afee73417ed66acda01cf7739)
图3.25 if…elif…else语句的流程图
【实例3.9】 判断成绩等级。(实例位置:资源包\Code\03\09)
一个考生,如果其分数为90~100分,等级为优秀;分数为70~89分,等级为良好;分数为60~69分,等级为及格;否则,就是不及格。代码如下:
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P50_32800.jpg?sign=1738944850-U36e6DUY6BfcyuSZbZcmRNRFJy4eOAwe-0-69ca186bc6703c52ae8266ced2a2ac59)
当输入数字48、89和96时,程序运行结果如图3.26~图3.28所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P51_4646.jpg?sign=1738944850-ZauSECEVmsLVquU0JruU4YFBFVnS90XQ-0-1bacdad567a5646a7e0516eb85285125)
图3.26 不及格
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P51_4655.jpg?sign=1738944850-xiuiHd395rqwm6PXW1eTk0a83SqxzqLs-0-cd930fa39c25db5126215fb5906d92d1)
图3.27 良好
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P51_4663.jpg?sign=1738944850-HKjdg7RYzyiK62YxRTkqhO41iMYSyPkD-0-ab39d9f37f0db45cd9bc09504dd1f833)
图3.28 优秀
4.if语句的嵌套
前面介绍了3种形式的if选择语句,它们之间可以互相嵌套。例如,在简单if语句中嵌套if…else语句,形式如下:
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P51_32808.jpg?sign=1738944850-dbdUdrEz71qiRnFiZVkwsTvdVy5bbCt5-0-86fa5b0a84251e2d06d3f5aa8f4f399e)
在if…else语句中嵌套if…else语句,形式如下:
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P51_32809.jpg?sign=1738944850-HFgXBFB91J8iQt8XpjbBXmcVQAvO22Ce-0-3e6fab5e0551bcd9fd1a37635c55627b)
说明
if语句嵌套方式灵活,开发时一定要严格控制好不同级别代码块的缩进量。
【实例3.10】 模拟人生的不同阶段。(实例位置:资源包\Code\03\10)
设置一个变量age的值,编写if嵌套结构,根据age值判断处于人生哪个阶段。
如果年龄为0~13(含13)岁,就打印消息“您是儿童”。
如果年龄为13~20(不含13,含20)岁,就打印消息“您是青少年”。
如果年龄为20~65(不含20,含65)岁,就打印消息“您是成年人”。
如果年龄为65岁以上,就打印消息“您是老年人”。
具体代码如下:
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P52_32810.jpg?sign=1738944850-CkibNXMRWiW7wm87Rqj3wo2JG11NFIME-0-188a2241092361e8c91c8a1a3f66d5ed)
当输入数字16和45时,程序运行结果如图3.29和图3.30所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P52_4846.jpg?sign=1738944850-IhLbaedr2sW2giJJB0u1xpoUGW3yxTfC-0-9c18f828fd4aba2bd750d994b5ba8ab6)
图3.29 青少年
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P52_4855.jpg?sign=1738944850-W0IUXKwiw2EFfGem54vucVOZSKluYXth-0-5a8fc6ca7f7311c41ec1cd72f5848032)
图3.30 成年人
3.2.3 循环结构
循环结构是可以多次执行同一段代码的语句结构。在Python中有两种循环语句,即while语句和for语句。接下来详细讲解这两种循环语句。
1.while语句
while循环中,通过一个条件来控制是否要反复执行循环体中的语句。语法格式如下:
while 条件表达式: 循环体
说明
循环体是指一组需要被重复执行的语句。
当条件表达式的返回值为真时,则执行循环体中的语句,执行完毕后,重新判断条件表达式的返回值,直到表达式返回的结果为假时,退出循环。while循环语句的执行流程如图3.31所示。
【实例3.11】 计算1*2*3*4*5的值。(实例位置:资源包\Code\03\11)
具体代码如下:
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P52_32813.jpg?sign=1738944850-8J05MvRQIrWgg8GIiujTup5QwzKOJuyH-0-60efa4a0259f43b609ec74dce3dbc7d8)
最终运行的结果如图3.32所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P53_4930.jpg?sign=1738944850-MxdLzispckXbWljAFQ3PGkD9ZFe1Uw5u-0-da1a069c39dff75427467d95b8c177be)
图3.31 while语句的执行流程图
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P53_4931.jpg?sign=1738944850-JyKkwhYMfp8UyiXkmRUGvt38ft8Q65LV-0-bcaf7573b646d16ba7c40d4648000e22)
图3.32 while语句运行结果
这段代码的执行过程如下:
(1)循环检验条件为i<=5,当i=1时,结果为真,执行循环体内容,即sum1=sum1*i=1*1=1,i+=1之后,i=2。
(2)再次进行i<=5检测,结果为真,执行循环体内容,即sum=sum*i=1*2=2,i+=1之后,i=3。
(3)如此循环多次,到i=6时,再次进行i<=5进行检测,结果为假,不再执行循环体内容,跳出循环,执行print语句,输出最后的sum1值。
2.for语句
for循环是一个依次重复执行的循环,通常适用于枚举、遍历序列以及迭代对象中的元素。语法格式如下:
for 迭代变量 in 对象: 循环体
其中,迭代变量用于保存读取出的值;对象为要遍历或迭代的对象,可以是任何有序的序列对象,如字符串、列表和元组等;循环体为一组需要重复执行的语句。
for循环语句的执行流程如图3.33所示。
【实例3.12】 打印5个“*”。(实例位置:资源包\Code\03\12)
用for循环打印5个“*”,具体代码如下:
01 i=0 #初始化变量 02 for i in range(0,5): #从0~5遍历i 03 print("*") #每遍历一次,输出一个“*”
运行结果如图3.34所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P54_4980.jpg?sign=1738944850-efrzAJOmMywgdSFMqubsPSq3SdcQ27BW-0-57698cdcf417663b5800697f16d57a91)
图3.33 for循环语句流程图
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P54_4981.jpg?sign=1738944850-jeabAuQWpqNdiDDen5CfWZ74hxTR2Q33-0-f12f21067ba09bab0cf7971e9625589d)
图3.34 for循环运行结果
上面的代码中使用了range()函数,该函数是Python的内置函数,用于生成一系列连续的整数,多用于for循环语句中。其语法格式如下:
range(start,end,step)
参数说明:
start:用于指定计数的起始值,可以省略。如果省略,则从0开始计数。
end:用于指定计数的结束值(但不包括该值,如range(7)得到的值为0~6,不包括7),不能省略。当range()函数中只有一个参数时,表示指定计数的结束值。
step:用于指定步长,即两个数之间的间隔,可以省略。如果省略,则表示步长为1。例如,rang(1,7)将得到1、2、3、4、5、6。
注意
使用range()函数时,如果只有一个参数,表示指定的是end;如果有两个参数,表示指定的是start和end;如果3个参数都存在,最后一个参数表示步长。
3.循环的嵌套
在Python中,for循环和while循环间可以相互嵌套。例如,在while循环中套用while循环的格式如下:
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P54_32819.jpg?sign=1738944850-xlkP0Hauw8AkV8Ja5kiFU9v63bt6O1Ah-0-c90f5990ac3dfb74f25e6f9d285ff415)
在for循环中套用for循环的格式如下:
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P55_32820.jpg?sign=1738944850-M9gLmhsRHVpoKx4saj8phycdJcPaSrQ5-0-3140d98fcd64b5054f3ca0e12659ee5c)
在while循环中套用for循环的格式如下:
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P55_32821.jpg?sign=1738944850-wDVDKBk2mS39ss3puDxl77GuRDjYzpcS-0-490fee79a0619ce4f30aeed71dfed74a)
在for循环中套用while循环的格式如下:
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P55_32822.jpg?sign=1738944850-cZKkHCrVamNUygzca3x9WFdmjpMEEOBJ-0-b45090d1afb84895f408e48392fc3a28)
除了上面介绍的4种嵌套格式外,还可以实现更多层的嵌套,这里不再一一列出。
【实例3.13】 打印九九乘法表。(实例位置:资源包\Code\03\13)
使用嵌套的for循环打印九九乘法表,具体代码如下:
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P55_32823.jpg?sign=1738944850-HrbYqyz4N1hpTxcQUFq450ByPwIX4ua9-0-515c7e7a4e5733a74abd508f259e3f02)
运行结果如图3.35所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P55_5134.jpg?sign=1738944850-2Tq5kVjCz8akF1yTAdI9PvM9dXdCFfcj-0-6d84373d5592b98ae20d204b7f45349c)
图3.35 九九乘法表
本实例的代码使用了双层for循环,第一个循环可以看成是对乘法表行数的控制,同时也是每一个乘法公式的第二个因数;第二个循环控制乘法表的列数,列数的最大值应该等于行数,因此第二个循环的条件应该是在第一个循环的基础上建立的。
4.跳转语句(break、continue语句)
当循环条件满足时,程序会一直执行下去。如果希望程序在for循环结束重复前或while循环找到结束条件前就离开循环,有两种方法:使用break语句,完全中止循环;或者使用continue语句,直接跳到循环的下一次迭代中。下面来详细讲解。
1)break语句
break语句可以终止当前的循环,一般与if语句搭配使用,表示在某种条件下跳出循环。如果break语句应用在嵌套循环中,则可跳出最内层的循环。
在while语句中使用break语句的形式如下(条件表达式2用于判断何时调用break语句跳出循环):
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P56_32824.jpg?sign=1738944850-FV17xMoZJwcuMgPN35qeaVwADSeOd3Np-0-74f1c6b60c6f485476764accab53055f)
在for语句中使用break语句的形式如下(条件表达式用于判断何时调用break语句跳出循环):
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P56_32825.jpg?sign=1738944850-m46ZY9NCasTiKUtXbYwEYfapK55iRg3t-0-1e439525817e4d596411495c22c6d7c9)
在while语句中使用break语句的流程如图3.36所示。在for语句中使用break语句的流程如图3.37所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P56_5196.jpg?sign=1738944850-AT5vOBVENEkVCLZhftRhir82NWRWs8rL-0-973db945e5a64258699fecc254620839)
图3.36 while语句中使用break语句
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P56_5197.jpg?sign=1738944850-Pgyin9cMoRc6ciMInP4GTzvHxft9Y4BW-0-5eaff136eaa484e0efafd5788c9df0c7)
图3.37 for语句中使用break语句
【实例3.14】 给披萨加配料(break版)。(实例位置:资源包\Code\03\14)
编写程序,提示用户输入披萨配料。当用户输入quit时,结束循环。每当用户输入一个配料,就打印出添加配料的情况。具体代码如下:
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P57_32827.jpg?sign=1738944850-J2tohKdBQKeb1qhQaVbop6F4ZyfYCzw9-0-ad8dcb3be14791309b2275fd62d89088)
运行结果如图3.38所示。当用户输入quit时,跳出循环并结束程序,这就是break语句的作用。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P57_5245.jpg?sign=1738944850-TyccKusx3Q3An2z2cyDI10zgxVNz0agS-0-9d5fa8e4c9fb5d35a66e28fb20f0da9e)
图3.38 break语句应用
2)continue语句
continue语句的作用没有break语句强大,它只能终止本次循环,提前进入下一次循环。continue语句的语法比较简单,只需要在相应的while或for语句中加入即可。
说明
continue语句一般会搭配if语句使用,表示在某种条件下跳过当前循环的剩余语句,继续进行下一轮循环。如果使用嵌套循环,continue语句将只跳过最内层循环中的剩余语句。
在while语句中使用continue语句的形式如下(条件表达式2用于判断何时调用continue语句):
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P57_32828.jpg?sign=1738944850-c8MdJ0sxUvoYZW3tm4aPdAAkpPh3bo01-0-d24cc6dd1e673b4e2523abe0c7b29b18)
在for语句中使用continue语句的形式如下(条件表达式用于判断何时调用continue语句):
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P57_32829.jpg?sign=1738944850-7vtB8VDed4DcOkaRpD78U3bjADsyKPvR-0-4ca8b53beabe9bfb8b2ad4ff5df87431)
在while语句中使用continue语句的流程如图3.39所示。在for语句中使用continue语句的流程如图3.40所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P58_5312.jpg?sign=1738944850-NAScQvQchj1mP0GFDMF5jWuD7C6C1OYt-0-f178ab9a90b581ea8fd48871f1ecd6c0)
图3.39 while语句中使用continue语句
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P58_5314.jpg?sign=1738944850-nC6d20FiGlH2d9zyvkzdrSEPUNeuZY0I-0-16a6e61083f38515cbb8df9baeb2c6ea)
图3.40 for语句中使用continue语句
【实例3.15】 给披萨加配料(continue版)。(实例位置:资源包\Code\03\15)
在实例3.14的基础上,将代码中的break换成continue。具体代码如下:
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P58_32831.jpg?sign=1738944850-77FP9QQMBTZT3i5sNy9QsukbWpfn7Gl8-0-738db69a1e449f9194106a544d36a358)
运行结果如图3.41所示。
![](https://epubservercos.yuewen.com/569667/23721647609535706/epubprivate/OEBPS/Images/Figure-P58_5356.jpg?sign=1738944850-sdyaGd0U2j0O56Xw3aM9uNx99hqMRIbp-0-e6a259421bc826198e902c0bd794af59)
图3.41 coutinue语句
从运行结果来看,当输入quit时,程序并没有结束循环,只是跳过当前循环,继续执行下一次循环,这就是continue语句的作用。