Python中的流程控制语句 Python中的流程控制语句
摘要
本文详细介绍了程序设计中的分支结构、循环结构及异常处理机制。在分支结构中,讨论了单分支、双分支(包括if-else)、多分支(if-elif-else)及嵌套使用方法;并强调了条件判断语句的正确应用及对缩进要求的关注。循环结构方面,分析了for循环与while循环的区别与适用场景,并探讨了如何利用break和continue语句实现程序流程控制;特别提到else子句在正常退出时的特殊用途。此外,文章还结合实例说明了异常处理的重要性及其在提高程序健壮性中的作用,通过try-except-finally框架展示了如何优雅地捕捉并处理运行时错误。
目录
一、分支结构
(一)单分支语句
(二)双分支语句
(三)多分支语句
(四)嵌套的分支语句
二、循环结构
循环结构概述
(一)for循环
(二)while循环
(三)break、continue语句与else子句
三、异常处理
(一)try-except-else-finally结构
(二)异常处理示例
一、分支结构
(一)单分支语句
只有 if 子式结构,在处理单个指令时可将其置于同一行;
而涉及多个指令时,则需采用分层的形式进行编排。
score=90
if score>=90: print("优秀!")
if score>=90:
print("优秀!")
print("不要骄傲!")

(二)双分支语句
使用 if-else 子句,两个子句的语句或语句块都要采用缩进写法。
score=70
if score>=60:
print("通过测试")
else:
print("未通过测试")

双分支下的赋值语句存在简化写法:
level="通过测试" if score>=60 else "未通过测试"
print(level)

(三)多分支语句
如果- elif - else 语句结构中要求每个嵌套语句块必须采用缩进书写方式。
该结构必须包含至少一个 if 语句;而可选多个 elif 子句;最多可选择一个 else 子句(也可以选择不添加 else 子串)。
当任何一个分支条件得到满足时,则会执行相应的代码块;若所有分支均不满足条件,则整个结构不会执行任何代码块。
score=85
if score>=90:
print("优秀")
elif score>=80:
print("良好")
elif score>=70:
print("中等")
elif score>=60:
print("及格")
else:
print("不及格")

没有else分支语句:
score=85
if score>=90:
print("优秀")
elif score>=80:
print("良好")
elif score>=70:
print("中等")
elif score>=60:
print("及格")
elif score<60:
print("不及格")

(四)嵌套的分支语句
包括层次化设计在内的多种嵌套方式均需遵循缩进层级匹配一致性原则
为了提升代码可读性和优化逻辑清晰度,在复杂逻辑处理方面应优先采用if-elif-else结构以减少不必要的嵌套
score=75
if score>=60:
if score>=70:
if score>=80:
if score>=90:
print("优秀")
else:
print("良好")
else:
print("中等")
else:
print("及格")
else:
print("不及格")

score=75
if score>=60:
if score>=90:
print("优秀")
elif score>=80:
print("良好")
elif score>=70:
print("中等")
else:
print("及格")
else:
print("不及格")

二、循环结构
循环结构概述
当循环的上限明确,则采用for结构更为简便。
(1)任何情况下都可以使用while循环实现控制逻辑;对于for循环而言,则是一种更为直接的形式。
(2)在编写代码时,请注意以下几点:第一,在编写代码时,请确保所有条件判断均位于控制结构内部;第二,在编写代码时,请尽量避免不必要的变量声明;第三,在编写代码时,请尽量避免重复声明同一变量。
(3)为了提高代码效率,在实际应用中建议尽可能减少嵌套层次;
(4)建议尽量避免手动设置断点;
(5)else子句则用于在正常退出后进行额外操作。
(一)for循环
一般形式:
for 当前元素 in 可迭代对象:
循环体语句或语句组
描述一种处理可迭代对象的方法:依次取出每个元素,在循环体内对每个元素进行特定操作;直到所有元素均被处理完毕为止。具体包括:字符串、列表、元组、字典、集合等容器类对象;以下分别以字符串和列表为例进行说明:对于字符串类型的数据来说,这类似于逐字符遍历;而对于列表类型的数据,则是逐项遍历。
for ch in 'hello':
print("当前字符是{}".format(ch))

sum=0
for i in [1,3,5,7,9]:
sum+=i
print(sum)

常用于for循环的range函数:
大致上可以认为range函数用于生成一个整数序列。它具有以下基本形式:range(start, stop, step),其中参数分别表示起始值、终止值以及步长;生成的序列中不包含终止值。其中参数分别表示起始值、终止值以及步长;生成的序列中不包含终止值。例如:当start=5, stop=15, step=2时,默认情况下该函数会生成[5,7,9,11,13]这个序列作为结果输出。
ls1=range(1,5,1)
type(ls1)
ls2=list(ls1)
ls2

①range函数创建的是一个惰性可迭代对象,在未转换为列表之前无法查看其元素。
②该区间可以视为左闭右开区间,在这种情况下终值不会被包含在内。
③当初值未被指定时,默认初值为0;如果步长未被指定,则默认步长为1。
④当初始值小于终值时,必须使用正步长才能生成序列;如果初始值大于终值,则必须使用负步长才能生成序列。此时序列的元素个数等于abs( (终值-初值) // 步长 ) 的绝对值大小。如果不满足这一条件,则生成为空序列!
list(range(5))

list(range(5,1,-1))

list(range(5,1,1))

(二)while循环
在满足特定条件时执行循环体; 适用于无法预先确定循环次数的情形,如交互式输入场景。
1、没有哨兵的while循环
#没有使用哨兵循环
from random import randint
num=randint(1,100) #要猜的随机数
count=0 #统计猜中次数
contin='y' #是否继续猜测的标志变量
while contin=='y':
guess=int(input("请输入你猜的数字:"))
if guess==num:
print("恭喜猜中了")
count+=1
num=randint(1,100)
elif guess>num:
print("猜大了")
else:
print("猜小了")
contin=input("要继续吗(y/n)? ")
print("游戏结束,你猜中了{}次".format(count))

①本例采用while循环来模仿C语言中的do-while循环机制。其特点在于确保循环体至少执行一次。
②存在的问题是用户必须同时输入'y'/'n'以及数字类型的信息。这种需求可能带来操作上的不便。
为了简化操作流程, 可以考虑引入哨兵变量来代替重复的条件判断逻辑。
2、带有哨兵的while循环
在循环算法中使用sentinel value来判断终止条件(由于本例中的随机数值不会为零,在此情况下我们选择将0作为sentinel value采用。)
#使用哨兵循环
from random import randint
num=randint(1,100) #要猜的随机数
guess=int(input("请输入你猜的数字(输入0退出):"))
count=0 #统计猜中次数
while guess:
if guess==num:
print("恭喜猜中了")
count+=1
num=randint(1,100)
elif guess>num:
print("猜大了")
else:
print("猜小了")
guess=int(input("请输入你猜的数字(输入0退出):"))
print("游戏结束,你猜中了{}次".format(count))

①应将无法在正常情况下获取到的数值设定为哨兵值。
②必须在循环启动之前对哨兵变量进行初始化;其初始值需根据具体情况确定(例如,在处理字符串问题时可设为空字符串)。
③为了防止死循环现象的发生;循环体中必须包含更新哨兵变量的语句。
④此例属于典型的While型循环结构;因其特点在于可能一次都不会执行其内部语句。
(三)break、continue语句与else子句
有两类途径可使程序从循环结构中退出:一类是在程序流程的自然出口处依循正常程序运行而终止;另一类则是通过提前施加break语句指令来终止当前循环体的执行。
break语句将提前终止当前层次的循环。特别提示:当代码中出现嵌套的循环结构时,则不会提前退出外部循环体。
使用continue语句可以提前终止当前循环,并跳过后续的所有指令;从而执行完本次循环后立即执行本层循环的下一条指令。比如,在数字处理中使用continue语句时会跳过所有与条件相关的数值处理。
否则子句仅在循环体内包含 break 语句的情况下才发挥作用,在这种情况下用于处理循环正常结束的情况;如果提前通过 break 退出循环,则不会执行相应的处理。
else结构能够有效优化退出循环后的处理流程,并且该结构单元广泛应用于for及while循环场景中。
判断素数的两种写法:
方法一:
n=int(input("请输入一个整数(>1):"))
if n==2:
print("{}是素数".format(n))
else:
for i in range(2,n):
if n%i==0:
print("{}不是素数".format(n))
break
else:
pass
if i==n-1:
print("{}是素数".format(n))

方法二:
#一种通过修改循环控制条件而避免使用break的写法
n=int(input("请输入一个整数(>1):"))
if n==2:
print("{}是素数".format(n))
else:
i=2
while i<n and n%i!=0:
i+=1
if i<n:
print("{}不是素数".format(n))
else:
print("{}是素数".format(n))

①当n等于2时需要单独处理因为区间range(2,2)为空会导致程序出错。
②循环体内的else子句在此情况下不建议省略这是为了演示pass语句的作用(演示占位功能使代码结构完整但无实际功能)。
③在for循环结束后添加if条件来检测循环是否正常退出这可以通过设置else子句来实现。
④通过将break语句终止条件适当设置为循环终止条件从而无需执行break语句即可实现相同效果。
判断素数改进算法:
为提升效率,在本案例中采用了平方根判别法的同时允许程序进行多次判断
import math
while True:
m=input("请输入一个大于1的整数(按'q'退出):")
if m=='q':
print("程序结束!")
break
elif m.isalpha():
print("你输入的不是大于1的整数,请正确输入!")
continue
n=int(m)
k=int(math.sqrt(n))
for i in range(2,k+1): #可验证次循环对2也适用
if n % i ==0:
print("{}不是素数".format(n))
break
else:
print("{}是素数".format(n))

三、异常应对机制及操作规范
运行期检测到的错误被称为异常
(一)try-except-else-finally结构
以操作文件为例:
try:
启动文件操作
except:
发生错误时会显示提示信息
else:
正常处理文件
finally:
确保资源释放

(二)异常处理示例

未做异常处理的情况会导致程序出现错误信息而无法正常执行。
在存在异常处理的情况下进行操作时的场景下, 程序能够顺利进行并完成任务, 并且这种机制增强了程序的容错能力。
#异常处理示例
m=input("请输入被除数(按'q'退出):")
n=input("请输入除数(按'q'退出):")
while m!='q'and n!='q':
m=int(m)
n=int(n)
try:
print("{}/{}={:.2f}".format(m,n,m/n))
except ZeroDivisionError:
print("除数n不能为0,请重新输入除数")
else:
m=input("请输入被除数(按'q'退出):")
finally:
n=input("请输入除数(按'q'退出):")

