while 循环结构 _死循环处理
这里先跟大家说一话 当然也是跟博主自己说一句话 就是目标专一 总会有完成的那一天
坚持 你的人生家庭财力都会有一定的改观 Be patient!
循环是用来重复执行一条或者多条语句
# while 条件表达式:
# 循环体语句
# while打印0-10的数字
num = 0
while num<=10:
print(num)
num += 1
print("end")
# 0
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
# 10
# end
# 利用while循环计算 1-100之间的累加和
num = 0
sum_all = 0
while num<=100:
sum_all += num # 这句话与sum_all = sum_all + num同理
num += 1 # 这句话很重要 没有这句话就是死循环
print("1-100所有数字的累加和:",sum_all)
# 1-100所有数字的累加和: 5050
for循环结构遍历各种可迭代对象 _range对象
可迭代对象包括
- 序列:字符串 元组 列表
- 字典
- 迭代器对象(iterator)
- 生成器对象(generator)
- 文件对象
Q:什么是生成器对象?(博主的疑问 答案大多不正确 知道的伙伴可以发送至评论区 谢谢各位)
应该是元组的推导式先生成生成器对象 并且这种生成器对象只能使用一次
# for 变量 in 可迭代对象:
# 循环体语句
for x in (20,30,40):
print(x*3)
# 60
# 90
# 120
for x in "Kyle": # x在这里是临时变量 名字随意 只限于for循环内使用
print(x)
# K
# y
# l
# e
d = {'name':'Kyle','age':19,'address':'world'}
for x in d:
print(x) #默认就是遍历字典中的所有key
# name
# age
# address
d = {'name': 'Kyle', 'age': 19, 'address': 'world'}
for x in d:
print(d.keys())
# dict_keys(['name', 'age', 'address'])
# dict_keys(['name', 'age', 'address'])
# dict_keys(['name', 'age', 'address'])
d = {'name': 'Kyle', 'age': 19, 'address': 'world'}
for x in d:
print(d.values())
# dict_values(['Kyle', 19, 'world'])
# dict_values(['Kyle', 19, 'world'])
# dict_values(['Kyle', 19, 'world'])
d = {'name': 'Kyle', 'age': 19, 'address': 'world'}
for x in d:
print(d.items())
# dict_items([('name', 'Kyle'), ('age', 19), ('address', 'world')])
# dict_items([('name', 'Kyle'), ('age', 19), ('address', 'world')])
# dict_items([('name', 'Kyle'), ('age', 19), ('address', 'world')])
range 对象
range对象是一个迭代器对象 产生指定范围的数字列表
# range(start,end,step) # 牢记包头不包尾
for x in range(10):
print(x,end="\t")
# 0 1 2 3 4 5 6 7 8 9
for x in range(3,10,2):
print(x,end="\t")
# 3 5 7 9
# for循环计算1-100累加和 并计算其中偶数累加和与奇数累加和
sum_all = 0
sum_even = 0
sum_odd = 0
for num in range(101): # 注意这里要101喔 因为range循环包头不包尾啊对不对啊? 哈哈哈哈
sum_all += num
if num % 2 == 0:
sum_even += num
else:
sum_odd += num
print("1-100所有数字的累加和{0},偶数累加和{1},奇数累加和{2}".format(sum_all,sum_even,sum_odd))
# 1-100所有数字的累加和5050,偶数累加和2550,奇数累加和2500
嵌套循环 (或称作多重循环)
# 打印如下图案
# 0 0 0 0 0
# 1 1 1 1 1
# 2 2 2 2 2
# 3 3 3 3 3
# 4 4 4 4 4
for x in range(5):
print(0,end="\t")
print()
for x in range(5):
print(1,end="\t")
print()
for x in range(5):
print(2,end="\t")
print()
for x in range(5):
print(3,end="\t")
print()
for x in range(5):
print(4,end="\t")
print()
# 0 0 0 0 0
# 1 1 1 1 1
# 2 2 2 2 2
# 3 3 3 3 3
# 4 4 4 4 4
for x in range(5):
for y in range(5):
print(x,end="\t")
print()
# 0 0 0 0 0
# 1 1 1 1 1
# 2 2 2 2 2
# 3 3 3 3 3
# 4 4 4 4 4
如上两个方法得到的结果一样但是 过程显然第一个会更麻烦一些 所以遇到一些一样的公式的时候可以选择就是 运用循环来简化
# 打印9×9乘法表
for m in range(1,10):
for n in range(1,m+1): # 这里取到m+1 就相当但看一行的时候 5*5是最后一个一样 然后m*m(因为包头不包尾嘛 所以就是+1刚好最后一个是m)
print("{0}*{1}={2}".format(m,n,(m*n)),end="\t")
print()
# 1*1=1
# 2*1=2 2*2=4
# 3*1=3 3*2=6 3*3=9
# 4*1=4 4*2=8 4*3=12 4*4=16
# 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
# 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
# 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
# 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
# 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
就是根据这个9*9乘法表的打印可以知道就是 要把大问题拆分成小问题来完成 就比如先完成一行然后再套入对应的循环 就可以直接出现整个所需要打印的案例
# 打印薪资大于15000的资料
r1 = dict(name='Kyle',age=18,salary=30000,city='青岛')
r2 = dict(name='Aha',age=19,salary=20000,city='上海')
r3 = dict(name='Curry',age=20,salary=10000,city='深圳')
tb = [r1,r2,r3]
for x in tb:
if x.get("salary")>15000:
print(x)
# {'name': 'Kyle', 'age': 18, 'salary': 30000, 'city': '青岛'}
# {'name': 'Aha', 'age': 19, 'salary': 20000, 'city': '上海'}
break语句
可以用于while与for循环用来结束整个循环 如果存在嵌套循环的时候 break语句 只能跳出最近一层的循环
while True:
a = input("请输入一个字符(输入Q或q结束)")
if a.upper()=='Q':
print("循环结束 退出")
break
else:
print(a)
continue 语句
结束本次循环 继续下一次
多个循环嵌套时,continue也是应用于最近的一层循环
# 要求输入员工的薪资 若薪资小于0则重新输入 最后打印出员工的数量与薪资明细 以及平均工资
empNum = 0 # 录入员工数
salarySum = 0 # 工资和
salarys = [] # 录入薪资放入列表
while True: # 这个不要忘记了 这个是个死循环 就是会一直运行除非使用 break
s = input("请输入员工的薪资(按Q或q结束)")
if s.upper()=='Q':
print("录入结束")
break # 直接到 print("员工数{0}".format(empNum))这一行
if float(s)<0:
print("无效,继续录入")
continue # 直接到 while True这一行
print("录入成功")
empNum += 1
salarys.append(float(s))
salarySum += float(s)
print("员工数{0}".format(empNum))
print("录入薪资:",salarys)
print("总发薪资",salarySum)
print("年均薪资{0}".format(salarySum/empNum))
循环里的 else 语句 (不同于if…else…语句中的else)
while for循环可以附带一个else语句(可选)
如果for while语句没有被break语句结束 则会执行else否则不执行
# while 条件语句:
# 循环体
# else:
# 语句
# for 变量 in 可迭代对象:
# else:
# 语句
salarySum = 0
salarys = []
for i in range(4):
s = input("请输入一共4名员工的薪资(按Q或q中途结束)")
if s.upper()=='Q':
print("录入完成,退出")
break
if float(s)<0:
continue
salarys.append(float(s))
salarySum += float(s)
else:
print("您已经全部录入4名员工的薪资")# 如果在运行完之前运用了q会直接退出 就不会写出这句话
print("录入薪资:",salarys)
print("平均薪资{0}".format(salarySum/4))
循环代码优化技巧:
虽然计算机越来越快 空间也越来越大 我们仍然要 在性能问题上“斤斤计较”以下三个原则 可以大大提升运行效率 避免 不必要的低效运算
- 尽量减少循环内部不必要计算 (如果可以放到循环外面 尽量往外放)
- 嵌套循环中 尽量减少内层循环计算 尽可能往外提
- 局部变量查询较快 尽量使用局部变量(这个还不是很了解)
其他
- 连接多个字符串使用join()而不使用+ (因为会创建新的列表新的字符串 )
- 列表元素插入和删除 尽量在列表的尾部进行操作
# # 循环代码优化测试
import time
start = time.time()
for i in range(1000):
result = []
for m in range(10000):
c = i*1000
result = result + [m*100]
end = time.time()
print("耗时:{0}".format(end-start))
print("简单循环优化后……")
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))
# 耗时:96.17549228668213
# 简单循环优化后……
# 简单循环后的耗时:0.593543291091919
zip并行迭代多个序列
可以通过zip()函数对多个序列进行迭代 zip()函数在最短序列“用完”时就会停止
names = ("高","kyle","curry","aha")
ages = (18,16,20,25)
jobs = ('老师','程序员','公务员')
for name,age,job in zip(names,ages,jobs): #name,age,job是临时变量
print("{0}--{1}--{2}".format(name,age,job))
# 高--18--老师
# kyle--16--程序员
# curry--20--公务员‘
names = ("高","kyle","curry","aha")
ages = (18,16,20,25)
jobs = ('老师','程序员','公务员')
for i in range(min(len(names),len(ages),len(jobs))):
print("{0}--{1}--{2}".format(names[i],ages[i],jobs[i]))
# 高--18--老师
# kyle--16--程序员
# curry--20--公务员
两个代码不一样但是可以达到一样的效果