循环结构之for循环
实现循环结构还可以用关键字for
。
for关键字
我们来看这一段代码:
emotions = ['smile', 'laugh', 'cry', 'angry']
for emo in emotions:
print('我现在的心情是:', emo)
"""运行结果:
我现在的心情是: smile
我现在的心情是: laugh
我现在的心情是: cry
我现在的心情是: angry
"""
for循环可以遍历一个含多元素的数据类型,如字符串、列表 、元组、字典、集合等
上述程序就是将列表中的每个元素逐个取出,并且打印了出来。
那么for循环具体怎么呢,适用什么场景?
用法:
for 变量名 in 能遍历的数据类型:
子代码块
- 与while不同,for循环后面跟的不是条件,它的循环体正常结束的条件是数据值被遍历完了
- for 后面的变量会绑定本次遍历的元素值,这个变量在循环体中可取(不可改)
练习
l1 = [11,2,3,2,2,1,2,1,2,3,2,3,2,3,4,3,2,3,2,2,2,2,3,2]
# 统计列表中有多少个数字2
count = 0
for i in l1:
if i == 2:
count += 1
print('列表中有%s个2' % count)
for循环体的break和continue
for同样作为循环结构的关键字,与while自然也有一些共性
-
for循环体中碰到
break
关键字,会立即终止循环,执行for后续的同级代码l1 = [1, 2, 3, 4] for i in l1: if i == 3: break print(i) # 输出结果 1 2
-
for循环体中碰到
continue
关键字,会立即停止本次循环,执行下一次循环l1 = [1, 2, 3, 4] for i in l1: if i == 3: continue print(i) # 输出结果 1 2 4
for配合else
for循环如果是正常结束循环(没有被break打断的而结束了循环)
则会执行else子代码块的内容:
l1 = [1, 2, 3, 4]
for i in l1:
if i == 3:
continue
print(i)
else:
print('正常结束就能看到我喽')
# 输出结果
1
2
4
正常结束就能看到我喽
range
range()常常能和for循环搭配起来,因为它可以生成一个可以遍历的数据类型。
我们可以看一看range和for循环搭配的几种用法
-
range(一个数字)
for i in range(10): print(i, end=' ') # 0 1 2 3 4 5 6 7 8 9 for i in [0, 1, 2, 3 ,4 ,5 ,6, 7, 8, 9]: print(i, end=' ') # 0 1 2 3 4 5 6 7 8 9
可以看见range(10)相当于生成了一个从0开始到9的一个列表。(是括号中的数字的前一个数)
-
range(两个数字)
for i in range(5, 10): print(i, end=' ') # 5 6 7 8 9 for i in [5 ,6, 7, 8, 9]: print(i, end=' ')
从效果来看,range(5, 10)相当于从5到9的一个列表。(左边包含,右边不包含)
-
range(三个数字)
for i in range(1, 10, 2): print(i, end=' ') # 1 3 5 7 9 for i in [1 ,3, 5, 7, 9]: print(i, end=' ') # 1 3 5 7 9
range(1, 10, 2)表示从1开始,到10之前,以等差为2生成一个列表。(最后一个数字表示步长)
所以我们可以知道range的括号内含的几个参数代表什么意思了,也简单掌握了range生成数字列表的功能。
练习
- 用循环计算数字1-100的和:
# 参考
total = 0
for i in range(1, 101):
total += i
print('1-100的总和为:', total)
- 编写代码自动生成所有页网址(注意总共多少页)
https://movie.douban.com/top250
# 参考
douban_url = 'https://movie.douban.com/top250?start=%s&filter='
for i in range(0, 251, 25):
print(douban_url % i)
for循环嵌套
循环嵌套,就是拿循环中套循环。
# 除了利用range()生成数字列表,还可以range决定循环次数。
for i in range(4): # 外循环运行四次
for j in range(5): # 内循环运行五次
print('*', end='')
print()
'''运行结果:
*****
*****
*****
*****
'''
内循环循环五次产生一行五个*号
外循环将循环五次的内循环循环了四次,产生了4行
while配合else
while配合else使用,则在正常结束循环体代码时会触发else的代码块。
# 猜数字
i = 0
num = '17'
while i < 3:
# 每次循环要求猜数字
guess_num = input('猜一下数字')
# 猜数字猜对了,通过break退出循环
if num == guess_num:
print('猜对了,你还是懂我')
break
# 三次循环都没有猜对,正常结束循环体
else:
print('猜了三次还猜不出来,不心有灵犀')
while循环补充
死循环
不仅无法自动结束,在持续期间还会占用CPU的大量资源。
是十分危险的无限循环行为。
说到危险就要提到不久前,b站因为几行代码,导致“0”溢事件,不断的循环运算,导致b站的服务器被占满,直接崩了。
什么样的代码算死循环呢?
count = 2
while True:
count **= 2
# 无限幂运算,想想就刺激,不要复制到自己的电脑尝试。
while循环嵌套
while循环嵌套,是大循环嵌套小循环非常6的一个构造。
i = 1
while i < 3:
print('外层循环%s' % i)
j = 1
while j < 3:
print('内层循环%s' % j)
j += 1
i += 1
# 运行结果:
'''
外层循环1
内层循环1
内层循环2
外层循环2
内层循环1
内层循环2
'''
每执行一次外层循环体,都会完整的走完一次内层循环。
因为内层while是外层while的循环体。
了解:while嵌套之break生效
# 不断询问账户,直到输入正确进入内层循环
while True:
account = input('输入账户')
if account == 'leethon':
# 不断输入数字,当数字输入是3时,退出程序
while True:
num = input('输入数字')
if num == '3':
break
else:
print('账户错了,重新输入')
以上的程序中,当我们猜对数字后,会发现程序要求我们继续输入账户,说明内层的break让程序退出了内层循环,但却无法跳出外层循环。
所以我们可以得出一个结论:break仅打断它所在的最内层循环
那么我们想要跳出外层循环应该怎么做呢?
有两个方案:
-
在外层的while循环体也加一个break
- 如上,当内循环结束后就立马跟一个break结束外循环
- 新加的break放在这里与内while同级,同属于外循环体,所以碰到后会结束外循环
- 这个break在if分支下,即当账户正确时且内部数字也猜对了才会结束外循环
-
使用全局标记退出
# 定义一个全局变量 flag = True # 一开始flag一直为真 while flag: account = input('输入账户') if account == 'leethon': # 不断输入数字,当数字输入是3时,退出程序 while flag: num = input('输入数字') if num == '3': # 只有当这里才可以修改flag为假 flag = False else: print('账户错了,重新输入')
- 当猜对数字后,flag修改为False并不是立即结束循环,只有break才能打断循环
- flag修改后,此次循环正常结束,进入下一次while条件判断
- 内层while条件判断发现flag为假,不必进行下一次循环了
- 外层while条件判断发现flag为假,不必进行下一次循环了
转载请注明出处:http://www.xjzhisheng.com/article/20230305/702675.html