Python基础(十二)——循环语句
本文以Python3以上为学习基础。
目录
1、使用循环的第一原则
2、while循环
2.1 while 和 循环控制语句(break、continue、pass)
3、for循环
3.1 range函数用法
3.2 for循环可以遍历的项目
3.3 for 和 循环控制语句(break、continue、pass)
4、循环的嵌套
4.1 for 循环里面嵌套 for 循环
4.1.1 for循环嵌套示例——乘法口诀表
4.2 while 循环里面嵌套 while循环
4.2.1 while循环嵌套示例——乘法口诀表
4.3 for 循环和 while 循环的嵌套。
4.3.1 for循环里面嵌套while循环——乘法口诀表
4.3.2 while循环里面嵌套for循环——乘法口诀表
5、while…else
6、for…else
循环语句允许我们执行一个语句或语句组多次。
Python里面提供了三种循环方式:
- while 循环持续执行其体直至判断条件不再满足。
- for 循环反复执行指定的操作直至完成所有迭代步骤。
- 嵌套结构中使用了 while 和 for 两种类型的循环进行层次化操作。
此外,在再次在循环执行的过程中调整语句执行顺序时,则可以通过循环空值语句来实现。
Python里面提供了三个循环控制语句:
- break 语句
- continue 语句
- pass 语句
下面我们一个一个的看。
1、使用循环的第一原则
首先是看循环。
我们使用循环的时候,一定要明确一个原则。
任何使用循环的情况,第一步考虑的是如何退出循环。
当我们进行循环操作时,在无法退出循环的情况下,在你的程序中涉及打开文件、调用内存管理服务以及创建内存分配请求等系列操作时,则会导致持续进行的死锁状态,并最终引发资源泄漏的问题
为此必须清晰地认识到这一原则的重要性:第一步就是确定循环何时能够退出。 (这一原则是我们经验丰富的程序员传授给我们的建议。)
下面我们看三个循环:while、for、循环嵌套
2、while循环
我们先看while循环的语法格式:
while 条件:
语句1
代码解读
如同执行条件语句所遵循的原则,在此逻辑框架下
语句1 就是我们要执行的循环语句,可以是单个语句或语句块。
我们先看看while循环的简易流程图:

在图上我添加了对条件的更改。你需要调整这个条件使其满足终止循环的要求。通过这种方式, 循环将正常结束.
我们下面验证以下:

上面例子可以清楚的结合流程图看到:我们循环打印数字1-9。
我们的思路就是:
a<10
- 第一步:分析循环终止条件为a < 10。
- 第二步:为了使循环能够正常终止,在每次循环迭代后调整a的值,并增加某个数值以改变其当前状态。因为我们的目标是输出数字1到9,并且a从1开始递增,则每次迭代后应将a增加1。
- 第三步:最终目标即为输出数字1至9(print(a))。
基于以上三步骤,我们的整体思路就定了。就可以成功编程了。

2.1 while 和 循环控制语句(break、continue、pass)
这时候我们突然有新的需求:
不能改变循环退出条件,我想对打印数字4,5,6的时候单独处理。
- 数字4:不打印数字4,因为它是一个不吉利的数字。
- 数字5:数字5的处理我还没想好呢,想好了再提需求。
- 数字6:如果打印了数字6,不需要打印后面的数字了,因为我想最后的退出永远是美好的。
在遇到新的需求时,在遵循前述的操作流程下
为解决上述问题,在Python编程中,当遇到需要跳转或终止循环的情况时,会使用到continue、break和pass这些关键字。
我们先看看Python的循环控制语句的含义:
| 控制语句 | 描述 |
|---|---|
| break 语句 | 在循环语句执行过程中终止循环,并且跳出整个循环 |
| continue 语句 | 在循环语句执行过程中终止当前循环,跳出该次循环。执行下一次循环。 |
| pass 语句 | pass是空语句 ,是为了保持程序结构的完整性。 |
可以看到:
- 使用break语句可使循环提前终止,并不再执行后续指令;对于需求6来说,则要求从第7个数字开始停止打印。
- 当遇到continue关键字时会立即终止当前循环;系统将跳过编号为4的指令不去执行。
- pass语句被用来维持程序的基本结构;在后续操作中仍需调用其他函数或模块来完成具体任务。
我们来试试看:
我们把每一部分单独拆出来看看:
continue测试语句
continue测试语句
continue测试语句

特别提示:为了确保程序逻辑正确,在使用continue关键字时,请将需要更改的条件放置在继续执行的位置之前
那么其原因在于:一旦continue执行后,后续的所有代码都不会被立即执行。当continue导致跳出当前循环时,则意味着当前循环将从头开始重新执行。
我们看下面这个例子:

continue测试语句
continue 测试语句
同样这完全不符合我们使用循环的原则:
任何使用循环的情况,第一步考虑的是如何退出循环。
在 a==4 的时候就根本无法退出循环。
a += 1
a += 1

当变量a等于5时,在执行pass语句时不会产生任何影响。如果需要进行相应的处理,则只需方便地添加相应的处理措施即可。

当a等于6时,在程序运行过程中会输出数值的结果为6,并通过break直接终止所有循环以避免后续的数值显示。

a==6
a==6
break测试数字语句
可以看出,在a等于6的情况下(即a==6),程序会执行print函数以输出该值。随后,在后续步骤中使用了break语句来跳过对这些数字(7,8,9)进行测试与打印。整个过程结束于这一轮循环之后。
综合上面三部分的处理,最终我们把三部分整合在一起就是下面的代码:

观察到,在循环过程中每次输出的数值都会换行,并归因于print()函数的原因。如果是采用其他输出方式,则可能会有不同的表现效果。具体细节请参考:print函数详解
while循环以后,我们看for循环。
3、for循环
for循环的基本语法:
for 【迭代变量】 in 【序列项目】:
语句1
代码解读
可能你看不明白for循环的语法含义。
我们用下面的例子来分析:

上面例子可以看到。我们把tmp变量里面的每个字符都打印出来了。
所以说: for循环是遍历任何序列的项目 ,如一个列表或者一个字符串。
我们看看for循环的工作方式:
- tmp变量存储着一个名为'zxc'的字符串型数据。
- 变量i被tmp找到其指向的对象'zxc'这一过程由于其属于序列数据类型的属性而得以实现因此可以通过索引操作逐个访问每个字符的具体内容。
- 在i等于‘z’的情况下程序会执行print(i)操作输出字母z随后继续执行循环体将i赋值为‘x’再次输出x依此类推直到最后一个字符c被打印出来此时循环将自动退出。
还记得我们说过的循环的原则吗?
任何使用循环的情况,第一步考虑的是如何退出循环。
然而for循环本身会自动终止运行。然而for循环处理的对象通常是序列中的各个项目。因此我们需要确定的是对这些序列项目的操作。
或许你认为这样做缺乏意义;然而我也发现坚持这一原则确实是编程中的良好习惯;并且在使用其他编程语言如C++时;其中迭代变量在for循环中需要手动增1或其他操作。
我们回到for循环的例子中。
当我们需要在访问序列元素的过程中确定其具体位置时
所以,for循环同样可以利用相同的方式:

可以看到是相同的结果,我们看看它的工作方式:
for i in range(len(tmp))
计算字符串'zxc'的长度
其实上面例子就是对列表的循环遍历。

下面我们看看range()函数的用法。
3.1 range函数用法
提示:range函数即为Python内置的一种基础功能模块,请确保所使用的range名称唯一且专有。
关于内置函数,后续再讲解。
下面我们看看range函数的语法格式和参数含义:
range(start,stop[,step])
代码解读
- 起始值:指定的起始数值,默认情况下设为0;若未明确指定该参数,则系统将自动将其设为0。
- 终止值:必需指定的终止数值。
- 步进量:定义序列中相邻元素之间的增量,默认值设定为1;若未明确指定该参数,则系统默认其值为1,并且不允许将其设为零。
我们直接上示例,一看就懂:

看到这个返回结果是不是看不懂了?
没有错。因为我们学习是Python3为学习基础的。
在Python2.x版本中,默认情况下range函数返回一个用于遍历原始列表的for循环结构。
而在Python3.x版本中,默认情况下range函数自身就是一个类型,并且实际上是实现了一个生成器对象;因为当for循环被调用时,数值会被逐个生成。
不过没关系,我们用列表把这些数字接出来就好了。
这次我们看看示例:
Python2 的情况:(图源网络)

Python3 的情况:

上面例子,可以很清楚的看懂range函数。
这时候我们看看下面这种情况:

我们按照range函数的格式分析一下:
range函数中的参数设置为-6;
根据range函数的格式进行划分:
range(start=0, step=1, stop=-6)
起始值设为0;
步长递增后的下一个值即为start+1*step(代入数值后应为1),但最后一个参数却设定为了-6;
然而最后一个参数设置为-6时却出现了问题。
但是Python这里没有报错,返回了空列表。

报错和返回结果,是两个含义,虽然返回的不是我们要的。应该如何修改呢?

我们让它反方向去增长就可以了。
比如我们要生成1-100的序列,直接用下面的方法就可以。
range(1,100)
代码解读
说完range,我们继续回到循环语句。
如果你忘了我们说哪里了,就看下下面这个例子:

for循环可以遍历任何序列的项目,如一个列表或者一个字符串。
从定义上来看,在Markdown中使用for循环确实可以遍历任何序列类型的项目。具体来说,在Markdown语法中常见的序列类型包括字符串和数字列表等。
3.2 for循环可以遍历的项目
我们一个一个看。
(1)字符串: 可以遍历

(2)列表: 可以遍历

(3)集合: 可以遍历

(4)元组: 可以遍历

(5)字典: 也可以遍历

可以看到,字典遍历出来的结果是键值对里面的键。
但是我们利用for循环遍历字典的时候,用的是下面的方法:

这种方法一定要牢记,很常用。
其实就是在利用字典中键值的提取方法:包括itemgetter用于获取键或值;以及其迭代器形式如iter_item_getter用于迭代器式的遍历操作
我个人倾向于使用 items()函数,并因此在这里仅限于介绍其基本用法。
对于其他方面的深入探讨,则建议读者自行研究或深入学习。
我们前面说了循环控制语句:break、continue、pass。
这些在for循环中依旧可以使用。
3.3 for 和 循环控制语句(break、continue、pass)
前面讲了循环控制语句,所以我们回顾一下。
| 控制语句 | 描述 |
|---|---|
| break 语句 | 在循环语句执行过程中终止循环,并且跳出整个循环 |
| continue 语句 | 在循环语句执行过程中终止当前循环,跳出该次循环。执行下一次循环。 |
| pass 语句 | pass是空语句 ,是为了保持程序结构的完整性。 |
还是之前相同的需求:
不能改变循环退出条件,我想对打印数字4,5,6的时候单独处理。
- 数字4:不打印数字4,因为它是一个不吉利的数字。
- 数字5:数字5的处理我还没想好呢,想好了再提需求。
- 数字6:如果打印了数字6,不需要打印后面的数字了,因为我想最后的退出永远是美好的。
直接上代码:

简单明了。
4、循环的嵌套
循环的包含就是一个循环体里面包含另一个循环。有三种不同的情况,我们一个一个地看。
4.1 for 循环里面嵌套 for 循环
语法格式:
for 【迭代变量】 in 【序列项目】:
for 【迭代变量】 in 【序列项目】:
语句1
语句2
代码解读
直接上示例,一看就懂:
遍历九次 zxc,每次遍历结果都是 z,x,c。

解释一下整个流程:
在i=1的过程中(阶段),系统将依次运行j从0至3之间的所有操作(步骤),直至所有zxc均被处理完毕(覆盖)。随后系统将进入下一个阶段(i=2),并重复上述操作流程;这一过程持续进行直至完成所有内部操作的处理(覆盖)。
经过一轮外部循环后(过程),内部操作将被彻底完成;当外部循环彻底完成时(达到最终目标)。
4.1.1 for循环嵌套示例——乘法口诀表
我们直接上典型的循环嵌套案例:乘法口诀表
由于在每次外层循环运行时内部的所有操作均完成;当外层完成所有操作后整个流程才会终止。
所以第一步:决定谁在内循环,谁是外循环。
我们分析一下乘法口诀表:

这不就决定了外循环是右边红框的值,内循环是左边绿色下划线的值。
因此就有了代码:

然而我们明确地观察到这些数据并没有按照乘法口诀表中的格式排布因此我们决定采取措施进行规范

这样我们的结果就完成了。
这是完整的代码:
for i in range(1,10): #等价于range(1,10,1),就是从1-9,就是红框的数字,要执行九次。
for j in range(1,i+1): #等价于绿色下划线的数字,直到等于红框数字,内循环执行一次结束,又因为Python中是右边数字不包含,所以i+1,
print(j,"*",i,"=",j*i,sep = "",end = " ") #计算乘法口诀。
print() #相当于每行执行结束我们输出一个换行符(\n),等价于:print("\n")
代码解读
这是结果:

4.2 while 循环里面嵌套 while循环
语法格式:
while 条件1:
while 条件2:
语句2
语句1
代码解读
和for循环一样,直接上示例。
遍历六次字符串zxc。

类似for循环的方式:每次外层运行一次时会触发内部的所有操作完成,并且只有当外层的所有操作完成后整个循环才会终止。
4.2.1 while循环嵌套示例——乘法口诀表
同样经典案例:乘法口诀表。
无需再深入探讨乘法口诀表。对于嵌套使用的for循环已经进行了分析。右侧的数字代表外层变量(外层变量),左侧的数字代表内层变量(内层变量)。
所以直接上代码:

while循环是不是代码看上去更容易理解。
代码如下:
i = 1
while i < 10:
j = 1
while j <= i:
print(j,"*",i,"=",j*i,sep = "",end = " ")
j += 1
print()
i += 1
代码解读
结果图:

4.3 for 循环和 while 循环的嵌套。
其实和 for 循环嵌套或者 while 循环嵌套是一样的。
循环嵌套始终遵循以下原则:在外层循环每执行一次时,在内层循环依次完成其所有迭代;只有在外层循环完成所有迭代后,整个循环才会终止。
语法格式:
# for循环里面嵌套while循环
for 【迭代变量】 in 【序列项目】:
while 条件1:
语句1
语句2
# while循环里面嵌套for循环
while 条件1:
for 【迭代变量】 in 【序列项目】:
语句2
语句1
代码解读
同样的直接上示例:乘法口诀表
4.3.1 for循环里面嵌套while循环——乘法口诀表

代码如下:
i = 1
while i < 10:
for j in range(1,i+1):
print(j,"*",i,"=",j*i,sep = "",end = " ")
j += 1
print()
i += 1
代码解读
4.3.2 while循环里面嵌套for循环——乘法口诀表

代码如下:
i = 1
while i < 10:
for j in range(1,i+1):
print(j,"*",i,"=",j*i,sep = "",end = " ")
j += 1
print()
i += 1
代码解读
唯一原则:每次外层运行一次时必须保证内层完全完成所有操作后才可终止;只有当外层的所有迭代结束后整个程序才会停止运行。 遇到问题第一步:首先要确定内外层的顺序关系;准确识别内外层结构有助于后续操作的顺利进行。
除此之外,再给大家分享一个新的。
5、while…else
有点类似if ... else。一个例子就看懂了。

6、for…else
一样的道理和if ... else一样。一个例子就看懂了。

总结:其实else就是在循环结束以后的处理。
以上就是整个Python 的循环语句。如果有错误,请及时指出。
