目录
3.3 循环结构
3.3.1 分类
循环结构共有两种:
- while循环:「无限循环」,用于循环次数难以提前确定,也可以用于循环次数确定的情况
- for循环:「有限循环」,用于循环次数可以提前确定,尤其常用于枚举序列,或迭代对象中的元素
一般而言,优先考虑使用for循环,而相同或不同的循环结构之间可以互相嵌套,实现更为复杂的逻辑。
3.3.1.1 for循环
for循环适用场景:
- 循环次数确定的时候
- 遍历序列
其使用语法如下:
for 变量 in 序列:
循环体
说明:
for - 关键字,固定写法
变量名 - 和声明变量的要求一样
in - 关键字,固定写法
序列 - 容器型数据:字符串、列表、字典、元组、集合、迭代器、生成器、range、文件、组合数据类型
: - 固定写法
循环体 - 和for保持一个缩进的一条或者多条语句;需要重复执行的语句
执行过程 让变量去序列中取值,一个一个的取,取完为止,每取一个值执行一次循环体,
for循环可以通过控制序列中元素的个数来控制循环的次数
# 测量列表中每个字符的长度
words=["mzd思想","邓小平理论","三个代表重要思想","科学发展观","新时代中国特色社会主义思想"]
for w in words[:]:
print(w,len(w))
# 测量列表中每个字符的长度
words = ["mzd思想", "邓小平理论", "三个代表重要思想", "科学发展观", "新时代中国特色社会主义思想"]
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循环适用场景:
- 死循环
- 循环次数不确定
其使用语法如下:
while 条件语句:
循环体
说明:
while - 关键字,固定写法
条件语句 - 任何有结果的表达式;数据、已经声明过的变量、运算表达式(不能是赋值语句)等
: - 固定写法
循环体 - 和while保持缩进的一条或者多条语句;(需要重复执行的语句)
执行过程: 先判断条件语句是否为True,如果为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 变量 in 序列:
循环体
else:
代码段
while 条件语句:
循环体
else:
代码段
else中代码段: 当循环自然死亡(for后的变量数据取完了;while后面的条件为False),else后面的代码段
会在循环结束后执行;如果循环是因为遇到break而结束的,那么else后面的代码段就不会执行
else的意义: 可以通过判断else中的代码有没有执行来判断循环有没有遇到break
words=["mzd思想","邓小平理论","三个代表重要思想","科学发展观","新时代中国特色社会主义思想"]
for w in words:
print(w, len(w))
break
else:
print('循环正常结束')
3.3.3 循环结构优化
为了获得更高的效率和运行速度,有必要对循环语句进行优化,遵循两个优化原则。
- 原则1:减少循环内部不必要计算,将与循环变量无关代码尽可能提取到循环之外
- 原则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('程序终止')