流程控制:控制事务的执行流程
事物的执行流程可以分为三类:
1.顺序结构
从上往下依次执行,我们之前编写的的代码都属于顺序结构。
2.分支结构
事物的执行会根据条件的不同做出不同的执行策略
3.循环结构
事物的执行会根据各个条件出现反复的循环
"""
1.在代码的世界里很多时候会出现上述三种情况的混合
2.应把代码和流程图有机结合
"""
1.python中使用代码的缩进来表示代码的从属关系
缩进的代码称为子代码,上面一行没有缩进的代码称为它的父代码,子代码是否执行取决于上面的父代码。
2.并不是所有的代码都可以有子代码,在流程控制中if可以有。
3.如果几行代码同属于一行父代码的子代码,则它们应该拥有相同的缩进量。
4.python中没有要求缩进量是几个空格,但是在python中推荐使用4个空格(windows中一个tab键)。
5.如果一行代码拥有子代码,在它的最后要有冒号(英文模式下)。
6.如果几行代码拥有相同的父代码(拥有相同的缩进量),则它们之间应该平起平坐,按照顺序执行。
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)
"""
网络爬虫
使用代码爬取网络上我们需要的数据
项目需求
爬取所有页面的数据(博客园)
找寻规律
https://www.cnblogs.com/
https://www.cnblogs.com/
https://www.cnblogs.com/
https://www.cnblogs.com/
大胆猜测:第一页是 https://www.cnblogs.com/
编写代码产生博客园文章前两百页的网址
addr = 'https://www.cnblogs.com/#p%s' for i in range(1, 201): #for循环, i此时是1-200的所有数字 print(addr % i) #格式化输出
'''
分页的规律 不同的网址有所区别
1.在网址里面有规律
2.内部js文件动态加载
'''
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个
评论列表