循环结构用来重复执行一条或多条语句。表达这样的逻辑:如果符合条件,则反复执行循环体里的语句。在每次执行完后都会判断一次条件是否为True,如果为True则重复执行循环体里的语句。图示如下:
循环体里面的语句至少应该包含改变条件表达式的语句,以使循环趋于结束;否则,就会变成一个死循环。
while循环
while 表达式为://False则跳出循环 True执行循环 循环体语句
【操作】利用while循环打印0-10的数字
num=0while num<11 print(num) num+=1
for循环用于可迭代对象遍历
for循环通常用于可迭代对象的遍历。for循环的语法格式如下:
for 变量 in 迭代对象: 循环体语句
【操作】遍历一个元组或列表
for x in (20,30,40): print(x*3)
可迭代对象
Python包含以下几种可迭代对象:
1.序列。包含:字符串、列表、元组
2.字典
3.迭代器对象(iterator)
4.生成器函数(generator)
5.文件对象
我们已经在前面学习了序列、字典等知识,迭代器对象和生成器函数将在后面进行详解。接下来,我们通过循环来遍历这几种类型的数据:
【操作】遍历字符串中的字符
for x in list("wmd.cn"): print(x)
【操作】遍历字典
d={'name':'完美岛','age':19}for x in d: #遍历所有的key print(x)for x in d.values(): #遍历所有的value print(x)for x in d.keys(): #遍历所有的key print(x)for x in d.items(): #遍历所有的键值对 print(x)
range对象
range对象是一个迭代器对象,用来产生指定范围的数字序列。格式为:range(start,end [,step])
生成的数值序列从start开始到end结束(不包含end)。若没有填写start,则默认从0开始。step是可选的步长,默认为1。如下是几种典型示例:
for i in range(10) 产生序列:0123456789for i in range(3,10) 产生序列:3456789for i in range(3,10,2) 产生序列:3579
【操作】利用for循环,计算1-100之间数字的累加和,计算1-100之间数的累加和。
sum=0for i in range(1,100): sum+=iprint(i)
嵌套循环
一个循环体内可以嵌入另一个循环,一般称为”嵌套循环”,或者“多重循环”。
【操作】打印如下图案
0 0 0 0 01 1 1 1 12 2 2 2 23 3 3 3 34 4 4 4 4
for i in range(5): for j in range(5): print(i,end="\t") print()
【操作】利用嵌套循环打印九九乘法表
for i in range(1,10): s="" for j in range(1,10): s+=str.format("{0}*{1}={2}\t",i,j,i*j) print(s)
break
break语句可用于while和for循环,用来结束整个循环。当有嵌套循环时,break语句只能跳出最近一层的循环。
【操作】使用break语句跳出循环
while True: a=input("请输入Q或q结束程序") if a.upper()=='Q': print("结束循环,跳出") break else: print(a)
continue
continue语句用于结束本次循环,继续下一次。多个循环嵌套时,continue也是应用于最近的一层循环。
【操作】要求输入员工的薪资,若薪资小于0则重新输入。最后打印出录入员工的数量和薪资明细,以及平均薪资
else语句
while、for循环可以附带一个else语句(可选)。如果for、while语句没有被break语句结束,则会执行else后表达式作为结尾,否则不执行。语法格式如下:
while 条件表达式: 循环体else: 语句块或者:for 变量 in 可迭代对象: 循环体else: 语句块
num=1while num<10: print(num) num+=1 if num>5: breakelse: print("end")
循环代码优化
虽然计算机越来越快,空间也越来越大,我们仍然要在性能问题上“斤斤计较”。编写循环时,遵守下面三个原则可以大大提高运行效率,避免不必要的低效计算:
尽量减少循环内部不必要的计算
嵌套循环中,尽量减少内层循环的计算,尽可能向外提
局部变量查询较快,尽量使用局部变量
循环内用到多个字符串拼接,使用join 而不是+ ,+会产生新的字符串对象
列表操作元素插入删除,尽量在列表尾部操作
import time#在循环内部计算start=time.time()for i in range(100): result=[] for m in range(10000): result.append(i*1000+m*1000)end=time.time()print("循环1耗时:{}".format((end-start)))start2=time.time()for i in range(100): result=[] c=i*1000 for m in range(10000): result.append(c+m*1000)end2=time.time()print("循环2耗时:{}".format((end2-start2)))
其他优化手段:
连接多个字符串,使用join()而不使用+
列表进行元素插入和删除,尽量在列表尾部操作
zip并行迭代
我们可以通过zip()函数对多个序列进行并行迭代,zip()函数在最短序列“用完”时就会停止。
【操作】测试zip())并行迭代
a=('完美1岛','完美2岛','完美3岛')b=(2,3)for name,age in zip(a,b): #取最少的那组 print("{0}:{1}".format(name,age))
结果:
完美1岛:2
完美2岛:3