- 人工智能开发语言:Python
- 潘风文 潘启儒
- 1863字
- 2020-08-28 05:52:05
3.5 控制语句
任何编程语言,都具有三种基本控制语句结构。
① 顺序控制结构(Sequential Structure):按照语句的编写顺序执行程序;
② 条件控制结构(Conditional Structure):按照一个布尔表达式的值(真/假),有选择地执行两个子程序中的一个;
③ 循环控制结构(Loop Structure):以某个布尔表达式的值为循环条件,只要其值为真,则一直执行某个子程序。
下面我们主要讲解一下在Python中如何实现选择结构、循环结构。
3.5.1 条件控制结构(if…else)
在Python中,实现条件控制的语句是if…else语句,条件语句控制结构流程图见图3-10。其基本语法形式是:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/204.jpg?sign=1738935828-bTJI7sUBDTTmKIldeWg5KuAiyWBPHZbL-0-d62007131d61c06a5c28b69afaed738e)
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/3-10.jpg?sign=1738935828-86lxpVicyXmzX3kJqbI2LFhangYy12uS-0-abed5f2ad24b9368c48a61d292001c78)
图3-10 条件语句控制结构流程图
开发者需要注意以下两点:
语句块1、语句块2中的多条语句的缩进必须一致,否则程序会只执行部分语句,可能引发异常或逻辑错误;
表达式两边可以没有小括号,但是从可读性方面考虑,建议添加。
在实际开发中,if…else语句可以有以下几种应用形式:
① 单分支(无else情况);
② 双分支;
③ 多分支;
④ 嵌套if语句。
3.5.1.1 单分支形式
单分支形式是最简单的if…else语句结构形式,其语句格式如下:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/208.jpg?sign=1738935828-wWrfX1pmP6kqpJIBXb7N7dGktaAujArN-0-a14f220ea491245829b07ef76084bfef)
这种形式用于有条件地执行特定操作,即如果表达式为真,则执行下面的语句块,否则跳过,转而去执行if语句结构下面其他语句。单分支条件语句控制结构流程图见图3-11。
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/3-11.jpg?sign=1738935828-mV3ozC4d3iWV4fpAqcFW9QgZtut5R0Vn-0-8dd6429f1260fd5dab3462d3dbb06085)
图3-11 单分支条件语句控制结构流程图
如下面的例子:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/210.jpg?sign=1738935828-uQWP4YWg82fsowDhJSJPD5owOWWzRChN-0-0d3e436985581ed629d45a57091bc6c6)
输出结果为:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/211.jpg?sign=1738935828-qWra9yTxILMY4aAfEpUJ4m6znguEVHnH-0-36bae2da857a8c4246b7360f3d907a4d)
3.5.1.2 双分支形式
双分支形式语句格式如下:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/212.jpg?sign=1738935828-Ij1cf3uNXjsnaioh7sGVSAjeJ6jBMl00-0-92235654ca9f7cc8d1ed4a05b05f70ac)
举例如下:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/213.jpg?sign=1738935828-0NU5SiGzCzDzNK51GkPNgkSkaHOUsgYB-0-f22eee93b46a4677f696b399be3fc4bf)
上面的代码中,x<y为条件表达式,输出结果为:0
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/214.jpg?sign=1738935828-CvhZr2yLVtMHbtw7DWaN8JC0j5ExfK3T-0-984708fd7704ba80d64391b4f1aa760e)
3.5.1.3 多分支形式
适合多分支形式语句格式如下:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/215.jpg?sign=1738935828-3dWZpTKl8ilOjhRfEL7raBREHLzpRNYG-0-dec85f7b552f82b55c50713c18eb9458)
多分支条件语句控制结构流程图见图3-12。
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/3-12.jpg?sign=1738935828-LxCXmyTFlOjFf4W3ATzbkvcdSiM7NQeA-0-48114afeaffff706f14745395db446bb)
图3-12 多分支条件语句控制结构流程图
如某个电商平台根据注册用户的月均消费额度进行等级划分,代码如下:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/217.jpg?sign=1738935828-JQ86RYVZlUSZPiIB9lgfGFwoPX0K7j3B-0-7488e1f21ebdc4fb2d364b07ebbcdf64)
3.5.1.4 嵌套形式
可以把一个if...else结构编写到另外一个if...else语句结构中,形成所谓的嵌套形式,这对于比较复杂的判断特别有用。由于语句的缩进是区别不同嵌套层次的唯一方法,因此嵌套层次越多,可读性越差,在实际编程中,尽量避免多层嵌套。
嵌套形式的if...elf语句的格式如下:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/218.jpg?sign=1738935828-0b0kIOA2Cco6W1gxY9F1e5dhzPyiJsvQ-0-e93b810305477d6cb091fbc8c9945b6b)
嵌套可以放在If子句、elif子句、else子句下。下面举例说明。
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/219.jpg?sign=1738935828-fNvMMRSfzh36BsU8vLtC0XSkyM6LMqTy-0-c0d06c8aa7fffc768add46742344fc9c)
如果输入78,则输出如下:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/220.jpg?sign=1738935828-Cs2njHZjBxmw1CTlozVbUdjQY4vjENJ8-0-b922c107fd98e442c08c4bc9dce0bf6e)
另外,在Python中,没有类似C++、Java中的switch语句。
3.5.2 循环控制结构(for/while)
循环控制结构是指在满足某个条件下重复执行指定语句的结构。Python中有两种循环控制结构,分别是for循环和while循环。
3.5.2.1 for循环
for循环非常适合对可迭代对象(如列表list、元组tuple、字符串str等)进行遍历。其基本语法如下:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/221.jpg?sign=1738935828-R9Mcp4DKWvsvE9nHJ4av9C2EvqldM3UL-0-73e4171d9317ae2e5cad4d756491d7d7)
同if...else语句一样,这里的语句块也是通过代码缩进与其他语句进行区分的。
for循环控制结构流程图如图3-13所示。
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/3-13.jpg?sign=1738935828-rGSozV7mknW451ZVcjs3hZz600r2w3wi-0-a357494b972381332a487db6f614c297)
图3-13 for循环控制结构流程图
下面的例子是计算一个数值型列表中所有数据的算术平均值:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/223.jpg?sign=1738935828-yCtK7cX8DQSuvcBhL0S8RrBji0A1J7v9-0-4a3af6f40deaa380c86e36ee1642c270)
第13~15行为循环体,主要作用是计算总和及元素个数。输出结果如下:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/224.jpg?sign=1738935828-fhl7cLQ74tq2ZPMdYVNH1Qsh8r5TqQaa-0-42a2149420c423a4ae57f24f400b9e97)
另外,for循环可以有一个可选的else语句块,这个else语句块会在序列sequence中的元素循环完毕后执行。如:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/225.jpg?sign=1738935828-ddiFqg2siYWAICZ9kWKf3RIUQs0AyGaM-0-6e31b1f49407edd7261acc392d33b67f)
输出结果如下:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/226.jpg?sign=1738935828-4icPxzNp8ecp4rmE8dOFp1GDqQWLzMNl-0-3f8aa85c78bbc714eb7dd15bf742f8d5)
3.5.2.2 while循环
while循环语句的语法格式如下:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/227.jpg?sign=1738935828-Wpx3HhYEZHKRMGuQroI9Bi9912OBleuz-0-ef95c8ff669df224c2af0bcd3f139196)
在while循环中,首先判断条件表达式是否为真(True),只有条件表达式为真时,while语句块才能被执行。执行完一次后,再次判断条件表达式是否为真,如果为真,则再次执行while语句块,依此循环,直到条件表达式为假(False)才退出while循环。While循环控制结构的流程图见图3-14。
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/3-14.jpg?sign=1738935828-Rd1LiEmt3H4SgMEOrsV1s5yHRnwB21CS-0-c00788f57732379fbafd3e6004106e76)
图3-14 while循环控制结构流程图
例如:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/229.jpg?sign=1738935828-F1XUCoW3EU6LETRzzatTTnMhDyhvpg9c-0-188e8bc551f83e1bd6987d467da13c47)
输出结果如下:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/230.jpg?sign=1738935828-0HVywZdkNYd51lWH1egIYtGpRF2aIc0L-0-0a6c61d158ab8ab96d76fb74f1550557)
同for循环一样,while循环也可以有一个可选的else语句块,这个else语句块是在条件表达式为假时执行的。如:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/231.jpg?sign=1738935828-23xzACb0hp85OyIWRbfsRkm05sYfv2PD-0-880ccb8fb6bf5cf972b7fcb556a2d616)
输出结果如下:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/232.jpg?sign=1738935828-NLadjvpEL5PoG8Asv5QFuqqpHvkiEQLQ-0-69c8adfced9ce13d0069213e171c6726)
在while循环中,如果条件表达式一直为真,则一直循环。
3.5.3 转移控制结构
在Python中有几个能够控制程序流程转移的特殊语句,分别是break、continue、return和pass。
3.5.3.1 break/continue
有时我们希望在某次循环中停止当前循环或跳出整个循环语句,这时continue或break就派上了用途。
break语句可把流程转移到循环体后的代码中,从而退出包含它的循环体,其流程如图3-15所示。
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/3-15.jpg?sign=1738935828-Y3arykrT1JWdq6bXlzu2TSPEkE6c3YVj-0-fc7f7616541914bab05b6ce3bb7f163f)
图3-15 break语句流程
图3-16所示为for循环结构中break语句转向图。
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/3-16.jpg?sign=1738935828-OuJS6ilYpLbvUMOYcLH8tKwfAVb8Yw6o-0-21238b1d211420ae393bd6f8e6fdf785)
图3-16 for循环结构中break语句转向图
举例如下:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/235.jpg?sign=1738935828-RqKGfA3bQQLk9yC47vqFU6ujbci0A2bT-0-8b3bae23cbdeb09040cffe16837294dd)
程序在for循环体内运行时,每次循环会判断flag是否等于“a”,当执行break语句时,会跳出循环体,直接执行循环体后面的代码。最终输出结果如下:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/236.jpg?sign=1738935828-QcBVbK5kLa8diNYTklQKSBPDU24Ruxxc-0-3ec37551a02285f5e16b4ba1338b235d)
与break语句相比,continue语句在条件为真时只跳过continue后的语句,转而进行下一次循环,并不会退出包含它的循环体。continue语句的流程图见图3-17。
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/3-17.jpg?sign=1738935828-FGGboSKNbRbPvntt1fr74FXXV4pBKAtb-0-21211e681eee4ddef6f05d6015601e20)
图3-17 continue语句流程图
图3-18所示为for循环中的continue语句转向图:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/3-18.jpg?sign=1738935828-STIwzA5IIO9orh6AaAEYAUhNDjUBQ30e-0-c2811f4193d23aee8b9a8df3595818ce)
图3-18 for循环中continue语句转向图
举例如下:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/239.jpg?sign=1738935828-b3cA7NxBfo7ufZyQ93JZ9PzbZwDNwhNb-0-d469eeff10b7f14de36e42711b424caf)
最终输出结果如下:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/240.jpg?sign=1738935828-Qo5N3w7phPbWBGJFWGytvCZV8GETEAil-0-d8cf21b61caacde3f4753934857d70ec)
从上面的输出结果可以看出,当条件为真(flag=='a')时,continue只是在本次循环不执行其后的语句,并不影响下次循环执行其后的语句,更没有退出整个循环。
3.5.3.2 pass
在Python语言中,pass是一个比较特殊的语句,解释器会执行这个语句,但是不做任何操作,所以pass通常是作为占位符来出现的。例如我们在设计一个循环分支或一个函数,还不能确定业务逻辑,但又不能为空时,就可以用pass语句做占位符,准备留待将来实现。例如:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/241.jpg?sign=1738935828-ntX9x8UPDViqoSxMyZRxKSXQ9WDHZgLR-0-e31e3a99de9e9774f6014cdb3c14b168)