流程控制--分支结构、循环结构
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('一般一般')
2.if...else...分支结构:分支结构有两条路可以走(if成立的路径,if不成立的路径)
if 条件:
条件成立之后才会执行的子代码
else:
条件不成立执行的子代码
score = input('请输入你的分数>>>:')
score = int(score)
if score >= 80:
print('勉勉强强 继续努力')
else:
print('学个毛线回去摊煎饼吧')
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('明天摊煎饼咱俩搭伙吧')
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('你不是我要找的人')
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路径。
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('用户名或密码错误')
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参与)、集合
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.
"""
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) #格式化输出
'''
分页的规律 不同的网址有所区别
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.退出当前循环
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个