流程控制--分支结构、循环结构

发布时间 2023-04-24 20:29:23作者: ERROR404Notfound

1.流程控制理论

流程控制:控制事务的执行流程
事物的执行流程可以分为三类:
1.顺序结构
从上往下依次执行,我们之前编写的的代码都属于顺序结构。
2.分支结构
事物的执行会根据条件的不同做出不同的执行策略
3.循环结构
事物的执行会根据各个条件出现反复的循环
"""
1.在代码的世界里很多时候会出现上述三种情况的混合
2.应把代码和流程图有机结合
"""

2.流程控制必备知识

1.python中使用代码的缩进来表示代码的从属关系
缩进的代码称为子代码,上面一行没有缩进的代码称为它的父代码,子代码是否执行取决于上面的父代码。
2.并不是所有的代码都可以有子代码,在流程控制中if可以有。
3.如果几行代码同属于一行父代码的子代码,则它们应该拥有相同的缩进量。
4.python中没有要求缩进量是几个空格,但是在python中推荐使用4个空格(windows中一个tab键)。
5.如果一行代码拥有子代码,在它的最后要有冒号(英文模式下)。
6.如果几行代码拥有相同的父代码(拥有相同的缩进量),则它们之间应该平起平坐,按照顺序执行。

3.分支结构

1.单if分支结构:分支结构只有一条路可以走(if成立的路径)
语法结构:
if 条件:
条件成立执行的代码

  user_name = input('请输入我的名字>>>:')
if user_name == '大帅比':
    print('一般一般')

image

image

2.if...else...分支结构:分支结构有两条路可以走(if成立的路径,if不成立的路径)
if 条件:
条件成立之后才会执行的子代码
else:
条件不成立执行的子代码

score = input('请输入你的分数>>>:')
score = int(score)
if score >= 80:
    print('勉勉强强 继续努力')
else:
    print('学个毛线回去摊煎饼吧')	

image
image

3.if...elif...else分支结构:
if 条件1:
条件1成立之后执行的子代码
elif 条件2:
条件1不成立,条件2成立执行的子代码
elif 条件3:
条件1和2都不成立,条件3成立执行的子代码
else:
上述条件都不成立,条件3成立执行的子代码
"""
ps:1.elif的个数可以有多个。
2.上述代码只会走一条路径。

    user_score = input('请输入您的分数>>>:')
    user_score = int(user_score)
    if user_score >= 90:
        print('nb啊老铁你是我学习榜样')
    elif user_score >= 80:
        print('厉害厉害都是大神')
    elif user_score >= 70:
        print('小心点我努努力可能就超过你了哦!')
    else:
        print('明天摊煎饼咱俩搭伙吧')

image
image


4.if的嵌套使用
	age = 18
height = 168
weight = 98
is_beautiful = True
is_sexy = True
is_success = False
user_name = 'sarah'
if user_name == 'sarah':
    print('死鬼跑哪里去了!!')
    if age < 20 and weight < 100 and is_beautiful and is_sexy:
        print('小姐姐加个微信呗')
        if is_success:
            print('你好高德,导航到民政局')
        else:
            print('终究还是一个人扛下了所有')
    else:
        print('不好意思我是和旁边小姐姐说的')
else:
    print('你不是我要找的人')

image

image

4.循环结构

就是想让一些代码反复的执行:
语法结构:
while 条件:
条件成立之后执行的子代码(循环体代码)
1.先判断条件是否成立
2.如果成立则执行循环体代码
3.循环体代码执行完毕后再次回到条件判断处,判断条件是否成立
4.如果成立,则继续执行循环体代码
5.按照上述规律依次执行,知道条件不成立之后才会结束代码的运行

#练习题1.请打印四遍hello world,打印完四遍之后打印'想不想干饭'
i = 1
while i < 5:
    print('hello world')
    i += 1
print('想不想干饭')
"""
思考:先定义一个数字i从1开始,循环条件是i < 5,要打印4遍,那么i需要从1自增到4,每打印一次i自增一次,i = 5时已经打印了4遍,会自动退出循环。print('想不想干饭')和while 循环是同级别代码,while循环体代码结束循环之后再执行print('想不想干饭')
"""

break:强行结束循环体,while循环体代码一旦执行到break会直接结束循环。

continue:while循环体代码一旦执行到continue会结束本次循环,开始下一次循环

while...else:
    循环体代码没有被强制结束的情况下,执行完毕就会执行else中的代码。如果while中的代码被break或者continue强制退出,则不走else路径。

image

5.while循环补充说明

1.死循环:
循环结构永远为True,并且不可能不打断,很吃内存。真正的死循环一旦执行,CPU能耗急剧上升,知道系统采取紧急措施,尽量不要让CPU长时间不断运算。

2.嵌套及全局标志位
一个break只能结束它所在的那一层循环。
想一次性结束所有的while嵌套,有几个while嵌套,就应该写几个break。结束上一层的break要和本层的while有相同的缩进量。如果不想反复写break,可以写全局标志位。
"""
建立一个用户登录系统,可以无限次登陆,如果登陆成功,用户可以输入指令
并执行(模拟)(可以无限次输入),如果用户输入'q',则退出程序运行。
"""

# 方法1:break结束循环,需对应好每一个的break结束哪一层while循环
while True:
    user_name = input('请输入您的用户名>>>:')
    user_pwd = input('请输入您的密码>>>:')
    if user_name == 'max' and user_pwd == '123':
        print('登陆成功')
        while True:
            cmd = input('请输入您要执行的命令>>>:')
            if cmd == 'q':
                print('结束运行')
                break
            print('正在执行您的命令%s' % cmd)
        break
    else:
        print('用户名或密码错误')
        
# 方法2:使用全局标志位:不需要写多个break,布尔值改变之后所有的循环结束
is_flag = True
while is_flag:
    user_name = input('请输入您的用户名>>>:')
    user_pwd = input('请输入您的密码>>>:')
    if user_name == 'max' and user_pwd == '123':
        print('登陆成功')
        while is_flag:
            cmd = input('请输入您要执行的命令>>>:')
            if cmd == 'q':
                is_flag = False
            print('正在执行您的命令%s' % cmd)
    else:
        print('用户名或密码错误')

image

image

6.流程控制之for循环

1.for循环能够做到的事情while都可以做到 只不过for循环在一些场景下使用更简单

2.for循环使用主要场景为:循环获取存储多个数据的数据内部数据值。

3.for循环语法结构:
for 变量名 in 带遍历数据:
for循环体代码

实际案例:
	stu_info = [1, 2.2, 'soccer', [1, 2, 3]]
    #循环打印列表中每一个数据值(遍历)
# 方法1:用while循环:
stu_info = [1, 2.2, 'soccer', [1, 2, 3]]
i = 0
while i < 4:
    print(stu_info[i])
    i += 1
    
# 方法2:用for循环
stu_info = [1, 2.2, 'soccer', [1, 2, 3]]
for i in stu_info:
    print(i)

4.for循环特点:
1.擅长遍历取值
2.不需要结束条件,遍历完成之后自动结束

5.for循环主要遍历的数据类型有:字符串、列表、元组、字典(注意:字典的遍历只有K参与)、集合
image
6.for循环语法结构中的变量名如何命名:
1.见名知意
2.如果遍历出来的数据没有具体的意义,可以直接使用常用的i、j、k、item、v

7.for循环体代码中如果遇到break也会直接结束整个for循环

for i in range(0,21):
    if i == 10:
        break
    print(i)  #结果:打印1-9,i = 10时break会结束整个for循环

8.for循环体代码如果遇到continue也会结束当前循环直接开始下一次循环

for i in range(0, 21):
    if i == 10:
        i += 1
        continue
    print(i)  #结果:打印0-20但不打印10,i = 10时i自增1直接变成11

9.for可以和else连用,语法结构为:

for 变量名 in 带便利的数据:
	for循环体代码
else:
	for循环体代码没有被break强制结束的情况下运行完毕之后,运行

7.range方法

range可以理解为是一个帮我们产生内部含有很多数字的数据

1.for i in range(101):
    print(i) 
#结果:打印0-100(右边不包含)的数字,如果括号内只有1个数字则默认左边的范围是0(包含0)

2.for i in range(5,50):
    print(i)
#结果:打印5-49的数字,括号内的数字是范围(左边的数字包含,右边的数字不包含)

3.for i in range(0, 25, 5):
    print(i)
#结果:打印0,5,10,15,20.前两个数为范围(左包含右不包含),第三个数字是差值,不写默认为1.

image

"""
python2和python3区别:
python2中range()会直接产生一个列表,比如range(10)打印结果是:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],xrange()和python3中的range()都会产生一个集合,比如python2中xrange(10)结果是xrange(10),python3中range(10)的结果是range(0, 10)
"""

8.range实战案例

网络爬虫
使用代码爬取网络上我们需要的数据
项目需求
爬取所有页面的数据(博客园)
找寻规律
https://www.cnblogs.com/
https://www.cnblogs.com/#p2
https://www.cnblogs.com/#p3
https://www.cnblogs.com/#p4
大胆猜测:第一页是 https://www.cnblogs.com/#p1
编写代码产生博客园文章前两百页的网址

addr = 'https://www.cnblogs.com/#p%s'
for i in range(1, 201):  #for循环, i此时是1-200的所有数字
    print(addr % i) #格式化输出

image

'''
分页的规律 不同的网址有所区别
1.在网址里面有规律
2.内部js文件动态加载
'''

9.作业

1.根据用户输入内容打印其权限
    '''
    jason --> 超级管理员
    tom  --> 普通管理员
    jack,rain --> 业务主管
    其他 --> 普通用户
    '''
    
user_info = input('请输入用户信息>>>:')
if user_info == 'jason':
    print('超级管理员')
elif user_info == 'tom':
    print('普通管理员')
elif user_info == 'jack' or user_info == 'rain':
    print('业务主管')
else:
    print('普通用户')

2.编写用户登录程序
 要求:有用户黑名单 如果用户名在黑名单内 则拒绝登录
    eg:black_user_list = ['jason','kevin','tony']
 如果用户名是黑名单以外的用户则允许登录(判断用户名和密码>>>:自定义)
    eg: oscar 123

black_user_list = ['jason','kevin','tony']
user_name = input('请输入您的用户名>>>:')  # 获取用户输入
password = input('请输入您的密码>>>:')  # 获取用户输入
if user_name in black_user_list:  # if...else分支结构;成员运算,列表的成员运算最小单位是元素
    print('登陆失败')
else:  # if...else分支结构,黑名单以外的用户名
    print('登陆成功')
	
# 改:本题实质是想做一个if嵌套,首先判断用户名是否在黑名单,如果不在再判断用户名密码是否正确。
black_user_list = ['jason', 'kevin', 'tony']
user_name = input('请输入您的用户名>>>:')
if user_name in black_user_list:
    print('黑名单用户无法登陆')
else:
    password = input('请输入您的密码>>>:')
    if user_name == 'max' and password == '123':
        print('登陆成功')
    else:
        print('用户名或密码错误')
    
3.编写用户登录程序
 用户如果登录失败 则只能尝试三次
 用户如果登录成功 则直接结束程序

# 方法1:通过引入计数器,次数限制用while条件设置时:
count = 1  # 定义变量名count,为了控制次数
while count < 4:  # count等于4的时候已经循环了3次,第4次结束循环
    user_name = input('请输入您的用户名>>>:')  # 获取用户输入
    user_pwd = input('请输入您的密码>>>:')  # 获取用户输入
    if user_name == 'max' and user_pwd == '123':  # if...else分支结构
        break  # 输入正确直接退出循环结束程序
    else:
        count += 1  # 输入错误count自增1
		
# 方法2:次数限制用if控制时:
count = 1
while True:
    if count == 4:
        print('您已尝试了三次')
        break
    user_name = input('请输入您的用户名>>>:')
    password = input('请输入您的密码>>>:')
    if user_name == 'max' and password == '123':
        print('登陆成功')
        break
    else:
        print('用户名或密码错误')
        count += 1
        
		
4.猜年龄的游戏
 假设用户的真实年龄是18 编写一个猜年龄的游戏 获取用户猜测的年龄
 基本要求:可以无限制猜测 每次猜错给出提示(猜大了 猜小了) 猜对则结束程序
 拔高练习:每次猜测只有三次机会 一旦用完则提示用户是否继续尝试 用户通过输入n或者y来表示是否继续尝试 如果是y则继续给用户三次猜测机会 否则结束程序
    
'''基本要求'''
while True:  # 定义循环结构
    age = 18
    gue_age = input('请输入您猜测的年龄>>>:')  # 获取用户输入
    gue_age = int(gue_age)  # 把获取到的字符串转化成整形
    if gue_age < age:  # if...elif...else分支结构
        print('猜小了')
    elif gue_age > age:  # if...elif...else分支结构
        print('猜大了')
    else:  # if...elif...else分支结构
        print('恭喜你猜对了!')
'''拔高练习'''

# 方法1:两层while嵌套,不推荐
is_play = True
while is_play:  # 用户选择继续游戏之后继续循环
    i = 1  # 命名一个自增的数,满足次数限制时结束循环
    while i < 4:  # 当i = 4时,改代码已经循环了三次,while循环结束,执行else代码
        age = 18
        gue_age = input('请输入您猜测的年龄>>>:')  # 获取用户输入
        gue_age = int(gue_age)  # 把获取用户输入得到的字符串转化成整形
        if gue_age < age:  # if...elif...else分支结构
            print('猜小了')
            i += 1  # 只要猜错,i就要+1
        elif gue_age > age:  # if...elif...else分支结构
            print('猜大了')
            i += 1  # 只要猜错,i就要+1
        else:  # if...elif...else分支结构
            print('恭喜你猜对了!')  # 猜对了不用+1
            is_play = False  # 改变外层循环布尔值,外层循环不再继续循环;(这一步不是我自己写的,回过头来复习!!!)
            break  # 结束内层循环
    else:  # while...else结构,while循环自然结束(没有被continue或break打断时)后执行else代码
        choice = input('请输入您是否要继续尝试(y/n)>>>:')  # 获取用户输入,用户选择是否继续玩下去
        if choice == 'y':
            i = 1  # 如果用户继续玩下去此处把i定义成1,回到开头重新参与while循环
        else:  #
            break
			
# 方法2:推荐:用一层while,次数用if来控制:
age = 18  # 1.输入真是的年龄
count = 1  # 2.定义一个计数器,用来控制次数
while True:  # 3.首先编写while循环,大条件先写成True
    if count == 4:  # 10.判断次数
        choice = input('请输入您是否要继续游戏(y/n)>>>:')  # 11.用户输入是否要继续
        if choice == 'y':  # 12.如果要继续游戏
            count = 1  # 13.计数器归为1,重新获得3次游戏机会
        else:  # 14.如果不继续游戏
            break  # 15.直接退出循环
    gue_age = input('请输入您猜测的年龄>>>:')
    gue_age = int(gue_age)
    if gue_age < age:  # 4.if条件判断,猜的年龄小了
        print('猜小了')
        count += 1  # 5.计数器自增1
    elif gue_age > age:  # 6.if条件判断,猜的年龄大了
        print('猜大了')
        count += 1  # 7.计数器自增1
    else:  # 8.条件判断,猜对了
        print('猜对了')
        break  # 9.退出当前循环
		

image

5.计算1-100所有的数之和
i = 0
for j in range(1, 101):
    i += j   # i = i + j ,新的变量名i就是i和j的和
print(i)

6.判断列表中数字2出现的次数  
 l1 = [11,2,3,2,2,1,2,1,2,3,2,3,2,3,4,3,2,3,2,2,2,2,3,2]
i = 0  # 1.定义1个计数器
l1 = [11, 2, 3, 2, 2, 1, 2, 1, 2, 3, 2, 3, 2, 3, 4, 3, 2, 3, 2, 2, 2, 2, 3, 2]
for j in l1:  # 2.j在列表里循环
    if j == 2:  # 3.j在列表里检索到2
        i += 1  # 4.i自增1
print(i)  # 5.j循环结束之后,i就是l1中2的个数

7.编写代码自动生成所有页网址(注意总共多少页)
	https://movie.douban.com/top250
addr = 'https://movie.douban.com/top250?start=%s&filter='  # 1.打开网站观察规律,把相同的部分拷贝下来不同的地方用%s
for i in range(0, 226, 25):  # 2.发现第一页%s是0,最后一页是225,所以第2个数字写成226,差值是25,
    print(addr % i)  # 3.格式化输出

8.编写代码打印出下列图形(ps:for循环嵌套)  
*****  
*****  
*****  
*****
for i in range(4):  # 4行
    for j in range(5):  # 5列
        print('*', end= '')  # 总共20个*,排列在一行
    print()  # 父代码表示循环4次,20个*均分成4行,每行5个