python之嵌套循环

数据大师
数据大师
数据大师
294
文章
0
评论
2021-08-2410:23:19 评论 1,169 9331字
摘要

本文详细介绍了各种类型的嵌套循环

 

Python循环嵌套1、Python语言允许在一个循环体里面嵌入另一个循环

2、嵌套循环简单的来说就是一个循环出现在另一个循环里面。对于外循环的每次迭代,内循环都要完成它的所有迭代

3、当2个(甚至多个)循环结构相互嵌套时,位于外层的循环结构常简称为外层循环或外循环,位于内层的循环结构常简称为内层循环或内循环

 

循环嵌套类型可以在循环体内嵌入其他的循环体,如在while循环中可以嵌入for循环, 反之,也可以在for循环中嵌入while循环1、while循环中嵌套while (常用)2、for循环中嵌套for (常用)3、while循环中嵌套for循环4、for循环中嵌套while循环

 

 

一、while循环嵌套语法:

while expression:while expression:statement(s)statement(s)例1:使用while循环来实现乘法表

row = 1while row <= 9:col = 1while col <= row:print("%d*%d=%d " % (row, col, row*col), end = "")col += 1print() # 单纯的换行row += 1"""1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9 4*1=4 4*2=8 4*3=12 4*4=16 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 """注:1、循环嵌套结构的代码,Python解释器执行的流程为:⑴当外层循环条件为True时,则执行外层循环(属于外循环的语句)⑵外层循环体中包含了普通程序和内循环,当内层循环的循环条件为True时则执行内循环,直到内层循环条件为False,跳出内循环⑶如果此时外层循环的条件仍为True,则返回第2步,继续执行外层循环体,直到外层循环的循环条件为False⑷当内层循环的循环条件为 False,且外层循环的循环条件也为 False,则整个嵌套循环才算执行完毕

2、即:外部循环满足条件后,开始执行属于外循环的内部循环,等内部循环全部执行完毕,如果还满足外部循环条件,则外部循环再次执行,依次类推,直到跳出外层循环

3、python中的print打印函数默认自带换行,可以添加第二参数 end = " " 来阻止换行。end代表要打印字符串的最后最后一个字符,可以换成制表符或者其他的符号代替换行符而已

例1_1:

#while循环求1-10内的素数i = 2while (i < 10):j = 2while j <= (i / j):if not (i % j):breakj = j + 1if (j > i / j):print(i, " 是素数")i = i + 1"""2 是素数3 是素数5 是素数7 是素数"""注:1、在循环(while循环或for循环)中,可以使用continue或break语句来终止循环⑴continue或break语句用来终止循环语句,即循环条件没有False条件或者序列还没被完全递归完,也会停止执行循环语句⑵跳出当前循环,不会执行brea或continuek后面的代码:不会执行当前循环下所属代码块,但会继续执行下面其他代码块的代码(与循环语句同一缩进的代码)

2、如果使用嵌套循环,break语句将停止执行最深层的循环,并开始执行下一行代码

3、Python不支持一次跳出多个循环,我们可以通过在父循环中设定一个跳出标志,子循环通过更改这个标志来跳出多个循环

例2:

loop1 = 0loop2 = 0while True:loop1 += 1print("父循环:", loop1)break_flag = Falsewhile True:loop2 += 1if loop2 == 5:break_flag = Trueprint("跳出子循环")break #跳出当前循环,不会执行break后面的代码(当前所属循环代码块)print("子循环:", loop2)#该语句与break语句属于同一循环,因此执行内循环的break后,不会执行该代码if break_flag == True: #这条语句与内循环while同一缩进(不在内循环内),因此执行内循环的break语句后,也会执行该代码print("跳出父循环")break# break语句:跳出本次循环(嵌套循环中只跳出一层循环)"""父循环: 1子循环: 1子循环: 2子循环: 3子循环: 4跳出子循环跳出父循环"""注:break和continue的用法给我的感觉就是,在循环里面加一个if的判断语句⑴当满足这个if的条件时执行break或continue语句(并不再执行其后面的语句)⑵当不满足这个if判断语句时执行其他语句(其他语句正常写:先写正常的语句,再在正常的语句中加一个if的判断条件来跳出循环)

 

 

二、for嵌套循环1、for循环可以用来遍历某一对象⑴遍历:通俗点说,就是把这个循环中的第一个元素到最后一个元素依次访问一次

2、for循环和while循环⑴两者的相同点在于都能循环做一件重复的事情⑵不同点在于,for循环是在序列穷尽时停止,while循环是在条件不成立时停止

3、不管是嵌套for循环还是嵌套while循环:每执行外循环一次,都要等待内循环全部完成或中止,才继续接着外循环,如此反复,直到外循环完成

语法:

for iterating_var in sequence:for iterating_var in sequence:statements(s)statements(s)例3:

for i in range(4):print("外循环遍历出来的值:",i)for n in range(i):print("内循环遍历出来的值:",n)"""外循环遍历出来的值: 0外循环遍历出来的值: 1内循环遍历出来的值: 0外循环遍历出来的值: 2内循环遍历出来的值: 0内循环遍历出来的值: 1外循环遍历出来的值: 3内循环遍历出来的值: 0内循环遍历出来的值: 1内循环遍历出来的值: 2"""例4:

#for循环求素数num=[]for i in range(2,100):for j in range(2,i):if(i%j==0):breakelse:num.append(i)print(num)"""[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59......]"""例4_1:

#使用for循环实现乘法表for i in range(1, 10):for j in range(1, i+1):print("%d*%d=%d " % (i, j, i*j), end="")print()"""1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9 4*1=4 4*2=8 4*3=12 4*4=16 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 """

 

三、嵌套可变循环1、固定的数(比如range()函数中使用的数)也称为常数(constant)。如果在一个for循环的range()函数中使用常数,程序运行时循环总会运行相同的次数,在这种情况下,我们称循环次数是硬编码的。有时我们希望循环次数由用户来决定,或者由程序的另一部分决定,对于这种情况,我们就需要一个变量

2、对print()函数的使用做一个增强⑴在默认情况下,print()函数输出内容之后,会自动在内容末尾增加换行⑵如果不希望末尾增加换行,可以在print()函数输出内容的后面增加,end=""⑶其中 "" 中间可以指定print()函数输出内容之后,继续希望显示的内容

3、python中的print打印函数默认自带换行,可以添加第二参数 end = " " 来阻止换行。end代表要打印字符串的最后最后一个字符,可以换成制表符或者其他的符号代替换行符而已

4、字符串中的转义字符⑴ :在控制台输出一个制表符,协助在输出文本时垂直方向保持对齐
:在控制台输出一个换行符

例5:

for i in range(1,5):for number in range(5, 8):print(i, "*", number, "=", i * number)print()"""1 * 5 = 51 * 6 = 61 * 7 = 72 * 5 = 102 * 6 = 122 * 7 = 143 * 5 = 153 * 6 = 183 * 7 = 214 * 5 = 204 * 6 = 244 * 7 = 28"""例5_1:

#使用for循环实现for i in range(1, 9+1):for j in range(1, i+1):print("%d*%d=%d " % (i, j, i*j), end="")print()#使用while循环实现row = 1while row <= 9:col = 1while col <= row:print("%d*%d=%d " % (row, col, row*col), end = "")#print("%d*%d=%d" % (row, col, row * col), end=" ")col += 1print() # 单纯的换行row += 1#使用while+for循环实现for x in range(1,10):y = 1while y <= x:print("%d*%d=%d " % (y, x, x * y),end = "")y += 1print()#使用其他写法print("
".join(" ".join(["%s*%s=%s" %(x,y,x*y) for y in range(1, x+1)]) for x in range(1, 10)))
"""1*1=12*1=2 2*2=43*1=3 3*2=6 3*3=94*1=4 4*2=8 4*3=12 4*4=165*1=5 5*2=10 5*3=15 5*4=20 5*5=256*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=367*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=498*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=649*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81"""注:嵌套循环中感觉还是可能for循环比较常见吧,可能也只要实际遇到了才会有跟深的理解,可能写着写着就会写成for循环中嵌套了一个for循环。特别是那种需要多次遍历的场景

例6:

#Python处理Excel文件import xlrdexcel_path = "F:\Excel_demo\demo.xls"#打开文件,获取excel文件的workbook(工作簿)对象excel = xlrd.open_workbook(excel_path,encoding_override="utf-8")#获取sheet对象all_sheet = excel.sheets()#循环遍历每个sheet对象sheet_name = []sheet_row = []sheet_col = []for sheet in all_sheet:sheet_name.append(sheet.name)print("该Excel共有{0}个sheet,当前sheet名称为{1},该sheet共有{2}行,{3}列".format(len(all_sheet),sheet.name,sheet.nrows,sheet.ncols))for each_row in range(sheet.nrows):#循环打印每一行print("当前为%s行:"% each_row,type(each_row))print(sheet.row_values(each_row),type(sheet.row_values(each_row)))first_row_value = sheet.row_values(0)#打印指定的某一行print("第一行的数据为:%s" % first_row_value)"""该Excel共有3个sheet,当前sheet名称为小于一比八的职位,该sheet共有4行,6列当前为0行: <class "int">["地区", "单位名称", "职位代码", "职位名称", "招录人数", "报考人数"] <class "list">当前为1行: <class "int">["省级单位", "浙江警官职业学院", "13312004000000001", "司法警务专业教学", 1.0, "0"] <class "list">当前为2行: <class "int">["省级单位", "浙江警官职业学院", "13312004000000002", "法学教学", 1.0, "1"] <class "list">当前为3行: <class "int">.......第一行的数据为:["地区", "单位名称", "职位代码", "职位名称", "招录人数", "报考人数"]"""

 

四、拓展死循环1、何为死循环:在编程中,一个无法靠自身的控制终止的循环被称为死循环

2、在Python中while循环的执行条件为:While关键字后的条件语句为True⑴因此当条件为"while True或while 1"时,如果没有特殊处理,那么就会一直执行执行while循环,这种就被称为死循环(不会出现条件为False的情况,无法跳出循环)

3、因为死循环无法终止,会一直运行下去,所以我们要尽量避免出现死循环

4、当然,我们也可以使用break或continue关键字来终止某一循环⑴break:某一条件满足时,退出循环,不再执行后续重复的代码(跳出整个循环)⑵continue:某一条件满足时,不执行后续重复的代码(跳出当前循环)⑶break和continue只针对当前所在循环有效⑷break和continue关键字都可以用在while循环或for循环中

例7:

n = 0while True: if n == 5:break #使用break来跳出死循环print(n)n += 1print("循环结束")"""当循环是一个死循环时,就必须使用break来指明跳出循环的条件,不然程序会一直运行下去01234循环结束"""例7_1:

for i in range(5):if i == 3:continueprint(i)"""0124"""例7_2:

number = 5while True:num = int(input("请输入数字:"))if num == number:print("正确")break #尝试有break的情况(跳出循环时,只结束当前代码块,会执行后面代码块的代码)elif num > number:print("大了")else:print("小了")print("end") #有break时,当跳出当前循环后,会继续执行循环后面的代码(与循环关键字同一层级的代码)"""请输入数字:4小了请输入数字:6大了请输入数字:5正确end"""例7_3:

number = 5while True:num = int(input("请输入数字:"))if num == number:print("正确")#尝试无break的情况(跳出循环时,只结束当前代码块,会执行后面代码块的代码)elif num > number:print("大了")else:print("小了")print("end") #无break时,永远都不会执行这句,会显得多余,但是不会报错"""请输入数字:6大了请输入数字:5正确请输入数字:1小了"""例7_4:

usename = "root"passworld = "123456"count = 3while True:name = str(input("请输入用户名:"))if name == usename:print("用户名正确")breakelse:print("用户名错误,请再次输入")while True:world = input("请输入密码:")if world == passworld:print("密码正确,即将进入系统")breakif count > 0:count -= 1if count <= 0:print("无输入次数,请稍后再试")breakprint("密码错误,还剩" + str(count) + "次机会," + "请再次输入密码")#print("密码错误,还剩%s次机会,请再次输入密码" % count)# 不转为str会报错:TypeError: Can"t convert "int" object to str implicitly"""请输入用户名:bij用户名错误,请再次输入请输入用户名:root用户名正确请输入密码:6546密码错误,还剩2次机会,请再次输入密码请输入密码:16516密码错误,还剩1次机会,请再次输入密码请输入密码:123456密码正确,即将进入系统"""

for循环与if语句例8:

import datetimedef DealSelectData( selectDatas):# 定义一个大列表来装所有子数据列表:是一个嵌套了列表的列表selectDataLists = []for selectData in selectDatas:# 定义一个小列表来装该条数据selectDataList = []for eachData in selectData:# 如果字段值为整形、浮点型、字符串:那么不需要整理,直接加入到该条数据列表中if isinstance(eachData, int) == True or isinstance(eachData, str) == True or isinstance(eachData,float) == True:pass# selectDataList.append(eachData)# 如果字段值为datetime类型:那么就将其转为字符串型的时间值elif isinstance(eachData, datetime.datetime):eachData = eachData.strftime("%Y-%m-%d %H:%M:%S")# selectDataList.append(eachData)# 如果字段值为None:那么就添加null,毕竟数据库中空值表示为nullelif eachData is None:eachData = "null"# selectDataList.append("null")else:print("该类型的值未整理:请添加相应代码")# 这里想说明下append()语句放在这里与放在每个判断条件中是一样的:都是内循环语句块内(前提条件是每个判断后都会有添加到列表的操作)#将处理后的元素加到小列表中selectDataList.append(eachData)#将小列表添加到大列表中selectDataLists.append(selectDataList)print("整理后的查询数据为:", selectDataLists)return selectDataListsdata = [(1, "张三", "China", datetime.datetime(2020, 9, 10, 20, 34, 23), datetime.datetime(2020, 7, 20, 20, 34, 25, 269000), 1, 4, 2, 2424),(2, "李四", "China", datetime.datetime(2022, 7, 5, 20, 34, 58), datetime.datetime(2020, 7, 19, 12, 35, 1), 2, 2, 3, 7747),(3, "王五", "China", datetime.datetime(2020, 7, 20, 21, 18, 16), datetime.datetime(2020, 7, 20, 21, 18, 16), 2, 3, 4, 4242)]DealSelectData(data)"""整理后的查询数据为: [[1, "张三", "China", "2020-09-10 20:34:23", "2020-07-20 20:34:25", 1, 4, 2, 2424], [2, "李四", "China", "2022-07-05 20:34:58", "2020-07-19 12:35:01", 2, 2, 3, 7747], [3, "王五", "China", "2020-07-20 21:18:16", "2020-07-20 21:18:16", 2, 3, 4, 4242]]"""注:

1、在if...elif...else(if...else)语句中:如果条件满足了其中一个条件,就不会判断(执行)其他条件了⑴满足if条件后,就不会继续判断elif和else:直接跳过elif和else继续往下执行⑵不满足if条件,则判断第一个elif,满足第一个elif后,就不会继续判断其余elif和else:直接跳过其余elif和else继续往下执行⑶不满足if和第一个elif条件,则判断第二个elif,满足第二个elif后,就不会继续判断其余elif和else:以此类推⑷if和所有elif都不满足时,就执行else

2、内循环完全执行结束后才会开始下一个外循环:内循环元组中的元素都经历了遍历和处理后,外循环才会遍历出下一个元组

3、(外循环)第一次for循环遍历:依次遍历出列表中的每一个元组⑴内循环中:元组内的元素全部遍历、处理并加入到小列表后,继续往下执行外循环语句(selectDataLists.append()操作)和下一次循环⑵内循环和selectDataLists.append(selectDataList)语句都是属于外循环语句块的:内循环执行结束后,继续往下执行,即执行selectDataLists.append(selectDataList)

4、(内循环)第二次for循环遍历:依次遍历出元组中的每一个元素⑴在内循环中:元素依次遍历并分别判断处理(重新赋值)后执行append()操作①append()操作语句可以写在每一个判断语句中,也可以写在for循环最后(与if等判断语句同一缩进,前提条件是每个判断后都会有添加到列表的操作)②因为,判断语句和append()语句处于同一缩进且都在内循环内:不同的判断条件互不影响重新赋值,在判断条件语句执行结束后,都会执行append()操作(都在内循环中)

 

End.

作者:不怕猫的耗子A

本文为转载分享,如果涉及作品、版权和其他问题,请联系我们第一时间删除(微信号:lovedata0520)

更多文章前往首页浏览http://www.itongji.cn/

 

  • 我的微信公众号
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: