- Python编程从小白到大牛
- 杨惠 程常谦主编
- 1507字
- 2025-02-25 03:22:58
3.2 循环语句
先提出问题:如果我们现在要计算0~100的所有数字的累计求和的结果。

这种问题很难用if语句来解决,或者说能解决但处理起来很麻烦,当然你可以把从1到99的数字逐一输入到命令行中去。这种做法既费时又费力,还特别容易出错。现实世界中有不少类似的问题需要具有规律性的重复操作,编程为了解决这些重复且规律的操作需求,演化出了循环语句结构。
3.2.1 while循环
第一个介绍的循环语句是while语句。为什么要先介绍它呢?因为while是一个条件循环语句,与if语句类似,while语句也需要一个布尔值判断条件。if后的条件为真,就会执行一次与之对应的代码块,而while中的代码块会一直循环执行,直到循环条件不再为真。
例3-5 while循环判断


while后面紧跟着条件判断语句。如果条件判断返回值为真,即i<10,则while会不停地循环执行下面的代码,将1~9输出到屏幕上。每次循环,i变量的数值都会在原来的基础上增加1。当i变成10的时候,会导致不满足条件而终止循环。
现在我们尝试解决0~100的累计之和。
例3-6 0~100的求和

在循环的内部变量n不断自减,直到n变为0时,它不再满足while条件,循环退出,n就是起到计数器的作用。需要特别注意的是,如果while后面条件始终为真,则会变成无限循环,一旦有了无限循环,程序就会不停地运行下去,直到程序被人为中断或关机。
3.2.2 for循环
Python提供的另一个循环机制就是for语句,这应该是最实用的循环结构。为什么这么说呢?因为for循环是对序列进行遍历的过程,什么是遍历?遍历就是从某个序列对象合集中逐个地读取元素,直到对象合集中没有更多元素为止。
我们再来看一下0~100累加之和的问题,这次用for循环来计算。
例3-7 for循环计算0到100之和

这里使用了range函数,此函数是Python内置的函数,用于生成一系列连续的整数,经常用于for循环中。图3-1解释了for循环的运行机制,可以看到使用for循环遍历range(101)数组的过程中,迭代变量i会先后被赋值为range(101)数组中的每个数字,并代入循环体中使用。只不过例子中的循环体比较简单,只输出累积相加的结果5050。

图3-1 for语句的执行流程
for循环遍历列表时,列表中有几个元素,for循环的循环体就执行几次,针对每个元素执行一次,迭代变量会依次被赋值为元素的值。
例3-8 遍历列表中元素

for循环是很实用、很常见的编程技巧,一定要熟练掌握。此外,大多数的编程语言都有for循环语句,用法大同小异。
3.2.3 嵌套循环
还有一种更为复杂的循环,被称之为嵌套循环。通俗点讲,就是循环中再定义循环。嵌套循环可能有多层,但是在一般的开发过程中,最多嵌套两层循环就可以搞定了。
上小学的时候,我们都学过乘法口诀表——“九九乘法表”,如图3-2所示。这个表格罗列了9以内的乘法运算,行元素和列元素交叉的地方就是行元素与列元素的乘积,如行元素2乘以列元素5等于两者的乘积10。
下面用嵌套循环来实现图3-2中的“九九乘法表”。

图3-2 九九乘法表
例3-9 九九乘法表

通过观察,不难发现这个嵌套循环的运行原理:最外层的循环依次将数值1~9存储到变量i中,变量i每取一次值,内层循环就要逐一将1~9存储变量j中,最后展示当前的i、j与i*j的结果。由于代码输出太长,所以这里仅展示主要代码。为了让输出的结果更为友好,可以进一步将代码改良。
例3-10 改良后的九九乘法表

这样一来输出结果是不是友好多了?
除了for循环中可以嵌套for循环,还有另外三种不同的嵌套方式。比如,while中嵌套while,while中嵌套for,for中嵌套while,用法大同小异,不必逐一赘述。
小白逆袭:按职责拆解循环体内复杂代码块
与其他编程语言不同,Python中循环语句后面可以带有else子句,用于在循环正常结束后做一些额外操作。所谓的正常结束是指执行到循环条件不满足或遍历完可迭代对象中的每个元素。非正常结束主要是指循环执行过程中遇到break语句,提前结束循环,break语句的相关内容将在后面3.4节的流程控制语句中进行介绍。