流程控制

流程控制

什么是流程控制

控制流程的执行流程

流程控制的分类

顺序结构:从上往下依次执行

分支结构:根据条件判断真假,执行不同的子代码

循环结构:根据条件判断是否重复执行子代码

必知必会

  1. 在python中使用缩进来表示代码的从属关系
  2. 并不是所有的代码都可以有子代码
  3. 如果多行代码同属于一个父代码,就要保证相同的缩进
  4. 相同缩进的代码彼此之间按照顺序结构执行,没有从属关系

补充:一行代码冒号(相当于要拥有子代码)结束,那么紧挨着下一行必是缩进

分支结构

语法结构

  1. if 条件1
  2. 条件1成立执行的代码块

if与else分支

语法结构

  1. if 条件1
  2. 条件1成立执行的代码块
  3. else:
  4. 条件1不成立执行的代码块

if与elif与else分支

语法结构

  1. if 条件1:
  2. 条件1成立执行的代码块
  3. elif 条件2:
  4. 条件1不成立,条件2成立执行的代码块
  5. elif 条件3:
  6. 条件1不成立,条件2也不成立,条件3成立执行的代码块
  7. else:
  8. 条件123都不成立执行的代码块

if 嵌套

语法结构

  1. if 条件1:
  2. 条件1成立执行的代码块
  3. if 条件2:
  4. 条件1成立,并且条件2也成立执行的代码块
  5. else:
  6. 条件1成立,但条件2不成立执行的代码块
  7. else:
  8. 条件1不成立执行的代码块

分支结构练习题

练习一

编写一个用户登录程序,如果用户名是kevin并且密码是123 则打印登录成功,如果不是则打印用户名或密码错误

  1. # 1.输入用户名 strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列
  2. user_name = input("请输入用户名:").strip()
  3. # 2.输入密码
  4. password = input("请输入密码:").strip()
  5. # 3.判断输入的用户名是否等于kevin,并且输入的密码是否等于123
  6. if user_name == 'kevin' and password == '123':
  7. # 4.判断条件为True,执行此代码
  8. print("欢迎用户%s" % user_name)
  9. else:
  10. # 5.判断条件为False,执行此代码
  11. print("密码或者账号错误")

练习二

编写一个成绩评判系统,如果成绩大于90 则打印优秀,如果成绩大于80 则打印良好,如果成绩大于70 则打印一般,如果成绩大于60 则打印及格,如果成绩小于60 则打印挂科

  1. # 1.输入你的成绩
  2. score = input("输入你的成绩")
  3. # 2.判断输入的是数字,isdigit()方法检测字符串是否只由数字组成
  4. while not score.isdigit():
  5. # 3.判断为不是,执行此代码
  6. score = input('请输入数字,重新输入你的成绩 ')
  7. # 4.强制将输入数据类型,转换为int类型
  8. score = int(score)
  9. # 5.如果大于90,执行子代码
  10. if score > 90:
  11. print('优秀')
  12. # 6.如果大于80,执行子代码
  13. elif score > 80:
  14. print('良好')
  15. # 7.如果大于70,执行子代码
  16. elif score > 70:
  17. print('一般')
  18. # 8.如果大于60,执行子代码
  19. elif score > 60:
  20. print('及格')
  21. # 9.其他情况,执行子代码
  22. else:
  23. print('挂科')

循环结构

while 循环语法

语法结构

  1. while 条件1:
  2. 条件1成立执行的循环体代码块
  3. 循环体代码块执行完毕之后再次进行判断条件,直至条件不成立

while与 break 使用

语法结构

  1. while 条件1:
  2. 条件1成立执行的循环体代码块
  3. 循环体代码块执行完毕之后再次进行判断条件,直至条件不成立
  4. break # 用于结束本层循环(break只能结束所在那层循环)

while 与 continue 使用

语法结构

  1. while 条件1:
  2. 条件1成立执行的循环体代码块
  3. 循环体代码块执行完毕之后再次进行判断条件,直至条件不成立
  4. continue # 用于结束本次循环,直接开始下一次循环

while 与else 使用

语法结构

  1. while 条件1:
  2. 条件1成立执行的循环体代码块
  3. 循环体代码块执行完毕之后再次进行判断条件,直至条件不成立
  4. else:
  5. 循环体代码正常运行结束 则会执行该子代码块

while 嵌套

语法结构

  1. while 条件1:
  2. 条件1成立执行的循环体代码块
  3. 循环体代码块执行完毕之后再次进行判断条件,直至条件不成立
  4. if 条件1
  5. 条件1成立执行的代码块
  6. while 条件1:
  7. 条件1成立执行的循环体代码块
  8. 循环体代码块执行完毕之后再次进行判断条件,直至条件不成立
  9. else:
  10. 条件1不成立执行的代码块

while嵌套与 “变量名”使用

while循环嵌套很多层,如果要在某一层直接退出所有循环,可以让在while循环的条件共用一个变量名,该变量的初始变量值为True,在需要结束的循环层将变量值改成False,则所有循环层都结束

使用

编写一个用户登录程序,如果用户名是kevin并且密码是123 则进入输入指令系统,按键q可以结束程序,如果不是则打印用户名或密码错误,并重复登录

  1. # 6.定义一个变量名
  2. is_flag = True
  3. # 7.判断is_flag是否为True
  4. while is_flag:
  5. # 1.输入用户名 strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列
  6. user_name = input("请输入用户名:").strip()
  7. # 2.输入密码
  8. password = input("请输入密码:").strip()
  9. # 3.判断输入的用户名是否等于kevin,并且输入的密码是否等于123
  10. if user_name == 'kevin' and password == '123':
  11. # 4.判断条件为True,执行此代码
  12. print("欢迎用户%s" % user_name)
  13. # 8.判断is_flag是否为True
  14. while is_flag:
  15. # 9.判断为True,输入指令
  16. cmd = input("请输入指令:").strip()
  17. print("正在执行指令:%s" % cmd)
  18. # 10.判断指令是否为q
  19. if cmd == 'q':
  20. # 11.判断是q执行此代码
  21. print("bye,bye~")
  22. # 12.设置is_flag全局变量值为False
  23. is_flag = False
  24. else:
  25. # 5.判断条件为False,执行此代码
  26. print("密码或者账号错误")

while 死循环

语法结构

  1. while True:
  2. 循环体代码块,除非遇到break

补充:死循环会影响电脑的性能,一直占用CPU工作,甚至会造成硬件的损坏

for 循环语法 (高频率)

语法结构

  1. for 变量名 in 循环对象 # 可以是字符串、列表、字典、元祖、集合
  2. 循环体代码块 # 每次执行都会依次将循环对象的元素赋值给变量名

⚠️注意:

  1. 对于for循环语法结构中的变量名,应该是见名知意
  2. 循环字典只能取到字典中的keyvalue无法直接获取
  3. 循环字典、集合是无序的

for 与 break使用

语法结构

  1. for 变量名 in 循环对象 # 可以是字符串、列表、字典、元祖、集合
  2. 循环体代码块 # 每次执行都会依次将循环对象的元素赋值给变量名
  3. break # 用于结束本层循环(break只能结束所在那层循环)

for 与 continue使用

语法结构

  1. for 变量名 in 循环对象 # 可以是字符串、列表、字典、元祖、集合
  2. 循环体代码块 # 每次执行都会依次将循环对象的元素赋值给变量名
  3. continue # 用于结束本次循环,直接开始下一次循环

for嵌套

语法结构

  1. for 变量名 in 循环对象 # 可以是字符串、列表、字典、元祖、集合
  2. 循环体代码块 # 每次执行都会依次将循环对象的元素赋值给变量名
  3. for 变量名 in 循环对象 # 可以是字符串、列表、字典、元祖、集合
  4. 循环体代码块 # 每次执行都会依次将循环对象的元素赋值给变量名

range函数用法

函数语法*

  1. range(start, stop[, step])

参数说明:

  • start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0,5)
  • stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5)是[0, 1, 2, 3, 4]没有5
  • step:步长,默认为1。例如:range(0, 5)等价于 range(0, 5, 1)

补充:

rangepython2 python3的区别

  1. python2range直接输出是个列表,在元素很多的情况下比较占用空间
  2. 在python2中有一个xrange 其实就是python3里面的range
  3. python3range() 返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表

循环结构练习题

练习一

编写一个猜年龄的游戏,如果不对的情况下可以猜三次 如果对了直接结束,三次机会用完之后提示用户是否继续猜测,如果用户输入了y,则再给用户三次机会,如果用户输入n则直接结束

  1. # TODO:写任何业务 都应该先搭建主体功能 之后再考虑配套优化
  2. # 1.定义真是的年龄
  3. real_age = 18
  4. # 7.定义一个记录用户猜测次数的计数器
  5. guess_count = 1
  6. # 5.将需要反复执行的代码缩进到while子代码中
  7. while True:
  8. # 9.判断当前用户到底猜测了几次
  9. if guess_count == 4:
  10. # 10.提示用户已经尝试了三次 是否继续尝试
  11. is_again = input('您已经尝试了三次 是否继续(y/n)>>>:')
  12. # 11.判断用户是否继续
  13. if is_again == 'y':
  14. # 12.重置用户尝试的次数
  15. guess_count = 1
  16. else:
  17. # 13.直接结束循环
  18. print('下次记得来玩哟!!!')
  19. break
  20. # 2.获取用户猜测的年龄
  21. guess_age = input('请输入猜测的年龄>>>:')
  22. # 3.将字符串类型的数字转换成整型类型的数字
  23. guess_age = int(guess_age) # 该代码可能会报错 暂且忽略
  24. # 4.比较猜测的年龄和真实年龄
  25. if guess_age > real_age:
  26. print('哎呀 讨厌 猜大了')
  27. guess_count += 1 # 8.猜错了就应该自增依次
  28. elif guess_age < real_age:
  29. print('不好意思 没那么小')
  30. guess_count += 1 # 8.猜错了就应该自增依次
  31. else:
  32. print('哈哈哈 你真棒!!!')
  33. # 6.一旦猜对了 立刻结束循环
  34. break

练习二

打印一个金字塔

  1. for current_level in range(1, max_level+1):
  2. for i in range(max_level-current_level):
  3. print("", end=" ")
  4. for j in range(2*current_level-1):
  5. print("*", end="")
  6. print()

小知识

什么是爬虫

通过编写代码去网络上爬取我们需要的数据

案例

  1. import requests
  2. url = 'https://www.changchen.cc/archives/%s/'
  3. for i in range(0, 100, 1):
  4. real_url = url % i
  5. response = str(requests.get(real_url))
  6. if '200' in response:
  7. print(real_url)
  8. # 通过代码请求页面获取页面数据
  9. # 然后根据业务需求筛选出特定的内容