文章目录
分支结构
1. 概述
- 根据python第一节的内容,如果跟着敲的同学们会发现,无论你怎么写,代码的执行顺序都是从上往下按照顺序结构执行的。
- 如下列场景:都需要根据判断条件来决定执行哪个流程。
- 过走斑马线 ,根据交通灯的颜色,判断上是否可以通过。
- 上网吧,会根据年龄,进行判断你是否可以上网。
- 做公交车,根据是否刷卡来判断能否乘坐。
- 什么叫做分支语句?
- 根据 判断条件 选择执行路径,而不是按照语句出现的物理顺序。
- 根据 判断条件 选择执行路径,而不是按照语句出现的物理顺序。
2. 语法结构
2.1 单分支语法结构
-
如果判断条件中的,表达式成立,会执行结构里面内容,否则就不执行。
- 在python中使用 缩进来,代替代码中的层级关系。
""" 关键字 if 如果条件表达式成立,执行语句 如果表达式不成立, 就不执行语句 """ if 条件表达式: #关键字,if 条件表达式,然后面接一个冒号: 执行语句1 # 换行之后, 制表符tab距离相当于4个空格 # 注意,按照缩进格式进行区别 执行语句2 # 执行语句2就不受if控制.
-
练习
- 键盘录入天气状况,然后判断是否能出去活动,并给出提示。
- 从题目中去分析代码编写要求。
- 没有使用代码缩进,会有什么现象。
""" 键盘录入天气状况,然后判断是否能出去活动,并给出提示。 """ #1.控制台接收输入条件 weather = input("请输入天气条件"); #控制台接收类型是 str类型 #2. 根据条件进行判断 if weather =="晴天": print("可以在室外进行活动") #如果和if是同级别的, print("看看我执行了么?")
- 键盘录入天气状况,然后判断是否能出去活动,并给出提示。
-
扩展题:判断下面a输出的结果 ?
- 思考一下?
a = 1 if a >0: a+=a if a>1: a*=2 print(a) #结果是 4
2.2 多分支语法结构
-
接上一个单分支结构案例,根据条件表达式的判断,可以执行不同的流程。
- 现在我需要根据表达式条件不同,执行不同的流程,需要别分给出结果 ?
-
多分支语法结构
- 条件表达式成立,Ture 执行,if中的 ,语句1 ,
- 表达式不成立,False 执行 ,else中的,语句2.
if 条件表达式: #关键字,if 条件表达式,然后面接一个冒号: 执行语句1 # 换行之后, 制表符tab距离相当于4个空格 else: 执行语句2
-
练习:
- 思考一个问题?
else
后面为什么不接条件表达式?
""" 键盘录入天气状况,然后判断是否能出去活动,并给出提示。 """ #1.控制台接收输入条件 weather = input("请输入天气条件"); #控制台接收类型是 str类型 #2. 根据条件进行判断 if weather =="晴天": print("可以在室外进行活动") else: # else 后面为什么不接条件表达式? 可以if共用一个组成分支. print("可以在室内进行活动") print("程序执行结束......")
- 思考一个问题?
-
思考: 只使用单分支能否解决 多分支if-else的案例。
- 单个if 解决。
- 这样同上面的 if - else 结构有么不同 ?
if weather =="晴天": print("可以在室外进行活动") if weather =="雨天": print("进行室外活动")
- 思路 : 单分支相当于匹配 2次, 而 if-else结构只需要匹配1 次即可, 效率高!
- 注意, 下面双if的时候如果条件输入错误,都会不执行, 但是if-else结构总会执行一个**(例如: 天气判断)。**
2.3 多重语法结构
-
主要是解决区间条件判断问题,如,开始成绩。
- 语法格式
if 判断条件1: 语句体1 elif 判断条件2: 语句体2 .... # 这里可以有多个elif else: 语句体n # 当所有的条件都不满足的时候, 执行这里的内容.
-
多重if 结构的执行流程 :
- 先执行判断条件1, 看其是否成立, 成立则执行对应的语句体1, 然后程序结束.
- 如果判断条件1不成立, 则执行判断条件2, 看其是否成立, 成立则执行对应的语句体2, 然后程序结束.
- 如果不成立, 则执行判断条件3,… 依次类推.
- 如果所有的条件都不满足的时候, 执行最后一个else的内容.
-
计算区间成绩 :
- 下面的案例你有几种实现形式 ?
- 从一个编程角度去,考虑 边界值,或者反向使用
if
多重结构
score = int(input("请输入考试成绩:")) # 接收成绩,进行类型转换. #因为涉及到区间选择,即多条件选择,所以需要 多重分支结构 if score<=100 and score>=90: print("A") elif score<=89 and score>=80: print("B") elif score<=79 and score>=70: print("C") elif score<=69 and score>=60: print("D") elif score<=59 and score>=0: print("E") else: print("输入有误,请重新检查") #分割线 print("-"*20) """ 第二种实现方式, 考虑边界值, 使用if的反向操作, """ # 反向操作 如果 不满足条件我就不需要进行判断 if score < 0 or score > 100: # 直接排除非法的边界值条件 print("输入有误,请重新检查") elif score >= 90: # 相当于 score<=100 and score>=90: print("A") elif score >= 80: print("B") elif score >= 70: # 相当于 score <= 79 and score >= 70: print("C") elif score >= 60: print("D") else: print("E") # score<=59 and score>=0:
2.4 分支语句的嵌套结构
-
所谓的if嵌套指的是 if语句内部还有一个if语句.
- 那我们怎么理解这句话,先看语法构成。
- 原理: 只有外面的if条件成立了,才能执行里面的语句。
if 判断条件: 语句体 if 判断条件: 语句体 else: 语句体 else: 语句体
-
练习场景: 跑步比赛,男女同组选拔,跑进20s内,进入正式比赛,男生进男生组,女生进女生组,并且给出提示
- 这就是一个嵌套结构的体现。
""" 跑步比赛,男女同组选拔,跑进20s内,进入正式比赛,男生进男生组,女生进女生组。 1. 首先需要判断是否能进正式比赛 2. 然后判断性别 男生进男生 女生进女生 """ # 控制台输入跑步成绩 score = int(input("请输入比赛成绩:")) # 1. 第一次判断是否能进比赛 if score<=20 : print("进入比赛,请输入性别:") sex = input() if sex=="男": print("进男生组") elif sex=="女": print("进女生组") else: print("请正确输入,您的性别") # 如果没有成功,给出提示. else: print("很遗憾,继续努力")
3. debug 断点调试
-
什么事 Debug ? 就是用来调试程序的, 可以查看程序的执行流程, 或者 对程序进行排错.
- Bug解释: 程序员把程序出现的所有的非正常的情况, 统称为: Bug.
- 调试程序,查看程序执行流程,通过 断点进行调试。
-
看哪里?
- 下左: 记录的是程序执行到哪里了.
- 下中: 记录的是变量的变化过程.
- 下右: 记录的是控制台的输出结果.
-
如何进行下一步?
- F7: 逐过程调试, 即: 一步一步的走, 看到函数会进去查看源码.
- F8: 逐行调试, 即: 一行一行的走, 不管是否是函数, 都当做一行代码执行.
- F9: 逐断点调试, 即: 一个一个断点的走.
- 逐个断点调式相当于对有问题的代码缩小范围, 然后在使用逐行的方式,如果有自己写的方法,可以在使用逐过程调试。 三者需要配合使用!
- 如何移除断点?
- 第一种: 重新点击你的断点。
- 第二种: 选择"双点图标(break points… )即可。
4. 三元运算符
4.1 语法使用
-
什么是三元运算符?
- 它也叫,三目运算符,相当于简化了 if -else 的书写格式,增强了阅读理解的方便性.
- 相当于另一种运算符。
-
语法格式
变量名 = 语句体1 if 判断条件 else 语句体2
- 练习题: 获取两个数的最大值
- 先用if-else 分支结构, 在使用 三目运算符的方式,观察有什么不同?
# 输入两个数比较最大值 a = int(input("请输入a的值")) b = int(input("请输入b的值")) #需要使用 一个值接收这个三元运算符输出的值 max = 三元运算符 max = a if a>b else b print(max) print("-"*20) #通过if --else 分支结构写出 # 声明第三个变量存储最大值 max=0 if a>b: max =a #如果a大,就赋值给max else: max = b print(f"a输入的值是:{a},b输入的值是:{b},最大值是{max}")
4.2 求两个数的差值
- 输入两个数, 计算他们的差值。
- 注意,两个数相差的值,叫做差值,并且差值不能为负数。
- 怎么解决差值不能为负数 ?
#所以 差值不能出现负数 -10 是啥!怎么处理这样的问题 v1 = int(input("输入第一个值: ")) v2 = int(input("输入第二个值: ")) #使用三元运算符,处理逻辑思路。 value = (v1-v2) if (v1>=v2) else (v2-v1) print(f"差值是{value}")
5.案例练习
5.1 计算快递包裹重量
- 如图所示,需要 计算包裹费用。
- 邮寄水果需要根据快递进行计价,计价规则:快递的价格是,包裹重量不超过15公斤时,每公斤6元;超过15公斤后,超出部分每公斤3元。
#测试数据 输入11.6 输出 69.6 #输入 18.8 输出101.4 # 从控制台接收输入水果重量 # 需要注意转换数据类型 float() weight = float(input()) #2.进行逻辑上的判断 #2.1 如果小于15 相当于标准运费 if weight <= 15: print("运费", weight * 6) #2.2 如果大于15的话,如何处理? # 超过的部分 需要额外计算 但是规定部分重量以内的部分在原来基础上计算。 else: print("运费", (weight - 15) * 3 + 15 * 6)
5.2 判断奇偶数
- 如何写一个判断奇数还是偶数的程序。
- 什么是奇数?, 什么是 偶数 ?
""" 1. 首先明确什么是奇数 什么是偶数 就是跟2做对比 num%2==0 余数为0偶数 num%2==1 余数为奇数 """ num = int(input("请输入")) if num % 2 == 0: print("偶数") else: print("奇数")
5.3 判断闰年
- 什么是闰年?闰年分为世纪闰年和普通闰年。
- 第一个条件: 能被4整除但不能被100整除的年份为闰年。
- 第二个条件: 能被400整除的为闰年。(2000年是闰年,1900年就不是)
- 要求编写一个程序判断是否是闰年。
""" 根据条件说明 第一点 能被4整数并且不能被100整数 year%4==0 and year%100!=0 第二个条件 能被400整除 year%400==0 """ year = int(input("请输入年份:")) if year % 4 == 0 and year % 100 != 0: print("闰年") elif year % 400 == 0: print("闰年") else: print("平年")
5.4 判断三个数最大数
- 从控制台输入三个数, 判断哪一个是最大数 ?
- 控制台输入: 三行,每行一个整数 。
""" 主要考察的就是 比较运算符和逻辑运算符的使用 第一个条件 如果 a>=b and a>=c 是就是a最大 ...所以依次类推 b>=c and b>=a 不那么就是 b最大 """ #函数使用,(了解即可) a, b, c = list(map(int, input().split())) if a >= b and a >= c: print(a) elif b >= a and b >= c: print(b) else: print(c)
5.5 三个数排序
- 从键盘输入三个整数,请输出三个整数按照从小到大的顺序输出
- 相当于 冒泡排序 的算法,有几个数就比较几次。
a,b = b,a
交换变量。
""""
7 10 8 这三个数应该比较几次
第一次比较 a> b? 7 10 8 不交换位置
第二次比较 a>c? 7 10 8 不交换位置
第三次比较 b>c ? 7 8 10 交换位置
经过排序算出结果.
"""
a, b, c = list(map(int, input().split()))
# 记住是三个if结构 不是 if--elif结构
if a > b:
a, b = b, a
if a > c:
a, c = c, a
if b > c:
b, c = c, b
print(a, b, c)
5.6 三角形进阶判断
-
三角形成立的条件是什么?
- 两边之和大于第三边。
-
给出3条线段长度,请你判断
- 是否能组成等边三角形,如果能请输出‘yes’不能输出‘no’;
- 是否能组成等腰三角形,如能输出‘yes’不能输出‘no’;
- 是否能组成三角形;如果能输出‘yes’ 不能输出‘no’
#提前定义标志变量 x_db = "no" # 等腰 x_dy = "no" # 等边 x_ = "no" # 三角形 # 接收三个输入的整数 a = int(input()) b = int(input()) c = int(input()) # 最外面的一层开始判断 if a == b and b == c: x_db = "yes" # 改变变量 if a == b or b == c or a == c: x_dy = "yes" if a + b > c and a + c > b and b + c > a: x_ = "yes" print(x_db, x_dy, x_)
5.7 人机猜拳游戏
- 模拟玩家与电脑的一种猜拳的游戏
- 需要使用一个新的函数
- 导包
import random
random.randint(a, b)
用于生成一个指定范围内的整数。其中参数a是下限,参数b是上限,生成的随机数n: a <= n <= b。
import random #随机生产 包含开始到结束的随机数: 如下 随机生成 1~3的随机数。 num = random.randint(1,3) print(num)
- 导包
- 模拟猜拳游戏规则
- 提示用户出拳,然后与电脑相比较,规则通用 剪刀>布 就算赢,并给出提示。
- 规则就是 电脑赢, 玩家赢 , 平局。
import random # 导包
#猜拳游戏, 代码实现.
user_play = int(input('请出拳: 1(剪刀) 2(石头) 3(布'))
# 2.电脑出的拳,就是随机数.
pc_play = random.randint(1, 3) # 1(剪刀) 2(石头) 3(布)
# 输出电脑
print(f"电脑出拳:{pc_play}")
#可以先使用平局,这样就可以少写一部分代码,不然判断玩家胜,在判断电脑胜, 最后else才是平局,就会代码冗余.
#反方向,使用if选择结构.
if user_play == pc_play:
print('平局')
# 4. 如果玩家胜利了, 就是提示玩家胜利,
elif (user_play == 1 and pc_play == 3) or (user_play == 2 and pc_play == 1) or (user_play == 3 and pc_play == 2):
print("玩家取得胜利")
# 反之,则电脑胜利
else:
print('电脑胜利')
5.8 判断坐标点属于第几象限
-
使用逻辑运算符。
- 象限的范围怎么确定 ?
#数值比较,就需要进行数据类型转换。 x = int(input('X:')) y = int(input('Y:')) if x == 0: print('X轴') elif y == 0: print('Y轴') elif x>0 and y>0: print('第一象限') elif x>0 and y<0: print('第四象限') elif x<0 and y>0: print('第二象限') elif x<0 and y<0: print('第三象限')
- 象限的范围怎么确定 ?
5.9 取苹果
- 小明和小美在玩一个游戏,桌子上有n个苹果,每次只能取1个或者2个,最后一个取走苹果的人获胜。
- 假设:小明和小美都很聪明,都采用最优的策略。
- 小明先取,那小美能获取胜利吗?
- 如果小明能赢,就输出Yes,否则输出No。
- 分析如下图:
- 分析如下图:
- 根据上图分析得知:
- 代码如下:
#include <iostream> using namespace std; int main(){ int apple_num; cin >>apple_num;// 输入苹果数量 //根据上图分析, 只要是3的倍数小明就会赢 if(apple_num%3==0){ cout<<"Yes"; }else{ cout<<"No"; } return 0; }