内容正文:
模块3
课程名称
Python程序设计基础
章名
模块3 流程控制——逻辑严谨,使用分支与循环评定奖学金
教学内容
条件分支语句、循环语句、break/continue语句
课时
6
项目性质
□演示性 □验证性 □设计性 R综合性
授课班级
授课日期
授课地点
教学目标
(1)能够根据程序的处理逻辑,选择合适的条件分支语句。
(2)熟悉循环控制结构,会使用while循环。
(3)程序中结合range函数、列表等,完成for循环处理。
(4)根据程序逻辑需要,灵活应用break和continue语句跳出循环体。
(5)学会正确使用Python缩进,标识不同的逻辑代码块。
教学重点
(1)if分支结构的用法;
(2)while循环结构的用法;
(3)for循环结构的用法;
(4)range()函数产生数字序列;
(5)break、continue关键字退出循环。
教学难点
(1)循环的处理流程;
(2)循环的嵌套使用;
(3)break、continue的区别。
教学准备
(1) 教材:《Python程序设计项目教程--从入门到实践》
(2) 学习平台:超星Python教学平台或职教云Python教学平台
(3) 硬件设备:装有Python开发环境的计算机;
(4)教学资源:课件PPT、实训指导书
32
学科网(北京)股份有限公司
教学过程
教学环节
教学内容与过程
(教学内容、教学方法、组织形式、教学手段)
课前组织
(1)在学习平台上发布微课视频让同学们预习;
(2)在学习平台上发布上课使用的PPT;
(3)在学习平台上发布实训指导书;
(4)在学习平台上发布本次课程学习成果检验题目。
课程内容描述
【情景导入】
· 为了鼓励学生更好完成学业、践行历史使命,某学院设立了奖学金,制定了评选标准进而表彰优秀学生。
· 在实际项目开发过程中,需要根据不同的条件执行不同的功能,也可能需要重复多次执行某些功能,这就需要控制程序的流程。
· 本项目将引入程序流程控制语句,根据学生课程成绩及评审条件,评定多位学生的奖学金。
· 按照“由易到难、逐步完善”的思路,将奖学金评定项目分解为3个任务:
【任务3.1 if语句评定单个学生的奖学金】
【任务分析】
· 为营造良好的学习氛围,某学院决定将根据学生Python和Database两门课程的成绩情况,评定学院奖学金。假定评审规则如下:
· 单科成绩大于等于90分,总成绩大于185分,一等奖学金;
· 单科成绩大于等于85分,总成绩大于175分,二等奖学金;
· 单科成绩大于等于80分,总成绩大于165分,三等奖学金;
· 不满足上述条件,则无奖学金。
· 本任务要求用户从键盘输入某同学成绩,根据评审规则评定其奖学金等级,需要完成的具体工作内容如表所示。
3.1.1 if 单分支语句
· 程序设计中遇到根据某个条件,决定是否执行某个动作(功能)的情况时,需要使用if单分支语句,其语法结构为:
if 条件表达式:
代码块1
· if 关键字后附带一个条件表达式,如该条件成立则执行代码块1中的语句,然后执行后面的语句;如果条件不成立,则忽略代码块1,直接执行后面的语句。
· Python课程期末考试以60分为合格线,成绩合格则给出相应的提示,实现代码如下:
# 3_1_if单分支语句示例.py
score=72
if score >= 60: # 如果条件成立,则执行下面一行代码
print("恭喜,通过了Python课程考核!") # 打印提示信息
print("程序结束!") # 最后执行该行代码
· if 后面的条件表达式使用关系运算符“==”或“!=”书写,示例如下:
# 3_2_使用关系运算符构建条件表达式.py
# 使用双等号“==”书写条件表达式
subject='Python'
if subject == 'Python': # 判断科目subject是否为Python,返回一个布尔值
print('欢迎参加Python课程学习。') # if条件判断结果为真,执行该语句
# 使用“!=”书写条件表达式
score=100
if score != 100: # 判断分数score是否为100分
print('您没有考满分,仍有提升空间!')
· if 后面的条件表达式使用成员运算符“in”或“not in”书写,示例如下:
# 3_3_使用成员运算符构建条件表达式.py
# 使用“in”书写条件表达式
if "P" in "Python": # 判断 "P"是否在 "Python"中
print("字符'P'在'Python'字符串中。")
# 使用“not in”书写条件表达式
if 50 not in [10, 20, 30]: # 判断50是否在列表 [10, 20, 30]中
print("数值50不在 [10, 20, 30]列表中。")
3.1.2 避免缩进错误
· 在书写 if 分支语句时需要注意使用“缩进”。处理文档时,使用缩进来展示逻辑结构;比如下面的目录中,通过缩进2个空格方式,说明不同内容之间的逻辑关系(上下级关系、同级关系),使其结构更加清晰。
第3章 程序流程控制语句
第1节 条件分支语句
1.1 单分支语句
1.2 双分支语句
1.3 多分支语句
第2节 循环语句
2.1 for循环语句
2.2 while循环语句
· Python 以“缩进”方式标识不同代码块之间的逻辑关系。下面的代码用于求某个数number的绝对值:
# 3_4_1使用缩进标识不同代码块.py
number = -5
if number < 0: # 判断数字number是否为负数
print("数值为负数,需要转变为正数!") # 满足if条件执行的代码段
number = -number # 满足if条件执行的代码段
print("输出结果为:",number) # 无论if条件是否成立都要执行的代码段
· 注意:缩进是Python代码的组成部分,有一些特殊的要求。
· (1)顶级代码必须顶格写(3-4示例中第2、第3、第6行),即如果一行代码本身不依赖于任何条件,则不能进行任何缩进;
· (2)同一级别的代码,缩进必须一致;如第4行、第5行代码,属于同一个级别、同一个逻辑代码块,其缩进一致;
· (3)官方建议使用4个空格作为缩进。
· 常见的缩进错误:
· (1)忘记缩进
number = -5
if number < 0:
print("数值为负数,需要转变为正数!")
number = -number
print("输出结果为:",number)
· 忘记缩进也可能不报错,但可能会引起程序逻辑错误,不能产生期望的结果。
number = 5
if number < 0:
print("数值为负数,需要转变为正数!")
number = -number
print("输出结果为:",number)
· (2)不必要的缩进:可能导致程序报错
number = 5
if number < 0:
print("数值为负数,需要转变为正数!")
number = -number
print("输出结果为:",number)
· 不必要的缩进也可能并不会报错,但是却得不到正确的输出结果
number = 5
if number < 0:
print("数值为负数,需要转变为正数!")
number = -number
print("输出结果为:",number)
· (3)其它错误的缩进
number = 5
if number < 0:
print("数值为负数,需要转变为正数!")
number = -number
print("输出结果为:",number)
3.1.3 多个判断条件
· 在 if 语句的条件表达式中结合关键字“and”、“or”实现多条件组合判断。
· (1)“条件A and 条件B”,表示两个条件A、B同时成立时,其结果为True,否则为False;示例如下:
# 3_5_使用and连接条件表达式.py
subject='Python'
score = 92
if subject == 'Python' and score >= 90: # 判断科目是否为Python并且分数是否大于等于90
print('您的Python课程成绩优秀!') # 两个条件都成立,执行该语句、打印输出
· 在 if 语句的条件表达式中结合关键字“and”、“or”实现多条件组合判断。
· (2)“条件A or 条件B”,表示两个条件A、B同时成立时,其结果为True,否则为False;示例如下:
# 3_6_使用or连接条件表达式.py
today='Sunday'
if today=='Saturday' or today=='Sunday': # 判断today是否为Saturday或Sunday
print('今天是周末,可以休息一下了!') # 两个条件只要有一个为真,执行该语句、打印输出
3.1.4 if-else双分支语句
· Python将if语句和else语句联合使用,组成if-else双分支语句,可同时处理满足条件和不满足条件两种情况。
· 语法结构:
if 条件表达式: # 条件表达式结果为“真”(True),执行代码块1;
代码块1
else: # 条件表达式结果为“假”(False),执行代码块2;
代码块2
· 当 if 条件成立(判断结果为“True”)时,执行代码块1,完毕后继续执行后面的语句;
· 当 if 条件不成立(判断结果为“False”)时,执行代码块2,完毕后继续执行后面的语句。
· 例:为某门课程考试成绩设置60分及格线,考虑及格、不及格两种情况,打印不同的信息。
· 代码如下:
# 3_7_if-else双分支语句示例(1).py
score=82
if score>=60 : # 判断分数score是否大于等于60分
print('恭喜,您已通过考试!') # if条件判断的结果为真,执行该语句
else:
print('遗憾,您未通过考试!') # if条件判断的结果为假,执行该语句
· 例:判断一个数是奇数还是偶数从而输出不同的结果。
· 代码如下:
# 3_8_if-else双分支语句示例(2).py
num=2022
if num % 2 == 0: # 判断num是否能被2整除
print(num,'是一个偶数') # if条件返回值为真,执行该语句
else:
print(num,'是一个奇数') # if条件返回值为假,执行该语句
· 注意:if-else双分支语句需要注意以下语法规则:
· (1)if 条件和 else 后面要有冒号“:”;
· (2)合理使用缩进,以便区分不同的代码块。
3.1.5 if-elif-else多分支语句
· Python提供了 if-elif-else 多分支结构,从而能够对多种情况做出不同的处理。
· 语法结构:
if 条件表达式1: # 如条件表达式1成立,执行代码块1;否则跳转到“elif 条件表达式2”
代码块1
elif 条件表达式2: # 如条件表达式2成立,执行代码块2;否则跳转到“elif 条件表达式3”
代码块2
elif 条件表达式3:
代码块3
......
else:
代码块n
代码块m
· 首先判断条件表达式1是否成立,如果成立则执行代码块1,执行完毕后跳转到代码块m。如条件1不成立,则继续判断条件表达式2;当条件表达式2成立时,则执行代码块2,执行完毕后跳转到代码块m。以此类推,如果所有条件均不成立,最后执行else下面的代码块n,然后跳转到代码块m。多分支语句的执行流程如图所示:
· 例:根据学生成绩,划分考核等级:优秀(90分-100分)、良好(80分-90分)、中等(70分到80分)、及格(60分-70分)、不及格(0分-60分);用多分支语句实现成绩等级的判断。
· 代码如下:
# 3_9_if-elif-else多分支语句示例.py
score=87
if score>=90 and score<=100: # 判断分数score是否在90-100之间
print('考试成绩优秀') # 满足判断条件则执行该语句
elif score>=80 and score<90: # 不满足上述条件,继续判断分数是否在80—90之间
print('考试成绩良好')
elif score>=70 and score<80 : # 不满足上述条件,继续判断分数是否在70—80之间
print('考试成绩中等')
elif score>=60 and score<70: # 不满足上述条件,继续判断分数是否在60—70之间
print('考试成绩及格')
else: # 上述条件都不满足,执行else后面的语句
print('考试成绩不及格')
3.1.6 if 语句嵌套
· 在编写程序时,可以根据实际需求选择合适的if条件分支语句。
· 简单的条件判断,可以使用if单分支语句;
· 如果程序需要考虑两种条件判断的结果,使用if-else双分支语句;
· 如果程序需要根据多个判断条件做出不同反应,使用if-elif-else多分支语句;
· 如果程序逻辑比较复杂,可以嵌套使用 if 语句。
· 所谓if语句嵌套,是指在一个if语句内部嵌套另外一个if语句。
· 例:某血液采集中心允许献血的条件为:(1)男性体重大于50kg,年龄在18-60周岁;(2)女性体重大于45kg,年龄在18-55周岁。
· 编程分析:献血对象有男性和女性两个群体,使用if-else双分支语句把两个群体分开处理;接下来在每一个群体内部,通过嵌套if语句设置本群体的献血条件。实现的代码如下。
# 3_10_if语句嵌套使用示例.py
gender = '女'
weight = 55
age = 24
if gender == '女': # 判断性别gender是否为女
if weight>=45 and 18<=age<=55: # 判断体重weight和年龄age是否满足女性的献血条件
print('该女士可以献血。')
else:
print('该女士条件不满足,不允许献血。')
else: # 性别gender为男
if weight>=50 and 18<=age<=60: # 判断体重weight和年龄age是否满足男性的献血条件
print('该男士可以献血。')
else:
print('该男士条件不满足,不允许献血。')
【任务3.2 while/for循环评定多个学生的奖学金】
【任务分析】
· 前述任务中,使用 if 多分支语句完成了某个学生奖学金的评定。现实生活中,可能会有多个学生参与奖学金的评定;因此,本任务中尝试评定N个学生的奖学金(N由用户从键盘输入),需要完成的具体工作内容如表所示。
3.2.1 while循环语句
· 程序设计中会遇到需要反复执行某功能(代码块)的情况。Python引入了while循环和for循环。
· while循环的基本语法格式如下:
while 条件表达式:
循环体(需重复执行的代码块)
· 当该条件表达式为真True(条件成立)时,执行循环体,然后重新判断条件表达式是否成立;如条件成立则再次执行循环体,直到条件表达式为假False时,不再执行循环体中的代码块、退出循环。执行流程如图所示。
· 例:使用while循环计算1—100内所有整数之和。
· 代码如下:
# 3_11_while循环语句示例(1).py
total=0 # 定义total变量存放累加结果,赋初始值为0
i=1 # i变量表示1到100内的数值,赋初始值为1
while i<=100: # 循环判断条件为i<=100,若条件成立,则执行下面两行代码
total=total+i # 将i累加到total中
i=i+1 # 每循环一轮,i的值都加1;然后,返回到第4行继续判断条件是否成立
print('1+2+3+...+100=',total)
· 例:使用while循环计算1—100内所有整数之和。
· 引入一个标记变量flag作为执行循环的控制信号;当flag为True时,执行循环体,改写上述示例代码如下:
# 3_12_while循环语句示例(2).py
total=0
i=1
flag=True # 设置flag变量的取值为真
while flag: # flag取值为真时,反复执行循环体中的操作
total=total+i
i=i+1
if i>100: # 当i>100时,改变flag变量的值为假,从而终止循环
flag=False
print('1+2+3+...+100=',total)
· 例:猜数字。预先设定一个整数数字,用户共有5次机会猜数字,猜对或猜错具有相应提示。
分析该程序的循环条件为:只有5次机会猜数字;循环体中执行以下两个操作:
· (1)用户从键盘输入猜测的数字,并将字符串数字转换为整型数字。
· (2)用户输入的数字和预先设定的数字进行比较,根据不同的情况输出不同结果。
· 具体代码如下:
# 3_13_while循环语句示例(3).py
key = 10 # 预先设定待猜测的数字
i = 5 # 剩余的机会次数
while i>0: # 循环条件:剩余的机会大于0次
guess = int(input("请输入你猜测的数字:")) # 用户输入猜测的数字并转换为整型
if guess == key: # 判断用户输入的数字和key是否相等
print("恭喜你,答对了!")
elif guess < key:
print("猜小了!")
else:
print("猜大了!") # 用掉一次机会,i减少1
3.2.2 for循环语句
· 程序设计中会遇到需要反复执行某功能(代码块)的情况。Python引入了while循环和for循环。for 循环的基本语法格式如下:
for 变量 in 可迭代对象:
循环体(需重复执行的代码块)
· 所谓可迭代对象是指元素可以单独提取出来的对象,如字符串、列表、元组、字典、集合等都是可迭代对象。
· for循环每执行一轮,就从可迭代对象中读取一个元素,然后赋值给变量,进而执行循环体中的代码;直到读取完可迭代对象的所有元素为止,不再循环。
· for循环语句的循环次数是确定的。
· 运行流程如图所示:
· 例:字符串“Python”是由“P”、“y”、“t”、“h”、“o”、“n”六个字符元素组成,使用for循环遍历字符串“Python”,打印其字符元素:
for char in "Python": # 遍历字符串中的每一个数据元素,并赋值给变量char
print(char) # 执行打印操作
· 例:列表也是可迭代对象,也可以采用类似的方法遍历列表,打印其中的元素。
>>> list1 = [1,-3,-4,7,-9,10]
>>> for i in list1: # 遍历列表中的每个数据元素并赋值给变量i
print(i) # 执行打印操作
· 例:在循环体中执行更复杂的操作。求列表list1的元素绝对值并打印。
# 3_14_for循环语句示例(1).py
list = [1,-3,-4,7,-9,10]
for i in list: # 遍历列表中的每个数据元素,并赋值给变量i
if i < 0: # 判断i的取值是否为负数
i = -i # i的取值为负数则转变为正数
print(i) # 打印变量i的结果
· 例:借助for循环,求列表[1,2,3,4,5]的所有元素之和。
# 3_15_for循环语句示例(2).py
total=0 # 定义存放累加结果的变量total,赋初始值为0
list = [1,2,3,4,5]
for num in list: # 遍历列表中的每个数据元素,并赋值给变量num
total=total+num # 累加求和
print(total) # 打印最终累加求和的结果
· 如果求“1+2+3+4+...+99+100”的值,可以借助Python内置的range()函数,快速生成一个整数序列。
>>>range(0,10) # 生成一个0到9的整数数字序列:0 1 2 3 4 5 6 7 8 9
range(0, 10)
>>>range(10) # 默认情况下从0开始生成数字序列,等价于range(0, 10)
range(0, 10)
>>>range(5,10) # 生成一个5到9的序列:5 6 7 8 9
range(5, 10)
· 对于range(m,n)函数而言,其产生的数字序列为“m,m+1,m+2,...n-2,n-1”,并不包括尾数n。
· 对于range()函数生成的序列,无法直接观察其元素;但可以将for循环语句和range()函数结合使用,遍历查看range()函数生成的数字序列,代码如下:
>>>for i in range(1,5): # 遍历数字序列中的每个数据元素,并赋值给变量i
print(i) # 执行打印操作
· 利用range()函数,即可完成“1+2+3+4+...+99+100”的运算。代码如下:
# 3_16_for循环语句示例(3).py
total=0 # 定义存放累加结果的变量total,赋初始值为0
for i in range(1,101): # 遍历1到100的数据序列
total=total+i # 累加求和
print('1+2+3+...+100=',total)
· 利用for循环语句编写猜数字小游戏,规则不变。代码如下:
# 3_17_for循环语句示例(4).py
key = 10 # 预先设定待猜测的数字
for i in range(5): # 循环条件:i变量依次遍历数字序列0 1 2 3 4,表示共有5次猜数字机会
guess = int(input("请输入你猜测的数字:")) # 用户从键盘输入猜测的数据,并转换为整型
if guess == key: # 判断用户输入的数字和预先设定的数字是否相等
print("恭喜你,答对了!")
elif guess < key: # 判断用户输入的数字是否小于预先设定的数字
print("猜小了!")
else: # 用户输入的数字大于预先设定的数字,执行else后面的语句
print("猜大了!")
3.2.3 循环的嵌套
· 循环语句嵌套,即一个循环体中,包含另外一个循环。
· 例:有黄瓜、西红柿、白菜、土豆、四季豆5种蔬菜,有牛肉、猪肉、鸡肉3种肉类,任意搭配可以做出哪些一荤一素的菜肴?
· 数学中的“排列组合”可以解决这一问题:首先在5种蔬菜中依次选择出一种蔬菜,接下来对于每种蔬菜,在3种肉类中依次选择出一种肉类与之匹配,如图所示:
· 用Python程序模拟这一过程,需要两层循环结构。代码如下:
# 3_18_循环的嵌套示例.py
vegetables = ["黄瓜","西红柿","白菜","土豆","四季豆"]
meat =["牛肉","猪肉","鸡肉"]
for i in vegetables: # 遍历vegetables,每次取出一种蔬菜
for j in meat: # 遍历meat,每次取出一种肉类
print(i, "炒", j)
【任务3.3 循环的控制break/continue】
【任务分析】
· 在批量评审奖学金过程中,也可以评定完一名同学后,询问评审员“是否继续评定下一位?”,给予评审员更多的自主权;若评审员决定“不继续评定”,则程序停止;若评审员决定“继续评定”,则继续评审下一位同学的奖学金等级。本项任务需要完成的具体工作如表所示:
· 对于 while 循环和 for 循环,在满足循环条件的情况下会重复执行循环体中的代码,直到不满足循环条件才终止。
· Python 还提供了在满足循环条件下,根据实际需要提前跳出循环的 break和 continue 语句,从而使得循环结构变得更加灵活。
3.3.1 break 语句
· 在循环执行过程中,如需要中途强行跳出并结束循环,可使用break语句。
· 例:通过循环让用户不断输入喜欢的城市名字,并打印出相关信息,直到用户输入“quit“为止。代码如下:
# 3_19_循环中使用break示例(1).py
while True: # 循环条件永远成立
city=input('请输入你喜欢城市名字(输入quit退出程序):')
if city=='quit': # 如果用户输入“quit”
break # 使用break跳出循环体
else: # 只要用户没有输入“quit”,打印相关信息,然后进入下一轮循环
print('我喜欢的城市:', city)
· 使用 for 循环依次打印列表 [2,4,6,8,9,10,12] 中的元素,遇到奇数就停止打印。代码如下:
# 3_20_循环中使用break示例(2).py
list1 = [2,4,6,8,9,10,12]
for i in list1: # 遍历列表中的每个数据元素并赋值给变量i
if i % 2 != 0: # 判断变量i是否为奇数
break # 变量i为奇数则跳出循环体,不再执行剩余代码
print(i) # 变量i为偶数则执行打印操作
· 借助break语句,升级猜数字小游戏,使之更具交互性:用户每猜测一次数字,程序向用户询问是否继续(是-Y、否-N);若用户输入Y则游戏继续,否则使用break语句跳出循环体、游戏结束。
· 代码如下:
# 3_21_循环中使用break示例(3).py
key = 10 # 预先设定待猜测的数字
for i in range(5): # 循环条件:i变量依次遍历数字序列0 1 2 3 4,共有5次猜数字机会
guess = int(input("请输入你猜测的数字:"))
if guess == key:
print("恭喜你,答对了!")
break #猜对的情况下,直接退出循环、游戏结束
elif guess < key:
print("猜小了!")
else:
print("猜大了!")
choice = input("请问是否需要继续游戏? 是-Y 否-N:")
if choice == "Y" and i != 4: # 判断用户输入"Y" ,并且i不为4(还有竞猜机会)
print("游戏继续") # if条件成立则游戏继续
else: # 不满足if条件则使用break跳出循环结构
print("退出游戏")
break # 直接退出循环、游戏结束
3.3.2 continue 语句
· continue语句用于立即结束本轮循环,提前进入下一轮循环。
· 例:打印列表[2,4,6,8,9,10,12]中的所有偶数元素,选择for循环与continue语句相结合完成该任务。代码如下:
# 3_22_循环中使用continue示例.py
nums= [2,4,6,8,9,10,12]
for i in nums: # 遍历列表中的每个数据元素并赋值给变量i
if i % 2 != 0: # 判断变量i是否为奇数
continue # 变量i为奇数,则退出本轮循环,执行下轮循环
print(i) # 变量i为偶数则执行打印操作
总结评价
分支和循环改变了Python程序只能自上而下执行的逻辑,从而为解决更加复杂的问题提供了可能。在“评定奖学金”项目中,我们借助if-elif-else多分支结构,根据两门课程的成绩,完成单个同学奖学金的评定;为了应对多人奖学金评定问题,引入了while/for循环,从而使得我们能够轻松应对重复执行某些操作的问题。为了提高程序的友好性,每评定完一名学生的奖学金后,询问是否继续评定下一位;如用户不再继续评定,则使用break语句退出循环。利用好上述程序流程控制语句,我们就能够实现相对复杂的算法,为真实项目实战奠定基础。
$$