一、分支结构
(一)单分支语句
只有 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)
(三)多分支语句
if-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-else结构之间的嵌套,也可以是if-else结构中嵌套if-elif-else结构,要注意:缩进效果应该与嵌套关系保持对应。
为了程序可读性,多分支更建议使用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循环是while循环的特例,Python中没有直接可用的直到型循环(可以用while循环间接实现类似于C语言的do-while结构一类的直到型循环)
(2)循环体要写成语句块的缩进形式
(3)允许循环嵌套
(4)可以使用break和continue语句改变循环的执行流程
(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),三个参数分别代表初值、终值和步长,并且产生的序列中不包含终值,例如:
ls1=range(1,5,1) type(ls1) ls2=list(ls1) ls2
说明:①range函数产生的不是一个列表对象,而是一个惰性可迭代对象,需要使用list()转换成列表对象才能查看其元素。
②近似看成是一个左闭右开的区间,其中不包含终值。
③当初值省略时,表示初值为0;当步长省略时,表示步长是1。
④当初值小于终值时,步长必须为正;当初值大于终值时,步长必须为负,这样序列中的元素个
数=abs(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循环
哨兵是在循环算法中用来标志终止条件的值(本例中产生的随机数不可能是0,因此把0作为了哨兵值!)
#使用哨兵循环 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语句后的其他语句)而马上开始本层的下一次循环(例如数7游戏:7的倍数以及含有7的数字都不能读出/输出)。
else子句只在有break语句出现在循环体的情况下才有意义,用于当循环正常退出时的处理,而当经由break提前退出时则不会执行else子句。
使用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语句的使用。
判断素数改进算法:
为提高效率,利用了平方根判别法并允许多次判别
注意break、continue语句以及for循环的else子句在本例的使用
注意永真的while循环的使用
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'退出):")