![Python程序设计应用教程](https://wfqqreader-1252317822.image.myqcloud.com/cover/751/31729751/b_31729751.jpg)
3.2 循环结构
程序在一般情况下是按顺序执行的。编程语言提供了各种控制结构,允许更复杂的执行路径。循环语句允许用户执行一个语句或语句组多次,Python提供了for循环和while循环(在Python中没有do…while循环)。
3.2.1 while语句
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00048005.jpg?sign=1738836028-sudyNeZnZExrxDPRiS4MabTDcZBTE5DE-0-e1ecd0810f2376d856d63744f0ca7c25)
while
Python编程中while语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务。其基本形式如下:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00048006.jpg?sign=1738836028-BkTdfrhrKNhW5hwWpUmuvIPqmzG1YUu2-0-36940a71f6b7fec0de421a365d7176ee)
执行语句可以是单个语句或语句块。判断条件可以是任何表达式,任何非零或非空的值均为True。当判断条件为False时,循环结束。While语句的流程图如图3-4所示。
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00049001.jpg?sign=1738836028-AXe7lBVWbKzUn1o4I3FgJVdVzyB4wjqP-0-50c3ef2b4bf06265ab9cdd6c4a5ca66f)
图3-4 while语句的流程图
同样,需要注意冒号和缩进。例如:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00049002.jpg?sign=1738836028-3IQcz25TVhEXfg4myY83OD8GJduEDyQ8-0-fca32b4a28e813c1d5e76ecd6e723153)
程序运行结果:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00049003.jpg?sign=1738836028-IE8S7hGEYUqkh3zRvBswh0KttW5bGmBV-0-c248a43a10864da04e0098af63dfcf47)
此外,while语句“判断条件”还可以是个常值,表示循环必定成立。例如:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00049004.jpg?sign=1738836028-f3qMjC8RoSOP4qZrNtrFZAk0sPXTpBUX-0-8ff2eb5a8872a70020b4079ce6b1aa41)
这样就形成无限循环,可以借助后面学习的break语句结束循环。
【例3-4】求1+2+3+…+100。
分析:计算累加和需要两个变量,变量sum存放累加和,变量counter存放加数。重复将加数counter加到sum中。
程序代码:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00049005.jpg?sign=1738836028-z06ZapJsu3TKJL6MP9Q7iYohKpeH1HBY-0-324ca6f20913f9bb99c42611810f2796)
程序运行结果:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00049006.jpg?sign=1738836028-R84euPkbnDAzOCQz5zmg4RIFrEkxvK5W-0-f3aeab19c761bbe58119d0d5be1c4565)
【例3-5】输入一个非负整数,将其反向后输出。例如,输入24789,变成98742输出。
分析:将整数的各位数字逐个分开,逐个输出。将整数各位数字分开的方法是,通过对10进行求余得到个位数输出,然后将整数缩小10倍,再求余,并重复上述过程,分别得到十位、百位……直到整数的值变成0为止。
程序代码:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00050001.jpg?sign=1738836028-UFnq6PZvGrSYklDYslwTB6qaR0cixGWV-0-0f1d34dab5158731b0cc64af62c87c80)
程序运行结果:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00050002.jpg?sign=1738836028-CMSdvVxe4mgvX4jjnWbOqgcfWr6MPdxZ-0-286fd390cc22e9ef5f839cab1e622bfe)
【例3-6】输入两个正整数,求它们的最大公约数。
分析:求最大公约数可以用“辗转相除法”,方法如下。
(1)比较两数,并使m大于n。
(2)将m作被除数,n作除数,相除后余数为r。
(3)循环判断r,若r=0,则n为最大公约数,结束循环。若r≠0,执行步骤m←n,n←r;将m作被除数,n作除数,相除后余数为r。
程序代码:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00050003.jpg?sign=1738836028-KpJe8MtAZsGPJc6ixsQZl6lQTRIt1edt-0-ef2e00c24ce395014327b61d5f395aab)
程序运行结果:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00050004.jpg?sign=1738836028-xwZsKfVVw8IdCA6KZ3phjjMBM1PXNIfG-0-c5b6527f57eb0521579254702cc26727)
3.2.2 for语句
for语句可以遍历任何序列的项目,如一个列表、元组或者一个字符串。
1.for循环的语法
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00050005.jpg?sign=1738836028-r8TRYLgq9WtI1xG1qQV5PiwKflKhXSW0-0-8b05b6e630db5bb5cf81402607756c91)
for
for循环的语法格式如下:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00050006.jpg?sign=1738836028-AQO4EbE36ermiuzr7ppd7hUnZ0SXLURq-0-98c6b9f512fb1c066630542bc3cacd98)
for语句的执行过程:每次循环,判断循环索引值是否还在序列中,如果在,取出该值提供给循环体内的语句使用;如果不在,则结束循环。例如:
for循环把字符串中的字符遍历出来。
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00051001.jpg?sign=1738836028-CfIUpDMkBp6rzfbV6djTfHs6mLAUhsM1-0-ce680728b2b711f3529bf6fe830c47c0)
程序运行结果:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00051002.jpg?sign=1738836028-uwUy1fsTs2NeNAHq974lQoSBAmFwz9SB-0-8d31dedf05235486d4ddb0e5308bf3fa)
for循环把列表中的元素遍历出来。例如:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00051003.jpg?sign=1738836028-bc73BhlN1pNd8sP1S3bGImXKhmWqVYyy-0-c3038d96800f7c26597f185ebbb50805)
会依次打印fruits中的每一个元素,程序运行结果:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00051004.jpg?sign=1738836028-DdyzVxrdPo2jhY5ftRRGfQkgD8NM7ncN-0-bf5d623c128395f598cc06b10ae4599c)
【例3-7】计算1~10的整数之和,可以用一个sum变量进行累加。
程序代码:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00051005.jpg?sign=1738836028-TerFLTa6CO1JD9bPNjtWLdO9BcS5FdFh-0-ecb731c18e89a5a0b27c9a43c3605cf5)
如果要计算1~100的整数之和,从1写到100有点困难。Python的range()内置函数可以生成一个整数序列,再通过list()函数可以转换为list列表。
例如,range(0,5)或range(5)生成的序列是从0开始小于5的整数,不包括5。例如:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00051006.jpg?sign=1738836028-EZSIzi6GDLmyjAdtfsKv0EfysOgrE4kV-0-0a162c0e864f49fe4ac10dee4fe02bcb)
range(1,101)就可以生成1~100的整数序列,计算1~100的整数之和如下:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00051007.jpg?sign=1738836028-ikP8zVqYGKLwkE3pAGaxdhqfg0VDgQ18-0-38d11cce4e16c87e2271116bf9068082)
【例3-8】求区间[100,200]内10个随机整数中的最大数。
分析:本题随机产生整数,所以引入random模块随机数函数,其中random.randrange()可以从指定范围内获取一个随机数。例如:
(1)random.randrange(6):从0到5中随机挑选一个整数,不包括数字6。
(2)random.randrange(2,6):从2到5中随机挑选一个整数,不包括数字6。
程序代码:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00052001.jpg?sign=1738836028-yYb32qgqxmGGLOwt6jgd1eUcw36vLqY2-0-f3594a59c5de4c6fde9c9e16fc314225)
程序运行结果:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00052002.jpg?sign=1738836028-brSjhUSXBpHzI4yQqjcpvX0UmGqTr64s-0-eb2962d49a951dc19332f79c4563d5cd)
当然,在Python中求最大数有相应的函数max(序列)。例如:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00052003.jpg?sign=1738836028-m0KDxXUWOcLoro5FOlM3GnNFxm5NjGQV-0-1c7cd8ada405eb65b3a25b2dcc9e7afb)
程序运行结果:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00052004.jpg?sign=1738836028-KP8vkkMmUZbCHy84W8O8BPpAvjOuQ0ue-0-4aad5b7d6031d15172f7fb3954568418)
所以上例可以修改如下:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00052005.jpg?sign=1738836028-FNXLKLY74GGnPiXk4V2aZrlbu8lP90Iw-0-3257763b5d4d22193379db414101020b)
2.通过索引循环
对于一个列表,另外一种执行循环的遍历方式是通过索引(元素下标)。例如:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00052006.jpg?sign=1738836028-NtlP3Y2XP9GQmmHvJfOPWHkBo9tzxIgN-0-dab818bf402f9ab228868e8cba3dcff4)
程序运行结果:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00052007.jpg?sign=1738836028-eZPoLhJi9iW4Irc4JCSWto37E14RORq0-0-c6a4825eadd47f4a4e523826deb0f99d)
以上实例使用了内置函数len()和range(),函数len()返回列表的长度,即元素的个数。通过索引i访问每个元素fruits[i]。
3.2.3 continue和break语句
break语句在while循环和for循环中都可以使用,一般放在if选择结构中,一旦break语句被执行,将使得整个循环提前结束。
continue语句的作用是终止当前循环,并忽略continue之后的语句,然后回到循环的顶端,提前进入下一次循环。
除非break语句让代码更简单或更清晰,否则不要轻易使用。
【例3-9】continue和break用法示例。
程序代码:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00053001.jpg?sign=1738836028-WCejPsVqW46X2nONf2QwEe0SbtTGBddv-0-38ff9718e9e6b0b61173a43aeac6d661)
3.2.4 循环嵌套
Python语言允许在一个循环体中嵌入另一个循环。可以在循环体内嵌入其他的循环体,如在while循环中可以嵌入for循环;也可以在for循环中嵌入while循环。嵌套层次一般不超过3层,以保证可读性。其中双层循环是一种常用的循环嵌套,循环的次数等于内外层循环次数之积。
例如:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00053002.jpg?sign=1738836028-srKjNVNlVMEAPn6GYPZ21ZSouBX39ygj-0-55ccc0f9a9ed698ecb4fe29b7880bf23)
当外层循环变量i的值为1时,内层循环j的值从1开始,输出i*j的值并依次递增,因此输出"1,2,3,",内层循环执行结束;然后回到外层循环,i的值递增为2,内层循环变量j的值重新从1开始,并依次递增,输出"2,4,6,"。因此,程序的运行结果为"1,2,3,2,4,6,"。
注意:
(1)循环嵌套时,外层循环和内层循环间是包含关系,即内层循环必须被完全包含在外层循环中。
(2)当程序中出现循环嵌套时,程序每执行一次外层循环,则其内层循环必须循环所有的次数(即内层循环结束)后,才能进入到外层循环的下一次循环。
【例3-10】打印九九乘法表。
分析:由于需要输出9行9列的二维数据,因此需要使用双重循环,外层循环用于控制行数,内层循环用于控制列数。为了规范输出格式,使用'\t'跳到下一个制表位。
程序代码:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00053003.jpg?sign=1738836028-8E61R8bgCpspHZOL1hCkUxo1GinqZ2KP-0-c1a626aedc3640bb03341a5c164dfe62)
程序执行结果如图3-5所示。
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00054002.jpg?sign=1738836028-uHyaJSwRbXFMpArplVzJUaAEqegr8W0N-0-ff36e787cffb5260b5c01dfc3c72da63)
图3-5 九九乘法表
【例3-11】输出100~1000之间的“水仙花数”。所谓水仙花数是指1个n位(n≥3)的十进制数,其各位数字的立方和等于该数本身。例如,153是水仙花数,因为153=13+53+33。
程序代码:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00054003.jpg?sign=1738836028-o1R45YEeqT0tsf5YwxgXFET00ltLiRNI-0-bf7927100d59356875c9cef669dea5b1)
程序运行结果:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00054004.jpg?sign=1738836028-cfYp8By8iBi9m1pXVqApQ3WSS71HLoXI-0-ed78409ec7b531d9f9a2a7466e295226)
【例3-12】使用嵌套循环输出2~100之间的素数。
分析:素数是除1和本身,不能被其他任何整数整除的整数。判断一个数m是否为素数,只要依次用2,3,4,…,m-1做除数去除m,只要有一个能被整除,m就不是素数。
程序代码:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00054005.jpg?sign=1738836028-EV0vK6B2WNdNsiG9QH1iOhCU23S9l0uE-0-33f5515c868447cf4b5228b26db56f2c)
应用上述代码,对于一个非素数而言,判断过程往往很快可以结束。例如,判断30009时,因为该数能被3整除,所以只需判断就j=2,3两种情况。而判断一个素数尤其是当该数较大时,例如判断30011,则要从就j=2,3,4,…,一直判断到30010都不能被整除,才能得出其为素数的结论。实际上,只要从2判断到即math.sqrt(m),若m不能被其中任何一个数整除,则m即为素数。
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00054007.jpg?sign=1738836028-kWhbRTpkWTuxD1dM2y7tBkFo8PacUPTP-0-8fd4f7ae6f646f616f5a6846c646caf6)
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00055001.jpg?sign=1738836028-2ooyjdfi0Znpe5MJzhcCWKOLkzwjun3T-0-80bbd9708a8a21b9c36e480ebe0fee76)
【例3-13】使用嵌套循环输出如图3-5的金字塔图案。
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00055002.jpg?sign=1738836028-yDgNeD903SfOMLNTIuevgX9ezsw6gf9e-0-455ee17f09dcf6d83739b8945ae792ac)
图3-5 金字塔图案
分析:观察图形包含8行,因此外层循环执行8次;每行内容由两部分组成:空格和星号。假设第1行星号在第10列,则第i行空格的数量10-i,星号数量为2*i-1。
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00055003.jpg?sign=1738836028-erjKUv2epOTBEcfEG8fuq59bAz6WvfaX-0-6592683f361d49ad56cd84347d09eda2)
也可以按如下方法实现:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00055004.jpg?sign=1738836028-oPduJuqDSf0dtm9fbpBKvTSrnAIZ8bz0-0-51116adb7a328c49bd99aabe2fc00eea)
3.2.5 列表生成式
列表生成式(List Comprehensions)是Python内置的一种极其强大的生成list列表的表达式。如果要生成一个list[1,2,3,4,5,6,7,8,9]可以用range(1,10):
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00055005.jpg?sign=1738836028-4ZyPtsNUd3I8L6FZoRqclTFfwii6dtQG-0-a7108544df815a5819a5dee8ad0a30d9)
如果要生成[1×1,2×2,3×3,…,10×10],可以使用循环:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00055006.jpg?sign=1738836028-2WUVz5ofu1wGYsH1rkTRCHE8cU7uosgU-0-4958d4f2e795c8648237a48b0bf50368)
而列表生成式可以用以下语句代替以上的烦琐循环来完成:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00055007.jpg?sign=1738836028-PdWMTeO4HLyR1Q1Nr5HajC0TAouRAfq8-0-d02561d1506b36eaf2eb22e48401dd6f)
列表生成式的书写格式:把要生成的元素x*x放到前面,后面跟上for循环。这样就可以把list创建出来。for循环后面还可以加上if判断,例如筛选出偶数的平方:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00055008.jpg?sign=1738836028-CjLPYeY3tXMDcnpfaHrT8QaUdTxNdYBY-0-1ba40235ffd5f4daa34bedc679accc30)
再如,把一个list列表中所有的字符串变成小写形式:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00056001.jpg?sign=1738836028-OmPk5VNPN16hX93eY4HcIciZuilpG4Hy-0-75edd4d5500d5a961b5d0f8d859d98a2)
当然,列表生成式也可以使用两层循环,例如生成'ABC'和'XYZ'中字母的全部组合:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00056002.jpg?sign=1738836028-ACMB8RalkSXQvGDA8HKxkdACZCSsWdSQ-0-74aa5d67d017cff28a17900f1ef437b2)
for循环其实可以同时使用两个甚至多个变量,例如字典(Dict)的items()可以同时迭代key和value:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00056003.jpg?sign=1738836028-PXWsmgWvW33A34wSe82cW7y7FJJ7O9WF-0-b6df77472d62b0385c363801e5e51c3c)
程序运行结果:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00056004.jpg?sign=1738836028-zTTZvxhEP7sQWOUrHvWq9SFwI3GczVFZ-0-e378968a34f2391e49e2b8c5941aeacf)
因此,列表生成式也可以使用两个变量来生成list列表:
![](https://epubservercos.yuewen.com/596AA5/17180253805312106/epubprivate/OEBPS/Images/img00056005.jpg?sign=1738836028-wjJDGu665NOLmcEO0hmU9zkwYPgEPDGU-0-22a92df7a79115ba02a2a189384b7d8e)