Python——控制语句(下)
060. break语句
break语句可用于while和for循环,用来结束整个循环。当有嵌套循环时,break语句只能跳出最近一层的循环。
# break语句
while True:
a = input("请输入一个字符(输入Q或q时退出):")
if a.upper()=='Q': # 相当于 a=='q' or a=='Q'
print("循环结束,退出")
break
else:
print(a)
运行结果:
061. continue语句
continue语句用于结束本次循环,继续下一次。多个循环嵌套时,continue也是应用于最近的一层循环。
# continue语句
empNum = 0 # 员工数
salarySum = 0 # 薪资总数
salarys = [] # 薪资列表
while True:
s = input("请输入员工的薪资(按q或Q结束):")
if s.upper()=='Q':
print("录入完成,退出")
break
if float(s)<0:
continue # 不录入本次记录,继续下一个循环
empNum += 1
salarys.append(float(s))
salarySum += float(s)
print("员工数:{0}".format(empNum))
print("录入薪资:",salarys)
print("平均薪资:{0}".format(salarySum/empNum))
运行结果:
062. else语句
while、for循环可以附带一个else语句(可选)。如果for、while语句没有被break语句结束,则会执行else子句,否则不执行。语法格式如下:
while 条件表达式:
循环体
else:
语句块
或者:
for 变量 in 可迭代对象:
循环体
else:
语句块
# else语句
salarySum = 0 # 薪资总数
salarys = [] # 薪资列表
for x in range(3):
s = input("请输入员工的薪资(按q或Q结束):")
if s.upper()=='Q':
print("录入完成,退出")
break
if float(s)<0:
continue # 不录入本次记录,继续下一个循环
salarys.append(float(s))
salarySum += float(s)
else:
print("您已全部录入3名员工的薪资") # for循环执行完整
print("录入薪资:",salarys)
print("平均薪资:{0}".format(salarySum/3))
运行结果:
063. 循环代码优化
- 尽量减少循环内部不必要的计算。
- 嵌套循环中,尽量减少内层循环的计算,尽可能向外提。
- 局部变量查询较快,尽量使用局部变量。
# 循环代码优化
import time
start1 = time.time()
for i in range(1000):
result = []
for m in range(10000):
result.append(i*1000+m*100)
end1 = time.time()
print("耗时:{0}".format((end1-start1)))
start2 = time.time()
for i in range(1000):
result = []
c = i*1000 # 将内层循环提取出来
for m in range(10000):
result.append(c+m*100)
end2 = time.time()
print("耗时:{0}".format((end2-start2)))
运行结果:
其他优化手段
- 连接多个字符串,使用join()而不使用+
- 列表进行元素插入和删除,尽量在列表尾部操作
064. 使用zip()并行迭代
我们可以通过zip函数对多个序列进行并行迭代,zip()函数在最短序列“用完”时就会停止。
# 使用zip()并行迭代
names = ("张三","李四","赵五","刘六")
ages = (18,19,20,21)
places = ("北京","上海","广州")
# 方法一
for name,age,place in zip(names,ages,places):
print("{0}--{1}--{2}".format(name,age,place))
# 方法二
for i in range(3):
print("{0}--{1}--{2}".format(names[i],ages[i],places[i]))
运行结果:
065. 推导式创建序列
推导式是从一个或者多个迭代器快速创建序列的一种方法。它可以将循环和条件判断结合,从而避免冗长的代码。推导式是典型的Python风格。
- 极大简化代码
- 效率极高
列表推导式
列表推导式生成列表对象,语法如下:
或者:
# 列表推导式
y = [x*2 for x in range (1,50) if x%5==0]
print(y)
# 循环语句(同上效果一样,但是代码量多了)
y = []
for x in range(1,50):
if x%5==0:
y.append(x*2)
print(y)
# 使用两个循环
cells = [(row,col) for row in range(1,5) for col in range(1,5)]
print(cells)
运行结果:
字典推导式
字典的推导式生成字典对象,格式如下:
类似于列表推导式,字典推导也可以增加if条件判断、多个for循环。
# 字典推导式
my_text = "i love python"
char_count = {c:my_text.count(c) for c in my_text} # 统计my_text每个字的出现次数
print(char_count)
运行结果:
集合推导式
集合推导式生成集合,和列表推导式的语句格式类似:
或者:
# 集合推导式
b = {x for x in range(1,100) if x%9==0}
print(b)
运行结果:
生成器推导式(生成元组)
元组是没有推导式的。
一个生成器只能运行一次。第一次迭代可以得到数据,第二次迭代数据已经没有了。
生成器是可迭代的对象,可循环。
# 生成器推导式
gnt = (x for x in range(1,100) if x%9==0)
print(gnt) # 此时的gnt只是一个生成器
print(tuple(gnt)) # 使用生成器迭代数据
print(tuple(gnt)) # 第二次迭代
# 使用for循环语句
gnt = (x for x in range(1,100) if x%9==0)
for x in gnt:
print(x,end=",") # 第一次迭代数据
print(tuple(gnt)) # 第二次迭代数据
运行结果:
066. 综合练习
画同心圆
初级方式画同心圆:
import turtle
# 画同心圆
t = turtle.Pen() # 获取画笔
t.goto(0,0) # 画笔移动到(0,0)
t.circle(10) # 半径为100的圆
t.goto(0,-10) # 画笔移动到(0,-100)
t.circle(20) # 半径为200的圆
t.goto(0,-20) # 画笔移动到(0,-200)
t.circle(30) # 半径为300的圆
turtle.done() # 程序执行完,窗口依然在
循环结构画同心圆:
import turtle
# 使用循环结构画同心圆
t = turtle.Pen() # 获取画笔
my_color = ('red','yellow','green','blue') # 设置颜色
t.width(4) # 设置线的宽度
t.speed(0) # 设置速度,1最慢,数值越大越快(0也很快)
for i in range(10):
t.penup() # 抬笔
t.goto(0,-i*10)
t.pendown() # 下笔
t.color(my_color[i%len(my_color)])
t.circle(i*10)
turtle.done() # 程序执行完,窗口依然在
画棋盘
# 画18*18的棋盘
import turtle
width = 30
num = 18
x = [(-300,300),(-300+width*num,300)]
y = [(-300,300),(-300,300-width*num)]
t = turtle.Pen() # 获取画笔
t.speed(10) # 改变速度
for i in range(0,19): # 画横线
t.penup()
t.goto(x[0][0],x[0][1]-30*i)
t.pendown()
t.goto(x[1][0],x[1][1]-30*i)
for i in range(0,19): # 画竖线
t.penup()
t.goto(y[0][0]+30*i,y[0][1])
t.pendown()
t.goto(y[1][0]+30*i,y[1][1])
t.hideturtle() #隐藏画笔
turtle.done() #保证运行窗口不被自动关闭