流程控制
| |
| 流程控制,是计算机运算领域的用语,意指在程序运行时,个别的指令(或是陈述、子程序)运行或求值的顺序。 |
| 三大流程控制结构: |
| 1. 顺序结构 :代码从上到下,全部执行 |
| 2. 分支结构 :判断语句,代码有选择性的执行 |
| 3. 循环结构 :重复执行某一部分的代码 |
| |
| if、for、while、break、continue 五个。Python3.10增加了match。当然也有人会将pass(类似于汇编指令nop,什么也不做的空指令)归类于流程控制 |
流程控制如何使用
| 注意事项: |
| 1. 所有的条件都会转为布尔值进行判断 |
| 2. 在Python中,我们使用缩进来表示代码的从属关系 |
| |
| 3. 不是所有的代码都有从属关系 |
| 4. 同属于一个代码块的子代码块缩进量要保持一致 |
| 小技巧:如果上面一行代码的结尾是冒号:那么,下一行必缩进 |
1. 顺序结构
| - 在计算机程序中,顺序结构是指按照代码书写的顺序,一条语句接着一条语句执行,没有跳过、重复或其他特殊的结构。 |
| - 程序按照从上到下的顺序逐行执行。 |
2. 分支结构(if elif else)
单分支(if 结构)
| |
| if 判断条件: |
| 书写条件成立(真),执行的代码 |
| 书写条件成立(真),执行的代码 |
| 顶格书写,没有缩进的代码,和 if无关, 不管条件是否成立,都会执行 |
| |
| |
| |
| |
| |
| |
| |
| 案例 |
| |
| str age = input('请输入你的年龄:') |
| |
| if int(age) >= 18: |
| |
| print('满 18 岁了,可以进入网吧为所欲为了') |
| print('我和 if 判断没有关系,不管怎样,都会执行') |
双分支(if-else 结构)
| |
| if 判断条件: |
| 书写条件成立(真),执行的代码 书写条件成立(真),执行的代码 |
| else: |
| 书写条件不成立(假), 执行的代码 书写条件不成立(假), 执行的代码 |
| |
| |
| |
| |
| |
| |
| |
| |
| 案例 |
| |
| age = input('请输入你的年龄:') |
| |
| if int(age) >= 18: |
| |
| print('满 18 岁了,可以进入网吧为所欲为了') |
| |
| else: |
| print('不满 18 岁,回去写作业吧') |
多分支(if-elif-else 结构)
| |
| if 判断条件1: |
| 判断条件1成立,执行的代码 |
| elif 判断条件2: |
| 判断条件2成立执行的代码 |
| else: |
| 以上条件都不成立,执行的代码 |
| |
| |
| |
| |
| |
| |
| |
| |
| 案例: |
| |
| score = int(input('请输入你的分数')) |
| |
| if score >= 90: |
| print('优') |
| |
| elif (score >= 80) and score < 90: |
| print('良') |
| |
| |
| print('中') |
| |
| elif score >= 60: |
| print('差') |
| |
| else: |
| print('不及格') |
if 嵌套
if 嵌套, 是指在一个 if(elif else) 中嵌套另一个 if.
使用场景: 判断条件存在递进关系(只有第一个条件满足了,才会判断第二个条件)
| |
| if 判断条件1: |
| 判断条件1成立,执行的代码 |
| if 判断条件2: |
| 判断条件2成立,执行的代码 |
| else: |
| 判断条件2不成立,执行的代码 |
| else: |
| 判断条件1不成立,执行的代码 |
| |
实战:猜拳游戏
| import random |
| |
| |
| player = int(input('请出拳石头(1)/剪刀(2)/布(3):')) |
| |
| computer = random.randint(1, 3) |
| |
| |
| if (player == 1 and computer == 2) or (player == 2 and computer == 3) or (player == 3 and computer == 1): |
| print('恭喜你获得胜利') |
| |
| elif player == computer: |
| print('平局') |
| |
| else: |
| print('输了, 不要放弃, 再来一局') |
3. 循环结构
| 1. 需要重复地执行某些相似的任务,使用用循环结构(就是让 指定的代码 重复的执行) |
| 2. 根据循环次数是否有限,循环可以分为循环次数有限的有限循环和循环次数无限的无限循环。无限循环又称死循环,不过死循环有时并非语法错误,有时候是正好需要死循环的 |
| 3. Python中的循环流程控制语句有for、while 两个。Python中没有do...while、wend语句 |
死循环和无限循环
| 死循环: 一般是由写代码的人不小心造成的 bug, 代码一直不停的运行下去 |
| 无限循环: 写代码的人故意让代码无限制的去执行,代码一直不停的运行下去 无限循环的 |
| 使用场景: 在书写循环的时候,不确定循环要执行多少次 无限循环的使用一般会在循环中添加一个 if 判断, 当 if 条件成立,使用关键字 break 来终止循环 |
while循环
| |
| 设置循环的初始条件(计数器) |
| 书写循环的判断条件 |
| while 判断条件: |
| 需要重复执行的代码 |
| 改变循环的初始条件(计数器) |
| |
| |
| 案例 |
| |
| i = 0 |
| |
| while i < 5: |
| |
| print('媳妇, 我错了') |
| |
| |
| i += 1 |
while案例1(猜拳游戏)
| |
| while True: |
| 重复执行的代码 |
| if 判断条件: |
| break |
| 重复执行的代码 |
| |
| 例(猜拳游戏) |
| import random |
| |
| while True: |
| |
| player = int(input('请出拳石头(1)/剪刀(2)/布(3)/退出(0):')) |
| if player == 0: |
| break |
| |
| computer = random.randint(1, 3) |
| |
| |
| if (player == 1 and computer == 2) or (player == 2 and computer == 3) or (player == 3 and computer == 1): |
| print('恭喜你获得胜利') |
| |
| elif player == computer: |
| print('平局') |
| else: |
| print('输了, 不要放弃, 再来一局') |
while案例2(使用循环求 1-100 之间偶数的和)
| |
| |
| |
| num = 0 |
| |
| |
| i = 2 |
| |
| while i <= 100: |
| |
| num += i |
| |
| |
| i += 2 |
| |
| print('求和的结果是:', num) |
| |
| |
| |
| |
| |
| num = 0 |
| i = 1 |
| while i <= 100: |
| |
| if i % 2 == 0: |
| |
| num += i |
| |
| i += 1 |
| print('求和的结果是:', num) |
for 循环
| for循环也可以让指定的代码重复执⾏ (循环) |
| for循环可以遍历容器中的数据( |
| 遍历: 从容器中把数据⼀个⼀个取出 |
| 容器: 可以简单理解为盒⼦, 盒⼦中可以存放很多的数据 (字符串 str, 列表 list, 元组 tuple, 字典 dict) |
| ) |
| for 循环 也可以称为 for 遍历 |
| |
| |
| for 变量名 in 容器: |
| 重复执⾏的代码 |
| |
| |
| |
| |
for 做指定次数的循环
| for 变量 in range(n): |
| 重复执⾏的代码 |
| |
| |
| |
| |
| |
| |
| for 变量 in range(a, b): |
| 重复的代码 |
| |
break 和 continue
| break 和 continue 是 Python 中的两个关键字, 只能在循环中使⽤ |
| 1. break: 终⽌循环, 即代码执⾏遇到 break, 循环不再执⾏,⽴即结束 |
| 2. continue: 跳过本次循环. 即代码执⾏遇到 continue,本次循 环剩下的代码不再执⾏, 继续下⼀次循环 |
补充:
标志位
语法
| flag = True |
| |
| while flag: |
| |
| if some_condition: |
| flag = False |
使用
| flag = True |
| |
| while flag: |
| user_input = input("请输入:") |
| if user_input == 'exit': |
| flag = False |
| else: |
| print("用户输入:", user_input) |
登陆案例 (while循环嵌套+tag标志位)
| |
| user_list = [ |
| {'username': 'user1', 'password': '123'}, |
| {'username': 'user2', 'password': '456'}, |
| {'username': 'user3', 'password': '789'}, |
| ] |
| |
| login_flag = False |
| |
| while True: |
| username = input("请输入用户名:") |
| password = input("请输入密码:") |
| |
| for user in user_list: |
| if username == user['username'] and password == user['password']: |
| print("登陆成功!") |
| login_flag = True |
| break |
| |
| if login_flag: |
| break |
| else: |
| print("用户名或密码错误,请重新输入。") |
| username = "Dream" |
| password = "123" |
| count = 0 |
| |
| tag = True |
| while tag: |
| inp_name = input("请输入用户名:") |
| inp_pwd = input("请输入密码:") |
| if inp_name == username and inp_pwd == password: |
| print("登陆成功") |
| while tag: |
| cmd = input('>>: ') |
| if cmd == 'quit': |
| tag = False |
| break |
| print('run <%s>' % cmd) |
| break |
| else: |
| print("输入的用户名或密码错误!") |
| count += 1 |
循环分支 (else)
- 在while循环的后面
- 当while 循环正常执行完并且中间没有被break 中止的话
- 所以我们可以用else来验证
| count = 0 |
| while count <= 5 : |
| count += 1 |
| print("Loop",count) |
| else: |
| print("循环正常执行完啦") |
| print("-----out of while loop ------") |
| 输出 |
| Loop 1 |
| Loop 2 |
| Loop 3 |
| Loop 4 |
| Loop 5 |
| Loop 6 |
| 循环正常执行完啦 #没有被break打断,所以执行了该行代码 |
| -----out of while loop ------ |
| count = 0 |
| while count <= 5 : |
| count += 1 |
| if count == 3: |
| break |
| print("Loop",count) |
| else: |
| print("循环正常执行完啦") |
| print("-----out of while loop ------") |
| 输出 |
| Loop 1 |
| Loop 2 |
| -----out of while loop ------ #由于循环被break打断了,所以不执行else后的输出语句 |
循环分支嵌套
- 循环结构和分支结构可以嵌套在一起,形成复杂的程序逻辑。
| for i in range(5): |
| print("Outer loop, current value:", i) |
| |
| for j in range(3): |
| print("Inner loop, current value:", j) |
| |
| print("Nested loops finished!") |
- 上述代码中,外层循环
for i in range(5):
执行五次,内层循环 for j in range(3):
每次外层循环执行时都会执行三次。这样就形成了嵌套的循环结构。
| |
| while 1: |
| score = input("请输入您的成绩>>") |
| |
| if score.isdigit(): |
| score = int(score) |
| if score > 100 or score < 0: |
| print("您的输入有误!") |
| elif score > 90: |
| print("成绩优秀") |
| elif score > 70: |
| print("成绩良好") |
| elif score > 60: |
| print("成绩及格") |
| else: |
| print("成绩不及格") |
| else: |
| print("请输入一个数字") |
range关键字
(1)遍历数字序列
语法
| for i in range(start, stop): |
| |
| for i in range(start, stop, step): |
| |
使用
| for i in range(5): |
| print(i) |
| |
| |
| |
| |
| |
| |
| for i in range(2, 6): |
| print(i) |
| |
| |
| |
| |
| |
| for i in range(1, 10, 2): |
| print(i) |
| |
| |
| |
| |
| |
| |
(2)指定区间
语法
使用
| for i in range(2, 6): |
| print(i) |
| |
| |
| |
| |
| |
(3)步长
语法
使用
| for i in range(1, 10, 2): |
| print(i) |
| |
| |
| |
| |
| |
| |
(4)range + len 遍历序列
原理
| my_list = ['apple', 'banana', 'orange'] |
| for i in range(len(my_list)): |
| |
使用
| my_list = ['apple', 'banana', 'orange'] |
| for i in range(len(my_list)): |
| print(f"Index {i}: {my_list[i]}") |
| |
| |
| |
| |
(5)range创建
原理
| numbers = list(range(start, stop, step)) |
使用
| numbers = list(range(1, 6)) |
| print(numbers) |
| |
练习题
1. 求偶数元素的和
| numbers = [1, 2, 1, 2, 3, 3, 6, 5, 8] |
| even_sum = sum(num for num in numbers if num % 2 == 0) |
| print(even_sum) |
2. 求和一
- 计算 1 - 2 + 3 - 4 + ... + 99 中除了88以外所有数的总和
| result_sum = sum(num if num != 88 else 0 if i % 2 == 0 else -num for i, num in enumerate(range(1, 100))) |
| print(result_sum) |
3. 求和二
| import math |
| |
| factorial_sum = sum(math.factorial(i) for i in range(1, 11)) |
| print(factorial_sum) |
4. 猜数字游戏
- 程序随机内置一个位于一定范围内的数字作为猜测的结果,由用户猜测此数字。
- 用户每猜测一次,由系统提示猜测结果:太大了、太小了或者猜对了,直到用户猜对结果或者猜测次数用完导致失败。
- 设定一个理想数字比如:66, 让用户三次机会猜数字,如果比66大,则显示猜测的结果大了; 如果比66小,则显示猜测的结果小了; 只有等于66,显示猜测结果正确,退出循环。
- 最多三次都没有猜测正确,退出循环,并显示‘都没猜对,继续努力’。
| import random |
| |
| ideal_number = 66 |
| guess_count = 3 |
| |
| while guess_count > 0: |
| user_guess = int(input("Enter your guess: ")) |
| if user_guess > ideal_number: |
| print("Your guess is too large.") |
| elif user_guess < ideal_number: |
| print("Your guess is too small.") |
| else: |
| print("Congratulations! You guessed the correct number.") |
| break |
| guess_count -= 1 |
| |
| if guess_count == 0: |
| print("You didn't guess correctly. Keep trying!") |
5. 打印菱形小星星
| * |
| *** |
| ***** |
| ******* |
| ********* |
| *********** |
| *********** |
| ********* |
| ******* |
| ***** |
| *** |
| * |
| |
| def print_diamond(rows): |
| for i in range(1, rows + 1): |
| print(" " * (rows - i) + "*" * (2 * i - 1)) |
| for j in range(rows - 1, 0, -1): |
| print(" " * (rows - j) + "*" * (2 * j - 1)) |
| |
| print_diamond(7) |
6. 猜年龄游戏
(1)基础版(普通要求)
| age=18 |
| count=0 |
| while count<3: |
| count+=1 |
| guess = int(input(">>:")) |
| if guess > age : |
| print("猜的太大了,往小里试试...") |
| elif guess < age : |
| print("猜的太小了,往大里试试...") |
| else: |
| print("恭喜你,猜对了...") |
(2)高级版(增加次数)
- 当输错3次之后,不要直接结束,问用户是否还要在次输入,如果要,继续输入,如果不要,直接结束
| right_age = 22 |
| count_start = 3 |
| |
| while count_start > 0: |
| age_input = input("请输入你的年龄:>>>") |
| if right_age == age_input: |
| print(f"你真聪明,真实年龄就是{age_input}") |
| else: |
| count_start -= 1 |
| print(f"加油呀,你还有{count_start}次机会") |
| if count_start == 0: |
| count = input(f"你的机会耗尽了,请选择是否继续游戏:>>>是或否") |
| if count == '是': |
| count_start = 3 |
| else: |
| break |
7. 打印九九乘法表
| for i in range(1,10): |
| for j in range(1,i+1): |
| print('%s*%s=%s' %(i,j,i*j),end=' ') |
| print() |
8. 打印金字塔
(1)分析
| ''' |
| #max_level=5 |
| * # current_level=1,空格数=4,*号数=1 |
| *** # current_level=2,空格数=3,*号数=3 |
| ***** # current_level=3,空格数=2,*号数=5 |
| ******* # current_level=4,空格数=1,*号数=7 |
| ********* # current_level=5,空格数=0,*号数=9 |
| |
| # 数学表达式 |
| 空格数=max_level-current_level |
| *号数=2*current_level-1 |
| ''' |
(2)实现
| max_level=5 |
| for current_level in range(1,max_level+1): |
| for i in range(max_level-current_level): |
| print(' ',end='') |
| for j in range(2*current_level-1): |
| print('*',end='') |
| print() |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏