python | 控制流语句-循环结构
3.3 循环结构
3.3.1 分类
循环结构共有两种:
- while循环:「无限循环」,用于循环次数难以提前确定,也可以用于循环次数确定的情况
- for循环:「有限循环」,用于循环次数可以提前确定,尤其常用于枚举序列,或迭代对象中的元素
一般而言,优先考虑使用for循环,而相同或不同的循环结构之间可以互相嵌套,实现更为复杂的逻辑。
3.3.1.1 for循环
for循环常用于访问序列中的元素,序列中有多少个元素,for循环就执行多少次,因此for循环的循环次数是已知的,这种遍历方式在Python里称为迭代。可用for循环遍历的序列包括:字符串、列表、元组、集合、字典等等。
for循环语法如下:
for 变量 in 序列:
语句块
说明:
1.for:for循环关键字,固定写法
2.变量:循环变量
3.in: for循环关键字,固定写法
4.序列:包括字符串、列表、字典、元组、集合、迭代器、生成器、range、文件、组合数据类型
5.冒号: 固定写法
6.语句块: 格式上按Tab键缩进对齐;内容上是需要重复执行的一条或多条语句
执行过程:
让变量去序列中一个一个取值,每取一个值执行一次语句块,直到取完为止。
# 测量列表中每个字符的长度
words=["思想","*理论","三个代表重要思想","科学发展观","新时代中国特色社会主义思想"]
for w in words[:]:
print(w,len(w))
# 测量列表中每个字符的长度
words = ["思想", "*理论", "三个代表重要思想", "科学发展观", "新时代中国特色社会主义思想"]
for w in words[:]:
if len(w) > 5:
words.remove(w)
print(words)
# 求输入n个数的平均数
n=eval(input('要输入多少个数'))
sum=0.0
for i in range(n):
x=eval(input('请输入数字'))
sum=sum+x
print(sum/n)
3.3.1.2 while循环
while循环与for循环最大的区别在于:前者循环次数不确定,后者循环次数确认,体现在循环语法中就是,for循环可以通过控制序列中元素的个数来控制循环的次数;while循环是通过循环变量的修正,使得循环变量在某个临界点不满足条件语句时才结束循环,这是while循环区别于for循环的重要特征之一。
while循环适用场景:一是死循环;二是循环次数不确定。其使用语法如下:
while 条件语句:
语句块
循环变量的修正
说明:
1.while:关键字,固定写法
2.条件语句:包含循环变量的条件表达式,不能是赋值语句
3.冒号:固定写法
4.语句块:格式上按Tab键缩进对齐;内容上是需要重复执行的一条或多条语句
5.循环变量的修正:while循环每进行一次,对循环变量做一次修正
执行过程:
先判断条件语句是否为True,若为True就执行语句块,并修正循环变量,然后再次判断条件语句是否满足,
如果依然为True则执行循环并修正,直到条件语句为False时,循环结束。
# while循环:实现0到100的求和
i = 1
sum = 0
while i <= 100:
sum = sum+i
i = i+1 # 等价于i += 1(累加)
print(sum)
3.3.2 else拓展
for循环和while循环都存在else拓展用法:
- for循环:else语句只在for循环遍历完成后才执行,可用于判断循环执行情况
- while循环:else语句只在while循环条件不被满足时(为False)才执行
- break:若循环是因为break结束的,则else语句不会执行
其使用语法如下:
# for循环else拓展
for 变量 in 序列:
语句块
else:
语句块
# while循环else拓展
while 条件语句:
语句块
循环变量的修正
else:
语句块
执行过程:
1.当for循环变量遍历结束或while循环条件语句为False时,循环自然终止,此时才执行else后面的语句块
2.如果循环是因为遇到break而结束,那么else后面的语句块就不会执行
所以,可以通过判断else中的代码有没有执行,来判断循环有没有遇到break
words=["思想","*理论","三个代表重要思想","科学发展观","新时代中国特色社会主义思想"]
for w in words:
print(w, len(w))
break
else:
print('循环正常结束')
3.3.3 循环结构优化
for循环与while循环也可以嵌套,但是建议大家不要嵌套3层以上,那样的话执行效率会很低,所以有必要对循环结构进行优化,优化时遵循下面两个原则:
-
原则1:首先尽量减少循环嵌套层数,以<=3为佳
-
原则2:无论单层还是多层循环,尽量减少循环内部不必要计算,将与循环语句无关代码往外提
# 循环结构-优化前
import time
start = time.time() # 获取当前时间
digits = (1, 2, 3, 4)
for i in range(10000):
result = []
for i in digits:
for j in digits:
for k in digits:
result.append(i*100+j*10+k)
print('Time Used:', time.time()-start) # 输出所用时间
len(result)
# 循环结构-优化后,把计算的东西提出来
start = time.time() # 获取当前时间
digits = (1, 2, 3, 4)
for i in range(10000):
result = []
for i in digits:
i = i*100
for j in digits:
j = j*10
for k in digits:
result.append(i+j+k)
print('Time Used:', time.time()-start) # 输出所用时间
len(result)
3.3.4 循环控制语句
python中用break
、continue
来控制循环语句,以实现循环的终止和跳出。
3.3.4.1 break
「终止当次循环,并跳出当前循环」 —— 循环层结束。
可以从两方面理解:
- 终止当次循环:则当次循环后面的if、elif、else…都不再执行
- 跳出当前循环:若break跳出的是循环嵌套内层循环,则外层的循环会继续执行
# 遍历循环拓展模式:通过else判断循环是否正常结束
words=["mzd思想","*理论","三个代表重要思想","科学发展观","新时代中国特色社会主义思想"]
for w in words[:]:
print(w,len(w))
break
else:
print('循环正常结束')
# 从1开始累加,当和超过100时停止
i = 1
sum = 0
while i in range(100):
sum = sum+i
i = i+1
if sum > 100:
break
print(sum)
print(i)
# 计算小于100的最大素数
# 素数:只能表示为它自己和1的乘积,如13=13*1
for i in range(99, 1, -1):
for j in range(2, i):
if i % j == 0: # 不是素数
break # 跳出当前循环,继续遍历列表
else:
print(i)
break # break,跳出所有循环;删除break,输出所有素数
3.3.4.2 continue
「终止当次循环,不跳出当前循环」 —— 循环层未结束。
可以从两方面理解:
- 终止当次循环:则当次循环后面的if、elif、else…都不再执行
- 不跳出当前循环:循环会继续执行,直接进入下一次循环的条件判断
# 找出0-9之间的奇数、偶数,并打印出来
L1=[]
L2=[]
for i in range(10):
if i%2==0:
L1.append(i)
continue
L2.append(i)
L1
L2
# 找出符合条件的字符:打印非T的字符
for i in 'PYTHON':
if i == 'T':
continue
print(i)
else:
print('正常退出')
# 找出符合条件的字符:打印非T的字符
for i in 'PYTHON':
if i == 'T':
break # 体会break和continue的区别
print(i)
else:
print('正常退出')
3.3.5 死循环
死循环就是循环不会终止的循环类型,很多都是由于continue使用不当造成的,即continue使得条件表达式判断的结果永远为True,则产生死循环。
但死循环并非一无是处,可用于完成指定功能,如设置中断程序,常用while true
或 while 1
。
# continue使用不当带来的死循环
# 输出小于10的奇数
i = 0
while i < 10:
if i % 2 == 0:
continue
i += 1
print(i)
# 正确的用法
i = 0
while i < 10:
i += 1
if i % 2 == 0:
continue
print(i)
# 死循环巧妙应用
# 输入正数时一直循环,输入负数时停止
while True: # 等价于while 1
num = eval(input('请输入一个正数'))
if num < 0:
break
print('程序终止')
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步