目录

一、分支结构

(一)单分支语句

(二)双分支语句

(三)多分支语句

(四)嵌套的分支语句

二、循环结构

循环结构概述

(一)for循环

(二)while循环

(三)break、continue语句与else子句

三、异常处理

(一)try-except-else-finally结构

(二)异常处理示例


一、分支结构

(一)单分支语句

只有 if 子句,但注意分支条件后的冒号(:)
如果分支只有一条语句,则可以写在一行上;
如果分支有多条语句,需要写成缩进的语句块。

score=90if score>=90: print("优秀!")if score>=90:print("优秀!")print("不要骄傲!")

(二)双分支语句

使用 if-else 子句,两个子句的语句或语句块都要采用缩进写法。

score=70if score>=60:print("通过测试")else:print("未通过测试")

双分支下的赋值语句存在简化写法:

level="通过测试" if score>=60 else "未通过测试"print(level)

(三)多分支语句

if-elif-else 子句:每个子句中的语句或语句块都要采用缩进写法。
必须有一个if子句,可以根据需要有多个elif子句;
最多可以有一个else子句,也可以没有else子句;
满足哪个分支的条件就执行哪个,哪个都不满足则所有分支都不执行。

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

没有else分支语句:

score=85if 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=75if score>=60:if score>=70:if score>=80:if score>=90:print("优秀")else:print("良好")else:print("中等")else:print("及格")else:print("不及格")

score=75if 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=0for i in [1,3,5,7,9]:sum+=iprint(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 randintnum=randint(1,100)#要猜的随机数count=0#统计猜中次数contin='y'#是否继续猜测的标志变量while contin=='y':guess=int(input("请输入你猜的数字:"))if guess==num:print("恭喜猜中了")count+=1num=randint(1,100)elif guess>num:print("猜大了")else:print("猜小了")contin=input("要继续吗(y/n)" />

说明:①本例使用while循环模拟了C语言中的do-while循环,因为循环体至少执行了一次。
②存在的问题:用户既要输入y/n,又要输入数字,考虑使用哨兵循环进行简化。

2、带有哨兵的while循环

哨兵是在循环算法中用来标志终止条件的值(本例中产生的随机数不可能是0,因此把0作为了哨兵值!)

#使用哨兵循环from random import randintnum=randint(1,100)#要猜的随机数guess=int(input("请输入你猜的数字(输入0退出):"))count=0#统计猜中次数while guess:if guess==num:print("恭喜猜中了")count+=1num=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))breakelse:passif i==n-1: print("{}是素数".format(n))

方法二:

#一种通过修改循环控制条件而避免使用break的写法n=int(input("请输入一个整数(>1):"))if n==2:print("{}是素数".format(n))else:i=2while i<n and n%i!=0:i+=1if 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 mathwhile True:m=input("请输入一个大于1的整数(按'q'退出):")if m=='q':print("程序结束!")breakelif m.isalpha():print("你输入的不是大于1的整数,请正确输入!")continuen=int(m)k=int(math.sqrt(n))for i in range(2,k+1):#可验证次循环对2也适用if n % i ==0:print("{}不是素数".format(n))breakelse: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'退出):")