py_11分支和循环

一、程序执行的三大流程
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.分支


image.png

2.循环


image.png

分支和循环

一、程序执行的三大流程

1.顺序执行

2.分支:选择条件执行

3.循环执行

image.png

二、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循环:

  • 样式
image.png

案例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--公务员

五、循环代码优化

  1. 尽量减少循环内部不必要的计算
  2. 嵌套循环中,尽量减少内层循环的计算,尽可能向外提。
  3. 局部变量查询较快,尽量使用局部变量
# 案例
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

其他优化手段

  1. 连接多个字符串,使用 join()而不使用+
  2. 列表进行元素插入和删除,尽量在列表尾部操作
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352