Python03 流程控制
- 流程控制语句是用来控制程序中各
语句执行顺序
的语句,可以把语句组合成能完成一定功能
的小逻辑模块 - 流程控制主要分为三种
- 顺序结构
- 条件分支结构
- 循环结构
3.1 顺序结构
程序从上至下依次逐行的执行,中间没有任何的判断和跳转的情况(比如咱们前面基础语法部分的代码案例)
a = 100
a += 1
# 输出101 a = a + 1,最终a = 100 + 1
print(a)
b = 2
b *= 3
# 输出6 b = b * 3,最终b = 2 * 3
print(b)
c = 10
c += 1 + 2
# 输出13, 先算运算符右侧1 + 2 = 3, c += 3 , 推导出c = 10 + 3
print(c)
3.2 条件分支结构
- 单分支(if)
- 双分支(if…else)
- 多分支(if…elif…else)
- if嵌套(if 或者 else 语句中 又包含了另一个 条件分支判断)
3.2.1 单分支(if语句)
格式:
if 条件表达式:
条件成立执行的代码
注意:条件表达式结果 必须是 布尔类型
执行流程:
案例:输入年龄,判断是否是合法工龄
# 输入年龄
age = input("请输入年龄:")
# 判断是否是合法工龄
if 18<age<60 :
print("合法工龄!")
3.2.2 双分支(if…else语句)
格式:
if 条件表达式 :
条件成立执行的代码
else:
条件不成立执行的代码
执行流程:
案例:输入一个整数,判断是偶数还是奇数
# 输入一个数据
num = input("请输入一个整数:")
# 判断奇偶性==> 除 2 看余数是否为 0
if num % 2 == 0:
print(f"{num} 是偶数")
else:
print(f"{num} 是奇数")
3.2.3 多分支(if…elif…else 语句)
格式:
if 条件表达式 1:
代码块 1
elif 条件表达式 2:
代码块 2
elif 条件表达式 n:
代码块 n
else:
以上条件都不满足执行的代码
一旦条件表达式为true,则进入执行相应的语句块
执行流程:
案例:
王者荣耀排位分段
王者选手 0 ~ 25 星
无双王者 26 ~ 50 星
荣耀王者 51 ~ 100 星
star = int(input("请输入您的星星数:"))
if 0 < star <= 25:
print("王者选手")
elif 26 < star <= 50:
print("无双王者")
elif 50 < star <= 100:
print("荣耀王者")
elif star > 100:
print("别瞎想了!最高 100 星!你个假选手")
else:
print("啥都不是!回家学习吧!")
3.2.4 if 嵌套
if 或者 else 语句种 友包含了另一个 条件分支判断
假设需求:输入一个数字 判断是否是 10 以内的数字,然后判断 是否是 偶数
格式:
if 条件 1:
if 条件 2 :
满足条件 1 和 2 的语句
else:
不满足条件 2 的语句
else:
不满足的语句
执行流程
案例实现:
# 输入数字
num = input("请输入数字:")
# 1、判断是否在 0~10if 0 <= num < 10:
# 2、判断是否是 偶数
if num % 2 == 0:
print(f"数字:{num},是偶数")
# 除 2 余数 不等于 2 else:
print(f"数字:{num},不是偶数")
# 不满足条件 (num 不在 0~10 之间)
else:
print(f"数字:{num},不在0~10之间!")
3.2.5 练习
1. 输入3个数,分别为 a 、b、c ,按照从小到大的顺序进行输出
2. 简单的登录操作,假设:用户名="root" , 密码="123456" ,输入用户名和密码进行登录
3. 数字猜谜(指定一个数据,用户输入所猜的数字)
实现
练习1:
# 输入3个数,分别为 a 、b、c ,按照从小到大的顺序进行输出
"""
从键盘输入数据方式 1 ,单个直接输入
a=int(input("请输入第1个数据:"))
b=int(input("请输入第2个数据:"))
c=int(input("请输入第3个数据:"))
"""
"""
从键盘输入数据方式 2 ,接收字符串再进行分割
str = input("请输入3个数据,以,分割:")
# split()分割
new_str = str.split(",")
# 或者切片
new_str = str[::2]
"""
"""
从键盘输入数据方式 3 ,eval()函数==》eval()函数用来执行一个字符串表达式,
并返回表达式的值。还可以把字符串转化为list、tuple、dict。
"""
a, b, c = eval(input("请输入3个数据,以,分割:"))
# 判断 a 和 bif a > b:
# 如果 a>b ==> 判断 b 和 c if b > c:
# 已知 a>b 且 b>c ==》a>b>c
print("排序后:", a, b, c)
# 判断 a和 c ; 已知第一次 if 时 a<=b的 ,所以判断 a 和c
elif a > c:
# 已知 a<=b 且 a>c ==> b>a>c print("排序后:", b, a, c)
# 已知 前两次 判断 得出 a<=b 且 a<=c ==>所以 这里可以直接 判断 b和 celif b > c:
# 已知a<=b , a<=c 且 b<c ==> b>c>a print("排序后:", b, c, a)
# 不满足上面 3个条件==> a<=b , a<=c ,b<=c 推出==> c>b>a
else:
print("排序后:", c, b, a)
eval虽然方便,但是要注意安全性,可以将字符串转成表达式并执行,就可以利用执行系统命令,删除文件等操作。,比如用户恶意输入就会获得当前目录文件*
练习2:
# 2. 简单的登录操作,假设:用户名="root" , 密码="123456" ,输入用户名和密码进行登录
user = "root"
pwd = 123456
# 输入数据
user_input = input("用户名:")
pwd_input = int(input("密 码:"))
# 判断指定数据和输入数据是否相同
if user == user_input and pwd == pwd_input:
print("登录成!")
else:
print("用户名或密码错误!")
练习3:
# 3. 数字猜谜(指定一个数据,用户输入所猜的数字)
num = 99 # 指定数字
n = input("请猜数字:")
# 比较大小
if n > num:
print("猜大了!")
elif n < num:
print("猜小了!")
else:
print("恭喜!猜对了!")
3.2.6 拓展
Python 3.10 增加了 match…case 的条件判断,不需要再使用一连串的 if-else 来判断了。
match 后的对象会依次与 case 后的内容进行匹配,如果匹配成功,则执行匹配到的表达式,否则直接跳过,_ 可以匹配一切。
格式:
match 表达式:
case 数据1:
(表达式结果 == 数据1) 所执行的代码块
case 数据2:
同上
case 数据3:
同上
case _:
当其他的都不满足时 匹配 这个
case _:
类似于 C 和 Java 中的 default:,当其他 case 都无法匹配时,匹配这条,保证永远会匹配成功。
mystatus=400
match mystatus:
case 400:
return "Bad request"
case 404:
return "Not found"
case 418:
return "I'm a teapot"
case _:
return "Something's wrong with the internet"
3.3 循环结构
- 概念:在
特定条件
之下,重复的
执行特定功能 - 分类:
- while 循环
- for 循环
- 结构要素:
- 初始条件
- 结束条件
- 循环内容(重复的功能)
- 迭代部分
3.3.1 while 循环
while循环是一个条件循环语句,当条件满足时重复执行代码块,直到条件不满足为止。
格式:
while 条件表达式:
条件成立重复执行的代码1
条件成立重复执行的代码2
结构分解:
1.初始条件
while 2.循环条件(条件是否成立/结束条件):
3.循环体内容(重复执行的特定功能)
4.迭代部分
执行流程:
案例:计算 10!(10的阶乘)
# 1.定义初始条件 从1开始计算阶乘
i = 1
# 2.定义变量 res 用于接收 每一次阶乘的结果
res = 1
# 3.条件:当 i>10时停止循环计算
while i <= 10:
# 4.将每次阶乘结果赋值
res *= i # ==> res=res*i
# 5.每次 计算了阶乘 就让 i+1i += 1
print(res)
3.3.2 for 循环
Python for 循环可以 遍历任何可迭代对象,如一个列表或者一个字符串。
格式:
for 临时变量 in 可迭代对象:
重复执行的语句1
重复执行的语句2
结构分解:
for 1.初始化 in 2.循环条件+3.迭代部分 :
3.循环体内容(重复执行的特定功能)
执行流程:
案例:计算 10!(10的阶乘)
# 定义变量 res 用于接收 每一次阶乘的结果
res = 1
for i in range(1, 11):
# 将每次阶乘结果赋值
res *= i # ==> res=res*i
print(res)
*拓展:range()函数
内置的函数,主要用于生成指定区间的数据
格式:range(开始,结束,步长)
案例:range(1,5,1) --> 步长为 1 可以不写 --> range(1,5)
结果:1,2,3,4
注意:range()函数 不会取到 结束位置
循环选择:
*遍历有明显的循环次数(范围)的需求,选择for循环
遍历没有明显的循环次数(范围)的需求,选择while循环
3.3.4 循环嵌套
*1. 指 一个循环结构A 的循环体是另一个 循环结构B。比如,for循环里面还有一个for循环,就是嵌套循环。其中,for ,while 均可以作为外层循环或内层循环。
2.嵌套循环就是把内层循环当成外层循环的循环体
以 for 嵌套 for 为例 (while或者其他情况同理)
结构:
for i in 序列:
for j in 序列
执行流程:
案例:打印5行直角三角形
*
**
***
****
*****
# 外层循环 i 控制 行
for i in range(1, 6):
# 内层循环 j 作为 列数控制
for j in range(1, i + 1):
# 打印* ,指定结尾
print("*", end="")
# 每行结束之后打印换行
print()
*技巧:
- 外层循环次数为
m
次,内层为n
次,则内层循环体实际上需要执行m*n
次- 外层循环控制
行数
,内层循环控制列数
- 外层循环执行一次,内层循环执行一轮。
- 实际开发中,嵌套循环一般是两层。一般不会出现超过三层的嵌套循环(如果出现,请好好反思一下自己的逻辑)*
3.3.5 循环控制(break 和 continue)
break 和 continue 主要用于控制循环是否继续执行
- break:停止整个循环,不再继续执行
- continue:跳过(只停止)当前循环,继续执行下一次循环
案例:break
#遇到 e 不再打印(停止整个)
s = 'abcdefg'
for i in str1:
if i == 'e':
print('遇到e不再打印')
break
print(i)
案例:continue
#遇到 e 不打印(只停止当前)
s = 'abcdefg'
for i in str1:
if i == 'e':
print('遇到e不打印')
continue
print(i)
3.3.6 循环+else
循环可以和else配合使用,else下方缩进的代码指的是当循环正常结束之后要执行的代码
*注意:
- 有 break 时 :else指的是循环正常结束之后要执行的代码,如果是break终止循环的情况,else下方缩进的代码将不执行
- 有 continue 时 :continue 是退出当前一次循环,继续下一次循环,所以该循环在continue控制下是可以正常结束的,当循环结束后,则执行了else缩进的代码。
3.3.7 练习
1. 遍历1-100的偶数,并计算所有偶数的和、偶数的个数
2. 从键盘输入整数,输入0结束,统计输入的正数、负数的个数
3. 输出水仙花数,所谓水仙花数是指一个3位数,其各个位上数字立方和等于其本身。例如: `153 = 1*1*1 + 3*3*3 + 5*5*5`
4. 输出任意位数的水仙花数据
5. 随机生成一个100以内的数,猜这个随机数是多少?
从键盘输入数,如果大了提示,大了;
如果小了,提示小了;
如果对了,就不再猜了,
并统计一共猜了多少次。
6. 打印"菱形"
*
* * *
* * * * *
* * * * * * *
* * * * * * * * *
* * * * * * *
* * * * *
* * *
*
7. 打印 99 乘法表
8. 将一天中的(偶数)的时间打印到控制台(x 时 xx 分 的形式)
9. 生成 1-100 之间的随机数,直到生成了 97 这个数,看看一共用了几次?
10. 某一年的某一个月的某一天,(比如:2023年2月24日)你决定要改变了。
你立志于1天比你的小伙伴多学习 1 小时 ==> 请计算 两年之后的那个年底 你比你小伙伴总共多学习了 多少 小时?
但是假如你每天和小伙伴一起打一个小时王者荣耀排位赛,一小时打两把,输赢随机,但是会没每一个月都会被重置 。请计算 两年之后你和你小伙伴王者多少星
重置规则:
1. 0 < * < 35 重置到 钻石(王者 -15 颗星)
2. 35 <= * <50 重置到 星耀 (王者 -5 课星 )
3. 50 <= * <=100 重置到 王者 0 星
比如:输入-案例:
你觉醒的日子:2023年2月24日
你的王者段位(王者多少*):25
========>
两年之后:
你多学习了 xx 小时
你的王者段位:xxx
*拓展:随机数 random模块
random 模块(需要导入:import random)
整数生成格式:random.randint(开始,结束)