3、程序的循环结构
3.1 程序的循环结构
- Python语言的循环结构包括两种:遍历循环和无限循环。
- 遍历循环使用保留字for依次提取遍历结构各元素进行处理;
- 无限循环使用保留字while根据判断条件执行程序。
3.2 遍历循环: for
- 遍历循环可以理解为从遍历结构中逐一提取元素,放在循环变量中,对于每个所提取的元素执行一次语句块。for语句的循环执行次数是根据遍历结构中元素个数确定的。
for <循环变量> in <遍历结构>: <语句块>
- 遍历结构可以是字符串、文件、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语句只在循环正常执行之后才执行并结束,因此,可以在<语句块2>中放置判断循环执行情况的语句。
for s in "PY": print("循环执行中: " + s) else: s = "循环正常结束" print(s)
>>> 循环执行中: P 循环执行中: Y 循环正常结束
3.3 无限循环: while
Python通过保留字while实现无限循环
while <条件>: <语句块>
- 当程序执行到while语句时,判断条件如果为True,执行循环体语句,语句结束后返回再次判断while语句的条件;当条件为False时,循环终止,执行与while同级别缩进的后续语句。
n = 0 while n < 10: print(n) n = n + 3 ''' 0 3 6 9'''
- 无限循环也有一种使用保留字else的扩展模式,使用方法如下:
while <条件>: <语句块1> else: <语句块2>
- 在这种扩展模式中,当while循环正常执行之后,程序会继续执行else语句中内容。else语句只在循环正常执行后才执行,因此,可以在语句块2中放置判断循环执行情况的语句。
s, idx = "PY", 0 while idx < len(s): print("循环执行中: " + s[idx]) idx += 1 else: s = "循环正常结束" print(s)
>>> 循环执行中: P 循环执行中: Y 循环正常结束
3.4 循环控制: 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退出最内层循环。
- continue用来结束当前当次循环,即跳出循环体中下面尚未执行的语句,但不跳出当前循环。
for s in "PYTHON": if s == "Y" or s == "y": continue print(s, end="")
- continue语句和break语句的区别是:continue语句只结束本次循环,不终止整个循环的执行,而break具备结束循环的能力。
- .
4、程序的异常处理
4.1 程序的异常处理
- Python程序一般对输入有一定要求,但当实际输入不满足程序要求时,可能会产生程序的运行错误。
n = eval(input("请输入一个数字: ")) 请输入一个整数: python Traceback (most recent call last): File "<pyshell#11>", line 1, in <module> n = eval(input("请输入一个数字: ")) File "<string>", line 1, in <module> NameError: name 'python' is not defined
- 由于使用了eval()函数,如果用户输入不是一个数字则可能报错。这类由于输入与预期不匹配造成的错误有很多种可能,不能逐一列出可能性进行判断。为了保证程序运行的稳定性,这类运行错误应该被程序捕获并合理控制。
- Python语言使用保留字try和except进行异常处理,基本的语法格式如下:
try: <语句块1> except: <语句块2>
- 语句块1是正常执行的程序内容,当执行这个语句块发生异常时,则执行except保留字后面的语句块2。
try: n = eval(input("请输入一个数字: ")) print("输入数字的3次方值为: ", n**3) except: print("输入错误,请输入一个数字 !")
>>> 请输入一个数字: 1010 输入数字的3次方值为: 1030301000 >>> 请输入一个数字: python 输入错误,请输入一个数字!
- 除了输入之外,异常处理还可以处理程序执行中的运行异常。
for i in range(5): print(10/i, end=" ") ''' Traceback (most recent call last): File "<pyshell#12>", line 2, in <module> ''' print(10/i, end=" ") ''' ZeroDivisionError: division by zero'''
try: for i in range(5): print(10/i, end=" ") except: print("某种原因,出错了!")
5、实例解析:猜数字游戏
- 编写一个“猜数字游戏”的程序,在1到1000之间随机产生一个数,然后请用户循环猜测这个数字,对于每个答案只回答“猜大了”或“猜小了”,直到猜测准确为止,输出用户的猜测次数。
- 为了产生随机数,需要使用Python语言的随机数标准库random
import random target = random.randint(1,1000)
- 根据程序需求,需要考虑不断地让用户循环输入猜测值,并根据猜测值和目标值之间的比较决定程序逻辑。
import random target = random.randint(1,1000) count = 0 while True: guess = eval(input('请输入一个猜测的整数(1至1000):')) count = count + 1 if guess > target: print('猜大了') elif guess < target: print('猜小了') else: print('猜对了') break print("此轮的猜测次数是:", count)
- 由于使用了eval(input())方式获得用户输入,如果用户输入非数字产生运行错误,程序将会退出。为了增加程序鲁棒性,增加异常处理机制。
import random target = random.randint(1,1000) count = 0 while True: try: guess = eval(input('请输入一个猜测的整数(1至1000):')) except: print('输入有误,请重试,不计入猜测次数哦!') continue count = count + 1 if guess > target: print('猜大了') elif guess < target: print('猜小了') else: print('猜对了') break print("此轮的猜测次数是:", count)
该程序执行效果如下
>>> 请输入一个猜测的整数(1至1000):500 猜大了 请输入一个猜测的整数(1至1000):Python 输入有误,请重试,不计入猜测次数哦! 请输入一个猜测的整数(1至1000):260 猜小了 请输入一个猜测的整数(1至1000):380 猜大了 请输入一个猜测的整数(1至1000):300 猜小了 请输入一个猜测的整数(1至1000):340 猜小了 请输入一个猜测的整数(1至1000):360 猜小了 请输入一个猜测的整数(1至1000):370 猜对了 此轮的猜测次数是: 7
小结
讲解了程序的三种控制结构,具体讲解了分支结构的三种类型:单分支结构、二分支结构合多分支结构,以及判断条件的组合。进一步具体讲解了循环结构的两种类型:遍历循环和无限循环,以及循环控制符break和continue。最后,讲解了程序的基本异常处理方法。通过猜数字游戏的实例帮助大家理解程序结构和异常处理的运用。
猜数字就是人生历程,运气重要?方法重要?或许,快乐的经历才最重要。