三、程序的循环结构
Python语言的循环结构包括两种:遍历循环和无限循环
遍历循环使用了保留字for依次提取遍历结构各元素进行处理:无限循环使用保留字while根据判断条件执行条件。
1、遍历循环:for
Python通过保留字for实现遍历循环,使用方式如下:
for <循环变量> in <遍历结构>:
<语句块>
遍历循环可以理解从遍历结构中逐一提取元素,放在循环变量中,对于每个所提取的元素执行一次语句块。for语句的循环执行次数是根据遍历结构中元素个数确定的。
遍历结构可以是字符串、文件、range()函数或组合数据类型等。
对于字符串,可以逐一遍历字符串的每个字符,基本使用方式如下:
for <循环变量> in <字符串>:
<语句块>
for c in "Python":
print(c)
P
y
t
h
o
n
使用range()函数,可以指定语句块的循环次数,基本使用方式如下:
for <循环变量> in range(<循环次数>):
<语句块>
for i in range(5):
print(i)
0
1
2
3
4
遍历循环还有一种扩展模式,使用方式如下:
for <循环变量> in <遍历结构>:
<语句块1>
else:
<语句块2>
当for循环正常执行之后,程序会继续执行else语句中内容。else语句只在循环正常执行没有被break打断才执行,因此,可以在<语句2>中放置判断循环执行情况的语句。
提示:else奖励
可以把循环中的else语句想象成一种奖励,当程序辛苦地执行完全部循环,没有中途break终止,则额外给予一段程序执行的奖励。示例如下:
for s in "PY":
print("循环执行中:"+s)
else:
s="循环正常结束"
print(s)
循环执行中:P
循环执行中:Y
循环正常结束
2、无限循环:while
Python通过保留字while实现无限循环,基本使用方式如下:
while <条件>:
<语句块>
其中,<条件>与if语句中的判断条件一样,结果为True或False。
n=0
while n<10:
print(n)
n=n+3
0
3
6
9
当程序执行到while语句时,判断条件如果为True,执行循环体语句,循环体语句结束后返回再次判断while语句条件,当条件为False时,循环终止,执行与while同级别缩进的后续语句。
无限循环也有一种使用保留字else的扩展模式,使用方式如下:
while <条件>:
<语句块1>
else:
<语句块2>
在这种扩展模式中,当while循环正常执行之后,程序会继续执行else语句中的内容。else语句只在循环正常执行后才执行,因此,可以在语句2中放置判断循环执行情况的语句。while循环的else语句与for循环的else语句一样,都是循环正常执行结束的“奖励”部分。例如:
s,idx="PY",0
while idx<len(s):
print("循环执行中:"+s[idx])
idx+=1
else:
s="循环正常结束"
print(s)
循环执行中:P
循环执行中:Y
循环正常结束
3、循环控制:break和continue
循环结构有两个辅助循环控制的保留字:break和continue
break用来跳出最内层for或while循环,脱离该循环后程序继续执行循环后续代码。
while True:
s=input("请输入一个名字(按Q退出):")
if s=="Q":
break
print("输入的名字是:",s)
print("程序退出")
请输入一个名字(按Q退出):云朵
输入的名字是: 云朵
请输入一个名字(按Q退出):小草
输入的名字是: 小草
请输入一个名字(按Q退出):Q
程序退出
如果有2层或多层循环,break退出最内层循环。示例如下:
while True:
s=input("请输入一个名字(按Q退出):")
if s=="Q":
break #退出while循环
for c in s:
if c=="E":
break #退出for循环,但不退出while循环
print(c,end="")
print("程序退出")
continue用来结束当前当次循环,即跳出循环体中下面尚未执行的语句,但不跳出当前循环。示例如下。
for s in "PYTHON":
if s=="Y"or s=="y":
continue
print(s,end="")
PTHON
continue语句和break语句的区别是:continue语句只结束本次循环,不终止整个循环的执行,而break结束当前层次的整个循环。
四、程序的异常处理
1、基本异常处理:try-except
Python程序一般对输入有一定要求,但实际输入不满足程序要求时,可能会产生程序的运行错误。示例如下:
n=eval(input("请输入一个数字:"))
请输入一个数字:Sunday
Traceback (most recent call last):
File "C:/Users/user/Desktop/234.py", line 1, in <module>
n=eval(input("请输入一个数字:"))
File "<string>", line 1, in <module>
NameError: name 'Sunday' is not defined
由于使用了eval()函数,如果用户输入的不是一个数字则可能报错。这类由于输入与预期不匹配而造成的错误有很多种,不能逐一列出所有可能性。为了保证程序运行的稳定性,这类运行错误应该被程序捕获并合理控制。
Python语言使用保留字try和except进行异常处理,基本的语法格式如下:
try:
<语句块1>
except:
<语句块2>
语句块1是正常执行的程序内容,当执行这个语句块发生异常时,则执行except保留字后面的语句块2,如下所示。
try:
n=eval(input("请输入一个数字;"))
print("输入数字的3次方值为:",n**3)
except:
print("输入错误,请输入一个数字!")
请输入一个数字;10
输入数字的3次方值为: 1000
请输入一个数字;pen
输入错误,请输入一个数字!
除了输入之外,异常处理还可以处理程序执行中的运行异常。例如:
for i in range(5):
print(10/i,end="")
Traceback (most recent call last):
File "<pyshell#16>", line 2, in <module>
print(10/i,end="")
ZeroDivisionError: division by zero
这段代码中,由于i的初始值为0,10/i实际上是10/0,产生了除以0的情况,Python语言不支持除数为0的操作,产生了ZeroDivisionError运行错误。采用try-except方式可以处理这样的异常情况。
try:
for i in range(5):
print(10/i,end="")
except:
print("某种原因,出错了!")
某种原因,出错了!
2、异常处理类型
仔细观察Python程序的异常错误信息,最后一行给出了异常提醒,其中包含了对异常处理类型的描述,比如NameError、ZeroDivisionError.这些异常处理类型由Python语言定义。
程序也可以结合特定的错误类型进行异常精准处理,在except后指明错误类型,格式如下:
try:
<语句块1>
except<异常处理类型>:
<语句块2>
例如,对于除零错误,可以在except后面增加ZeroDivisionError,仅指定处理此类异常。若希望处理其他异常,可再增加except语句。示例如下:
try:
for i in range(5):
print(10/i,end=" ")
except ZeroDivisionError:
print("除数为零,产生了除零错误!")
except:
print("某种原因,出错了")
除数为零,产生了除零错误!
提醒:异常类型
只要程序可能异常退出,无论哪种类型,都可以用try-except捕捉这种异常,使程序有更好的用户体验。
Python的异常处理机制能够程序运行的可靠性。编写程序时,建议在输入合规性判断、保证关键代码可靠性等方面广泛使用异常处理机制。