一、程序执行的三大流程
1.顺序执行 2.分支:选择条件执行 3.循环执行
二、if分支执行的几种方式:1.if 2.if else 3.if elif elif else 4.嵌套
三、三元表达式: c = a if a > b else b 条件为真时的值 if (条件表达式) else 条件为假时的值
四、循环
1.whlie 循环:
2.for 循环
3.break和continue
break用于结束当前循环,continue用于结束本次循环,直接开始下次循环
break/continue在嵌套循环中,只对最近的一层循环起作用
continue 如果遇到while循环里面有计数器,if条件里的continue上面修改计数器条件,否则会死循环
4.循环中的else
break 可以阻止 else 语句块的执行
else在循环结构中,只有循环正常结束后才执行else,如果使用break跳出了循环,不会执行else
5.使用 zip()并行迭代:for name, age, job in zip(names, ages, jobs):
names, ages, jobs是可迭代对象
五、循环代码优化:
1. 尽量减少循环内部不必要的计算
2. 嵌套循环中,尽量减少内层循环的计算,尽可能向外提。
3. 局部变量查询较快,尽量使用局部变量
其他优化手段:
1. 连接多个字符串,使用 join()而不使用+
2. 列表进行元素插入和删除,尽量在列表尾部操作
# 预告:下一篇 4种推导式
xmind总结:
1.分支
2.循环
分支和循环
一、程序执行的三大流程
1.顺序执行
2.分支:选择条件执行
3.循环执行
二、if分支执行的几种方式
if
-
条件表达式的值为 False 的情况如下:
False、0、0.0、空值 None、空序列对象(空列表、空元祖、空集合、空字典、空字 符串)
if 条件:
满足条件时要做的事情1
满足条件时要做的事情2
满足条件时要做的事情3
age = 18
if age >= 18:
print("恭喜你,你可以去网吧上网了")
if else
- 条件满足执行if下面的代码,不满足执行else下面的代码
if 条件:
条件满足干的事
else:
条件不满足要干的事
有车票可以进火车站,没车票不能进火车站
chePiao = 1 # 用1代表有车票,0代表没有车票
if chePiao == 1:
print("有车票,可以上火车")
print("终于可以见到Ta了,美滋滋~~~")
else:
print("没有车票,不能上车")
print("亲爱的,那就下次见了,一票难求啊~~~~(>_<)~~~~")
if elif elif else
if条件满足,循环直接结束。不会执行elif
if xxx1:
事情1
elif xxx2:
事情2
elif xxx3:
事情3
else:
不满足干的事
说明:
- 当xxx1满足时,执行事情1,然后整个if结束
- 当xxx1不满足时,那么判断xxx2,如果xxx2满足,则执行事情2,然后整个if结束
- 当xxx1不满足时,xxx2也不满足,如果xxx3满足,则执行事情3,然后整个if结束
score = 77
if score>=90 and score<=100:
print('本次考试,等级为A')
elif score>=80 and score<90:
print('本次考试,等级为B')
elif score>=70 and score<80:
print('本次考试,等级为C')
elif score>=60 and score<70:
print('本次考试,等级为D')
elif score>0 and score<60:
print('本次考试,等级为E')
else:
print("恭喜你得了一个宇宙大鸭蛋")
嵌套
if 条件1:
满足条件1 做的事情1
满足条件1 做的事情2
...(省略)...
if 条件2:
满足条件2 做的事情1
满足条件2 做的事情2
...(省略)...
说明:
外层的if判断,也可以是if-else
内层的if判断,也可以是if-else
根据实际开发的情况,进行选择
注意:
- 条件表达式后面必须跟冒号:,遇到冒号下面的代码必须缩进
- else和elif 不能单独存在,后面必须要有判断条件
chePiao = 1 # 用1代表有车票,0代表没有车票
daoLenght = 9 # 刀子的长度,单位为cm
if chePiao == 1:
print("有车票,可以进站")
if daoLenght < 10:
print("通过安检")
print("终于可以见到Ta了,美滋滋~~~")
else:
print("没有通过安检")
print("刀子的长度超过规定,等待警察处理...")
else:
print("没有车票,不能进站")
print("亲爱的,那就下次见了,一票难求啊~~~~(>_<)~~~~")
- 判断一个ip地址合不合法
# 判断一个ip 地址是否合法
ip = '192.168.100.3'
list_ip = ip.split(".")
# 1.list_ip的长度必须要等于4,不等于是4就不适合ip地址规范
# 2.list_ip这个列表里面的字符串元素,必须是数字而且范围必须在[0,256]之间
'''
伪代码:
if 长度==4:
pass
if list_p每一个元素是数字and 0<=int(元素)<=255:
是一个合法的ip地址
'''
is_ip = True # 事先假设ip合法
if len(list_ip) == 4:
for num in list_ip:
if all([num.isdigit(),0 <=int(num)<=255]):
is_ip = True
else:
is_ip = False
else:
is_ip = False
if is_ip:
print("{}是ip地址".format(ip))
else:
print("{}不是ip地址".format(ip))
- 上面代码优化一下:方向判断
# 上面 is_ip =True下面的代码我们判断的是符合ip地址的条件走向,如果方向判断会怎么样呢?
# 会发现能节约一点带码呢
# 判断一个ip 地址是否合法
ip = '192.168.100.3'
list_ip = ip.split(".")
is_ip = True # 事先假设ip合法
if not len(list_ip) == 4:
is_ip = False
for num in list_ip:
if not all([num.isdigit(),0 <=int(num)<=255]):
is_ip = False
if is_ip:
print("{}是ip地址".format(ip))
else:
print("{}不是ip地址".format(ip))
- 猜拳游戏
# 猜拳游戏
import random
player = input('请输入:剪刀(0) 石头(1) 布(2):')
player = int(player)
computer = random.randint(0, 2)
if ((player == 0) and (computer == 2)) or ((player == 1) and (computer == 0)) or ((player == 2) and (computer == 1)):
print('获胜,哈哈,你太厉害了')
elif player == computer:
print('平局,要不再来一局')
else:
print('输了,不要走,洗洗手接着来,决战到天亮')
三、三元表达式: c = a if a > b else b
-
条件为真时的值 if (条件表达式) else 条件为假时的值
"""三元表达式: c = a if a > b else b 条件为真时的值 if (条件表达式) else 条件为假时的值 """ a = 10 b = 5 c = a-b if a >b else a-b print(c)
四、循环
whlie循环:
- 样式
案例1:
我是阿登打印5次怎么用while循环实现呢?
i = 5
while i >=1:
print(name)
i -= 1
案例2:1-100的和,偶数和,奇数和
# 案例 计算 1-100 之间数字的累加和;计算 1-100 之间偶数的累加和,
# 计算 1-100 之间奇数的累加和。
i = 1
sum = 0 # 累积和
sum1 = 0 # 计算偶数和
sum2 = 0 # 计算基数和
while i <= 100:
sum += i
if i %2 == 0:
sum1 += i
else:
sum2 += i
i += 1 # 修改循环条件
else:
print(sum)
print(sum1)
print(sum2)
案例:打印多种三角形
- 打印三角形:正着打
# 打印三角形:正着打
i = 1
while i<=5:
j = 1
while j <= i:
print("*", end='')
j += 1
print() # 内层循环 换行
i += 1
结果:
*
**
***
****
*****
- 打印三角形:倒着打
# 打印三角形:倒立三角形
i = 1
while i<=5:
j = 5
while j >= i:
print("*", end='')
j -= 1
print() # 内层循环 换行
i += 1
结果:
*****
****
***
**
*
- 打印三角形:先正后倒
i = 1
while i <= 9:
# print("*")
if i <=5:
j = 1
while j <=i:
print("*",end="")
j += 1
print()
else:
j = 9
while j >=i:
print("*", end= "")
j -= 1
print()
i += 1
结果:
*
**
***
****
*****
****
***
**
*
案例:打印九九乘法表
# 打印九九乘法表
i = 1
while i<= 9:
j =1
while j <= i:
print("{}*{}={}".format(j, i,j*i), end="\t")
j += 1
print() # 内层循环结束打印换行
i += 1
结果:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
for循环
- 格式:
for i in iterable:
循环执行的代码
else:
循环结束执行的代码
- iterable:可以是字符串 列表 元组 range() 字典 enumerate() eval() 生成器 文件对象
for i in "":
print(i)
else:
print("我是阿登")
- 结果:
我是阿登
for循环几种案例
1.遍历字符串中的字符
for x in "sxt001":
print(x, end=" ")
结果:
s x t 0 0 1
2.遍历字典
# 2.遍历字典
d = {'name':'gaoqi','age':18,'address':'西三旗 001 号楼'}
for x in d: #遍历字典所有的 key
print(x,end=" ")
print() # for循环结束换行
for x in d.keys():#遍历字典所有的 key
print(x,end=" ")
print()
for x in d.values():#遍历字典所有的 value
print(x,end=" ")
print()
for x in d.items():#遍历字典所有的"键值对"
print(x,end=" ")
print()
结果:
name age address
name age address
gaoqi 18 西三旗 001 号楼
('name', 'gaoqi') ('age', 18) ('address', '西三旗 001 号楼')
3.range 对象
range 对象是一个迭代器对象,用来产生指定范围的数字序列。格式为:
range(start, end [,step])
生成的数值序列从 start 开始到 end 结束(不包含 end)。若没有填写 start,则默认从 0
开始。step 是可选的步长,默认为 1。如下是几种典型示例:
for i in range(10) 产生序列:0 1 2 3 4 5 6 7 8 9
for i in range(3,10) 产生序列:3 4 5 6 7 8 9
for i in range(3,10,2) 产生序列:3 5 7 9
利用 for 循环,计算 1-100 之间数字的累加和;计算 1-100 之间偶数的累加和, 计算 1-100 之间奇数的累加和.
sum = 0 #求累积和
sum1 = 0 # 求偶数和
sum2 = 0 # 求基数和
for i in range(101):
sum += i
if i %2 ==0:
sum1 += i
else:
sum2 += i
else:
print(f"1--100累积和:{sum}")
print(f"1--100偶数和:{sum1}")
print(f"1--100基数和:{sum2}")
for循环嵌套:
案例:
# 打印如下图
"""
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(f"{x}",end="\t")
print() # 内层循环换行
利用嵌套循环打印九九乘法表
# 利用嵌套循环打印九九乘法表
for n in range(1,10):
for m in range(1,n+1):
print("{}*{}={}".format(m,n, m*n), end="\t")
print()
"""
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
"""
break和continue
1.break
语句可用于 while 和 for 循环,用来结束整个循环。当有嵌套循环时,break 语句只
能跳出最近一层的循环。
案例:打印1-5数字,打印到4的时候结束
# 案例:打印1-5数字,打印到4的时候结束
i = 1
while i <=5:
if i ==4:
break
print(i)
i +=1
else:
print(i) # 这里else下面的语句不会执行,因为 i==4的时候,break结束循环
当有嵌套循环时,break 语句只能跳出最近一层的循环
# 当有嵌套循环时,break 语句只能跳出最近一层的循环
# 打印三角形:正着打
i = 1
while i<=5:
j = 1
while j <= i:
print("*", end='')
j += 1
break
print() # 内层循环 换行
i += 1
# 打印的结果为:
"""
*
*
*
*
*
"""
# 说明 嵌套的while循环 break只影响就近的循环,for循环也是如此。
#当外层while循环结束,整个循环才会停止。
2.continue
continue 语句用于结束本次循环,继续下一次。多个循环嵌套时,continue 也是应用于最
近的一层循环。
案例:
要求输入员工的薪资,若薪资小于 0 则重新输入。最后打印出录入员工的数量和薪资明细,以及平均薪资
# continue 语句用于结束本次循环,继续下一次。多个循环嵌套时,continue 也是应用于最近的一层循环
# 案例:要求输入员工的薪资,若薪资小于 0 则重新输入。最后打印出录入员工的数量和薪资明细,以及平均薪资
empNum = 0 # 员工数
salarySum= 0 # 记录工资总额
salarys = [] # 录入薪资
while True:
s = input("请输入员工的薪资:(按 Q 或 q 结束)")
print(s)
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))
结果:
请输入员工的薪资:(按 Q 或 q 结束)44
44
请输入员工的薪资:(按 Q 或 q 结束)44
44
请输入员工的薪资:(按 Q 或 q 结束)22
22
请输入员工的薪资:(按 Q 或 q 结束)44
44
请输入员工的薪资:(按 Q 或 q 结束)22
22
请输入员工的薪资:(按 Q 或 q 结束)Q
Q
录入完成,退出
员工数5
录入薪资: [44.0, 44.0, 22.0, 44.0, 22.0]
平均薪资35.2
continue 如果遇到while循环里面有计数器,if条件里的continue上面修改计数器条件,否则会死循环
# continue 如果遇到while循环里面有计数器,if条件里的continue上面修改计数器条件,否则会死循环
# 案例: 打印1-5,等于3的时候不打印
num = 1
s = 1
while num <= 5:
if num ==3:
num += 1
continue # continue在while循环里面的条件语句中跳出下个循环时,记得一定要修改计数器的条件。不然容易死循环
print(num)
num += 1
循环中的else
while、for 循环可以附带一个 else 语句(可选)。如果 for、while 语句没有被 break 语句
结束,则会执行 else 子句,否则不执行
- 语法格式如下:
while 条件表达式:
循环体
else:
语句块
for 变量 in 可迭代对象:
循环体
else:
语句块
-
案例
员工一共 4 人。录入这 4 位员工的薪资。全部录入后,打印提示“您已经全部录
入 4 名员工的薪资”。最后,打印输出录入的薪资和平均薪资
# 员工一共 4 人。录入这 4 位员工的薪资。全部录入后,打印提示“您已经全部录
# 入 4 名员工的薪资”。最后,打印输出录入的薪资和平均薪资
salarySum= 0 # 记录工资总额
salarys = [] # 录入薪资
for i in range(4): # 录入4次员工的工资
s = input("请输入员工的薪资:(按 Q 或 q 结束)")
print(s)
if s.upper()=='Q':
print("录入完成,退出")
break
if float(s)<0:
continue
salarys.append(float(s))
salarySum += float(s) # 记录录入的工资总额
else:
print("录入4位人员的工资完成")
print("录入薪资:",salarys)
print("平均薪资{0}".format(salarySum/len(salarys)))
请输入员工的薪资:(按 Q 或 q 结束)400
400
请输入员工的薪资:(按 Q 或 q 结束)500
500
请输入员工的薪资:(按 Q 或 q 结束)600
600
请输入员工的薪资:(按 Q 或 q 结束)800
800
录入4位人员的工资完成
录入薪资: [400.0, 500.0, 600.0, 800.0]
平均薪资575.0
使用 zip()并行迭代
# 我们可以通过 zip()函数对多个序列进行并行迭代,zip()函数在最短序列“用完”时就会停
names = ("薛鹏磊","薛老二","薛老三","薛老四")
ages = (18,16,20,25)
jobs = ("老师","程序员","公务员")
for name, age, job in zip(names, ages, jobs):
print("{}--{}--{}".format(name,age,job))
# zip在迭代对象参数个数和其他不一至时,已最少的为准。如jobs这个元组,元素只有3个,其他有4个。最后以jobs的元素个数为准
结果:
薛鹏磊--18--老师
薛老二--16--程序员
薛老三--20--公务员
五、循环代码优化
- 尽量减少循环内部不必要的计算
- 嵌套循环中,尽量减少内层循环的计算,尽可能向外提。
- 局部变量查询较快,尽量使用局部变量
# 案例
import time
start = time.time()
for i in range(1000):
result = []
for m in range(100000):
result.append(i*1000+m*100)
end = time.time()
print("耗时: {0}".format((end-start)))
start2 = time.time()
for i in range(1000):
result = []
c = i * 1000
for m in range(100000):
result.append(c+m*100)
end2 = time.time()
print("耗时2: {0}".format((end2-start2)))
if ((end2-start2) - (end-start)) < 0:
print(f"减少内层循环计算代码速度较快,提升了{(end-start)-(end2-start2)}秒")
print("{:+.10f}".format((end2-start2) - (end-start)))
结果
耗时: 20.654181241989136
耗时2: 16.660953044891357
减少内层循环计算代码速度较快,提升了3.9932281970977783秒
-3.9932281971
其他优化手段
- 连接多个字符串,使用 join()而不使用+
- 列表进行元素插入和删除,尽量在列表尾部操作