本文以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里面提供了三种循环方式:
除此之外,如果我们想再循环执行过程中更改语句执行的顺序,就可以使用循环空值语句。
Python里面提供了三个循环控制语句:
下面我们一个一个的看。
首先是看循环。
我们使用循环的时候,一定要明确一个原则。
任何使用循环的情况,第一步考虑的是如何退出循环。
我们在使用循环的时候,如果不能退出循环,当你的循环程序中涉及到打开文件、使用或者创建内存……等等一系列操作的时候,你无限的循环操作,最终就出现内存泄漏,文件句柄泄露……等等一系列严重的问题。
因此一定要明确这个原则:第一步就是考虑循环退出条件。 (这个原则是编程前辈教我的。)
下面我们看三个循环:while、for、循环嵌套
我们先看while循环的语法格式:
while 条件:
语句1
和条件语句一样的道理:判断条件可以是任何表达式,任何非零、或非空(null)的值均为true。
语句1 就是我们要执行的循环语句,可以是单个语句或语句块。
我们先看看while循环的简易流程图:
这里我在图中加了一个条件改变。你为了退出循环,一定要改变条件,让条件满足退出。这样循环才能退出。
我们下面验证以下:
上面例子可以清楚的结合流程图看到:我们循环打印数字1-9。
我们的思路就是:
基于以上三步骤,我们的整体思路就定了。就可以成功编程了。
这时候我们突然有新的需求:
不能改变循环退出条件,我想对打印数字4,5,6的时候单独处理。
- 数字4:不打印数字4,因为它是一个不吉利的数字。
- 数字5:数字5的处理我还没想好呢,想好了再提需求。
- 数字6:如果打印了数字6,不需要打印后面的数字了,因为我想最后的退出永远是美好的。
面对新的需求,如果按照上述的程序,我们一定会打印出数字4的,并且6以后的数字也会打印。同时我们也没有对数字5的处理流出空间。方便以后添加新的处理。
为了满足上面的需求,这时候就用到了Python中的循环控制语句:continue、break、pass
我们先看看Python的循环控制语句的含义:
控制语句 | 描述 |
---|---|
break 语句 | 在循环语句执行过程中终止循环,并且跳出整个循环 |
continue 语句 | 在循环语句执行过程中终止当前循环,跳出该次循环。执行下一次循环。 |
pass 语句 | pass是空语句,是为了保持程序结构的完整性。 |
可以看到:
我们来试试看:
我们把每一部分单独拆出来看看:
注意:在使用continue的时候一定要把条件改变的语句放在continue前面。
为什么?因为 continue 一定是continue以后的所有语句都不执行了。 跳出本次循环的含义是,当前循环从头开始执行。
我们看下面这个例子:
在 a==4的时候,执行了continue,下面的【continue测试语句】、【a += 1】和【print(a)】全部都没执行,也就是说最关键的循环退出条件语句【a += 1】永远不会继续执行,a==4 的情况永远卡死了。这就是死循环。
同样这完全不符合我们使用循环的原则:
任何使用循环的情况,第一步考虑的是如何退出循环。
在 a==4 的时候就根本无法退出循环。
因此,可以看到我的处理是,把【a += 1】放在continue之前,因为我们不打印数字4,所以【print(a)】放在了continue之后,不让它打印数字4。
可以看到这个打印的数字6,是在【a==6】这个条件里面【print(a)】打印的,后续的【break测试数字语句】、【print(a)】、以及后面数字7、8、9的循环处理全部没有打印。整个循环结束。
综合上面三部分的处理,最终我们把三部分整合在一起就是下面的代码:
我们可以看到,循环的每次打印出来的值,都换行了,这是因为print()函数原因,如果其他的输出方式。具体请参照:print函数详解
while循环以后,我们看for循环。
for循环的基本语法:
for 【迭代变量】 in 【序列项目】:
语句1
可能你看不明白for循环的语法含义。
我们用下面的例子来分析:
上面例子可以看到。我们把tmp变量里面的每个字符都打印出来了。
所以说: for循环是遍历任何序列的项目,如一个列表或者一个字符串。
我们看看for循环的工作方式:
还记得我们说过的循环的原则吗?
任何使用循环的情况,第一步考虑的是如何退出循环。
但是for循环的循环是自动结束的,但是for循环的对象是序列项目,因此我们瑞出循环的条件是对序列项目操作。
可能你觉得这样没意义,但是我跟人觉得坚持这个原则是编程好习惯,并且,你在使用其他语言,比如C++的时候,C++里面的for循环,迭代变量是需要你自己去手动加1或者其他操作的。
我们回到for循环的例子中。
因为我们在访问序列元素的时候是可以通过使用索引(偏移量),得到序列对象的某个元素。
所以,for循环同样可以利用相同的方式:
可以看到是相同的结果,我们看看它的工作方式:
其实上面例子就是对列表的循环遍历。
下面我们看看range()函数的用法。
注意:range函数是Python的内置函数,也就是说这个range名字不能乱改,独一无二。
关于内置函数,后续再讲解。
下面我们看看range函数的语法格式和参数含义:
range(start,stop[,step])
我们直接上示例,一看就懂:
看到这个返回结果是不是看不懂了?
没有错。因为我们学习是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,显然出现问题了。
但是Python这里没有报错,返回了空列表。
报错和返回结果,是两个含义,虽然返回的不是我们要的。应该如何修改呢?
我们让它反方向去增长就可以了。
比如我们要生成1-100的序列,直接用下面的方法就可以。
range(1,100)
说完range,我们继续回到循环语句。
如果你忘了我们说哪里了,就看下下面这个例子:
for循环可以遍历任何序列的项目,如一个列表或者一个字符串。
根据定义可以看到,for循环是可以循环任何有序列的项目,那么,到底有哪些是有序列的项目呢?
我们一个一个看。
(1)字符串:可以遍历
(2)列表:可以遍历
(3)集合:可以遍历
(5)字典:也可以遍历
可以看到,字典遍历出来的结果是键值对里面的键。
但是我们利用for循环遍历字典的时候,用的是下面的方法:
这种方法一定要牢记,很常用。
其实就是利用获得字典键、值的函数:items、iteritems、keys、iterkeys、values、itervalues,通过这些函数得到的是键或者值的列表,来遍历。
我个人喜欢用的 items()函数,所以这里就只是介绍items函数的用法。其他的感兴趣可以自己研究。
我们前面说了循环控制语句:break、continue、pass。
这些在for循环中依旧可以使用。
前面讲了循环控制语句,所以我们回顾一下。
控制语句 | 描述 |
---|---|
break 语句 | 在循环语句执行过程中终止循环,并且跳出整个循环 |
continue 语句 | 在循环语句执行过程中终止当前循环,跳出该次循环。执行下一次循环。 |
pass 语句 | pass是空语句,是为了保持程序结构的完整性。 |
还是之前相同的需求:
不能改变循环退出条件,我想对打印数字4,5,6的时候单独处理。
- 数字4:不打印数字4,因为它是一个不吉利的数字。
- 数字5:数字5的处理我还没想好呢,想好了再提需求。
- 数字6:如果打印了数字6,不需要打印后面的数字了,因为我想最后的退出永远是美好的。
直接上代码:
简单明了。
循环的嵌套就是一个循环体里面嵌入另一个循环。有三种情况,我们一个一个看。
语法格式:
for 【迭代变量】 in 【序列项目】:
for 【迭代变量】 in 【序列项目】:
语句1
语句2
直接上示例,一看就懂:
遍历九次 zxc,每次遍历结果都是 z,x,c。
解释一下整个流程:
i = 1 时候,遍历一次zxc,即 j 从 0-3,直到zxc全部遍历结束。然后执行 i = 2,同样等 j 从 0-3全部遍历结束,执行i=3……知道结束。
也就是外循环一次,内循环全部执行结束,直到外循环全部执行结束。
我们直接上典型的循环嵌套案例:乘法口诀表
因为外循环一次,内循环全部执行结束,外循环全部执行结束,整个循环才能结束。
所以第一步:决定谁在内循环,谁是外循环。
我们分析一下乘法口诀表:
1x1=1 1x2=2 2x2=4 1x3=3 2x3=6 3x3=9 1x4=4 2x4=8 3x4=12 4x4=16 1x5=5 2x5=10 3x5=15 4x5=20 5x5=25 1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36 1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49 1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64 1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
这不就决定了外循环是右边红框的值,内循环是左边绿色下划线的值。
因此就有了代码:
但是呢,我们清楚的看到没有按照乘法口诀表来排版,因此,我们来排版一下。
这样我们的结果就完成了。
这是完整的代码:
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")
这是结果:
语法格式:
while 条件1:
while 条件2:
语句2
语句1
和for循环一样,直接上示例。
遍历六次字符串zxc。
和for循环一样: 外循环一次,内循环全部执行结束,外循环全部执行结束,整个循环才能结束。
同样经典案例:乘法口诀表。
乘法口诀表就不分析了。for循环嵌套时候分析过了。右边是数字是外循环,左边的数字是内循环。
所以直接上代码:
while循环是不是代码看上去更容易理解。
代码如下:
i = 1
while i < 10:
j = 1
while j <= i:
print(j,"*",i,"=",j*i,sep = "",end = " ")
j += 1
print()
i += 1
结果图:
其实和 for 循环嵌套或者 while 循环嵌套是一样的。
循环嵌套永远遵守一个原则:外循环一次,内循环全部执行结束,外循环全部执行结束,整个循环才能结束。
语法格式:
# for循环里面嵌套while循环
for 【迭代变量】 in 【序列项目】:
while 条件1:
语句1
语句2
# while循环里面嵌套for循环
while 条件1:
for 【迭代变量】 in 【序列项目】:
语句2
语句1
同样的直接上示例:乘法口诀表
代码如下:
i = 1
while i < 10:
for j in range(1,i+1):
print(j,"*",i,"=",j*i,sep = "",end = " ")
j += 1
print()
i += 1
代码如下:
i = 1
while i < 10:
for j in range(1,i+1):
print(j,"*",i,"=",j*i,sep = "",end = " ")
j += 1
print()
i += 1
循环的嵌套总结:
唯一原则:外循环一次,内循环全部执行结束,外循环全部执行结束,整个循环才能结束。
遇到问题第一步:判断谁是内循环,谁是外循环。
除此之外,再给大家分享一个新的。
有点类似if ... else。一个例子就看懂了。
一样的道理和if ... else一样。一个例子就看懂了。
总结:其实else就是在循环结束以后的处理。
以上就是整个Python 的循环语句。如果有错误,请及时指出。