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 循环:在给定的判断条件为 true 时执行循环体,否则退出循环体。
  • for 循环:重复执行语句
  • 嵌套循环:while 循环 和 for循环 之间的嵌套

除此之外,如果我们想再循环执行过程中更改语句执行的顺序,就可以使用循环空值语句。

Python里面提供了三个循环控制语句:

  • break 语句
  • continue 语句
  • pass 语句

下面我们一个一个的看。


1、使用循环的第一原则 

首先是看循环。

我们使用循环的时候,一定要明确一个原则。

任何使用循环的情况,第一步考虑的是如何退出循环。

我们在使用循环的时候,如果不能退出循环,当你的循环程序中涉及到打开文件、使用或者创建内存……等等一系列操作的时候,你无限的循环操作,最终就出现内存泄漏,文件句柄泄露……等等一系列严重的问题。

因此一定要明确这个原则:第一步就是考虑循环退出条件。 (这个原则是编程前辈教我的。)


下面我们看三个循环:while、for、循环嵌套

2、while循环

我们先看while循环的语法格式:

while 条件:
    语句1

和条件语句一样的道理:判断条件可以是任何表达式,任何非零、或非空(null)的值均为true。

语句1 就是我们要执行的循环语句,可以是单个语句或语句块。

我们先看看while循环的简易流程图:

这里我在图中加了一个条件改变。你为了退出循环,一定要改变条件,让条件满足退出。这样循环才能退出。

我们下面验证以下:

上面例子可以清楚的结合流程图看到:我们循环打印数字1-9。

我们的思路就是:

  • 第一步:考虑循环退出条件,即 a < 10
  • 第二步:为了让退出条件【a<10】满足,我们就需要每一次执行结束去改变a的值,即 a 去加一个值去改变他。但是加的这个值是多少呢?我们就要根据我们的需求【打印1-9】来看,同时a也是从1开始。因此每次对a加1就好了。所以我们的改变条件是:a+1
  • 第三步:实现我们的最终需求:打印1-9(print(a))

基于以上三步骤,我们的整体思路就定了。就可以成功编程了。

 2.1 while 和 循环控制语句(break、continue、pass)

这时候我们突然有新的需求:

不能改变循环退出条件,我想对打印数字4,5,6的时候单独处理。

  • 数字4:不打印数字4,因为它是一个不吉利的数字。
  • 数字5:数字5的处理我还没想好呢,想好了再提需求。
  • 数字6:如果打印了数字6,不需要打印后面的数字了,因为我想最后的退出永远是美好的。

面对新的需求,如果按照上述的程序,我们一定会打印出数字4的,并且6以后的数字也会打印。同时我们也没有对数字5的处理流出空间。方便以后添加新的处理。

为了满足上面的需求,这时候就用到了Python中的循环控制语句:continue、break、pass

我们先看看Python的循环控制语句的含义:

控制语句描述
break 语句在循环语句执行过程中终止循环,并且跳出整个循环
continue 语句在循环语句执行过程中终止当前循环,跳出该次循环。执行下一次循环。
pass 语句pass是空语句,是为了保持程序结构的完整性。

可以看到:

  • break是把整个循环都退出——对应需求数字6(6以后的数字都不打印)
  • continue是退出这一次循环——对应需求数字4(不打印数字4)
  • pass是为了保持程序的完整——对应需求5(为以后的处理预留空间)

我们来试试看:

我们把每一部分单独拆出来看看:

  • 在 a==4 的时候,continue后的语句都不执行了(【continue测试语句】以及【数字4】都没有打印出来)

注意:在使用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。

  • 在 a==5 的时候,pass语句没有任何影响,如果我们有处理处理,我们可以随时加对应的处理。

  •  在 a==6 的时候,打印了数字6,我们用break直接跳出全部循环,不打印后面的数字。

可以看到这个打印的数字6,是在【a==6】这个条件里面【print(a)】打印的,后续的【break测试数字语句】、【print(a)】、以及后面数字7、8、9的循环处理全部没有打印。整个循环结束。


综合上面三部分的处理,最终我们把三部分整合在一起就是下面的代码: 

我们可以看到,循环的每次打印出来的值,都换行了,这是因为print()函数原因,如果其他的输出方式。具体请参照:print函数详解 


while循环以后,我们看for循环。

3、for循环

for循环的基本语法:

for 【迭代变量】 in 【序列项目】:
   语句1

可能你看不明白for循环的语法含义。

我们用下面的例子来分析:

 上面例子可以看到。我们把tmp变量里面的每个字符都打印出来了。

所以说: for循环是遍历任何序列的项目,如一个列表或者一个字符串。

我们看看for循环的工作方式:

  1. tmp变量引用的是"zxc"这个str类型的数据。
  2. 变量 i 通过 tmp 找到它所引用的对象 "zxc" ,因为 str类型 的数据属于序列类型,因此能够进行索引,于是就按照索引顺序,从第一字符开始,依次获得该字符的引用。
  3. 当 i = "z" 的时候,执行 print(i) ,打印出了字母z,结束之后循环第二次,让 i="x",然后执行print(i),打印出字母x,如此循环下去,一直到最后一个字符c被打印出来,循环自动结束

还记得我们说过的循环的原则吗?

 任何使用循环的情况,第一步考虑的是如何退出循环。

但是for循环的循环是自动结束的,但是for循环的对象是序列项目,因此我们瑞出循环的条件是对序列项目操作。

可能你觉得这样没意义,但是我跟人觉得坚持这个原则是编程好习惯,并且,你在使用其他语言,比如C++的时候,C++里面的for循环,迭代变量是需要你自己去手动加1或者其他操作的。


我们回到for循环的例子中。

因为我们在访问序列元素的时候是可以通过使用索引(偏移量),得到序列对象的某个元素。

所以,for循环同样可以利用相同的方式:

可以看到是相同的结果,我们看看它的工作方式:

  1. len(hello)得到 tmp 引用的字符串 "zxc" 的长度,为3
  2. range(len(tmp),就是 range(3),也就是 [0, 1, 2],对应这"zxc"每个字母索引。这里应用了一个新的函数 range(),关于它的用法,下面就会讲到。
  3. 【for i in range(len(tmp))】,就相当于【for i in [0,1,2]】,让 i 依次等于列表中的各个值。当i=0 时,打印 tmp[0],也就是第一个字符z。然后顺序循环下去,直到最后一个 i=2 为止。

其实上面例子就是对列表的循环遍历。

下面我们看看range()函数的用法。

3.1 range函数用法

注意:range函数是Python的内置函数,也就是说这个range名字不能乱改,独一无二。

关于内置函数,后续再讲解。

下面我们看看range函数的语法格式和参数含义:

range(start,stop[,step])
  • start:开始数值,默认为0,也就是如果不写这项,就是认为start=0
  • stop:结束的数值,必须要写的。
  • step:变化的步长,默认是1,也就是不写,就是认为步长为1。坚决不能为0

我们直接上示例,一看就懂:

看到这个返回结果是不是看不懂了?

 没有错。因为我们学习是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循环是可以循环任何有序列的项目,那么,到底有哪些是有序列的项目呢?

3.2 for循环可以遍历的项目

我们一个一个看。

(1)字符串:可以遍历 

(2)列表:可以遍历

(3)集合:可以遍历 

 (4)元组:可以遍历

 (5)字典:也可以遍历

 可以看到,字典遍历出来的结果是键值对里面的键。

但是我们利用for循环遍历字典的时候,用的是下面的方法:

这种方法一定要牢记,很常用。

其实就是利用获得字典键、值的函数:items、iteritems、keys、iterkeys、values、itervalues,通过这些函数得到的是键或者值的列表,来遍历。

我个人喜欢用的 items()函数,所以这里就只是介绍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 时候,遍历一次zxc,即 j 从 0-3,直到zxc全部遍历结束。然后执行 i = 2,同样等 j 从 0-3全部遍历结束,执行i=3……知道结束。

也就是外循环一次,内循环全部执行结束,直到外循环全部执行结束。

4.1.1 for循环嵌套示例——乘法口诀表

我们直接上典型的循环嵌套案例:乘法口诀表

因为外循环一次,内循环全部执行结束,外循环全部执行结束,整个循环才能结束。

所以第一步:决定谁在内循环,谁是外循环。  

我们分析一下乘法口诀表:

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")

这是结果:

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 的循环语句。如果有错误,请及时指出。 

  • 7
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值