《第3章程序控制结构.pptx》由会员分享,可在线阅读,更多相关《第3章程序控制结构.pptx(65页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第3 3章章 程序控制结构程序控制结构董付国董付国微信公众号:微信公众号:PythonPython小屋小屋本章学习目标 理解条件表达式的值与True/False的等价关系 熟练掌握选择结构的语法和应用 熟练掌握for和while循环结构的语法和应用 熟练掌握break和continue语句的作用与应用 熟练掌握异常处理结构的语法和应用 熟练掌握选择结构、循环结构、异常处理结构嵌套使用的语法 养成对用户输入进行有效性检查的习惯3.1 条件表达式 在Python中,几乎所有合法表达式都可以作为条件表达式,包括单个常量或变量,以及使用各种运算符和函数调用连接起来的表达式。 条件表达式的值等价于Tr
2、ue时表示条件成立,等价于False时表示条件不成立。条件表达式的值只要不是False、0(或0.0、0j)、空值None、空列表、空元组、空集合、空字典、空字符串、空range对象或其他空迭代对象,Python解释器均认为与True等价。 等价和相等是有区别的。一个值等价于True是指,这个值作为内置函数bool()的参数会使得该函数返回True。例如,bool(3)的值为True,但很明显3不等于True。3.1 条件表达式 例如,数字可以作为条件表达式,但只有0、0.0、0j等价于False,其他任意数字都等价于True,包括负数。 列表、元组、字典、集合、字符串以及range对象、ma
3、p对象、zip对象、filter对象、enumerate对象、reversed对象等可迭代对象也可以作为条件表达式,不包含任何元素的可迭代对象等价于False,包含任意元素的可迭代对象都等价于True。以字符串为例,只有不包含任何字符的空字符串作为条件表达式时是等价于False的,包含任意字符的字符串都等价于True,哪怕只包含一个空格。3.1 条件表达式values = 3, -3, 0.1, 1e-9, 0, , , , , a, 0, range(0), 0, 5jequivalence = list(zip(values, map(bool, values)print(equivale
4、nce)3.2 选择结构 选择结构根据不同的条件是否满足来决定是否执行特定的代码,根据要解决的问题逻辑不同可以使用单分支选择结构、双分支选择结构或不同形式的嵌套选择结构。3.2.1 单分支选择结构if 条件表达式: 语句块前面的代码条件成立?语句块后面的代码是否3.2.1 单分支选择结构 例例3-1 程序员小明的妻子打电话让小明下班路上买饭回来,原话是“回来路上买10个包子,如果看到旁边有卖西瓜的,买一个”。结果,小明回到家后妻子发现他只买了一个包子,问怎么回事,小明说“我看到卖西瓜的了”。编写程序模拟小明的脑回路。3.2.1 单分支选择结构# 要买的包子数量num = 10flag = in
5、put(有卖西瓜的吗?输入Y/N:)if flag = Y: num = 1print(f实际买的包子数量为:num)3.2.2 双分支选择结构if 条件表达式: 语句块1else: 语句块2前面的代码条件成立?语句块2后面的代码是否语句块13.2.2 双分支选择结构 例例3-2 周五晚上放学时,小明和小强两位同学相约周六的安排,说好如果不下雨就一起打羽毛球,如果下雨就一起写作业。周六早上,两个人根据是否下雨来决定最终要做的事情。编写程序,输入Y表示下雨、N表示不下雨,模拟二人做决定的过程,并输出二人的最终决定。3.2.2 双分支选择结构flag = input(今天下雨吗?输入Y/N:)if
6、 flag = Y: print(一起写作业。)else: print(一起打羽毛球。)3.2.3 嵌套的选择结构if 条件表达式1: 语句块1elif 条件表达式2: 语句块2elif 条件表达式3: 语句块3.else: 语句块n3.2.3 嵌套的选择结构if 条件表达式1: 语句块1 if 条件表达式2: 语句块2 else: 语句块3else: if 条件表达式4: 语句块4 elif 条件表达式5: 语句块5 else: 语句块63.2.3 嵌套的选择结构 例例3-3 防火墙一般指计算机上安装的一种和杀毒软件同样重要的软件,一些重要的服务器或单位还会购买和部署硬件防火墙对网络流量进行
7、筛选和过滤。不论是软件防火墙还是硬件防火墙,都不是买回来安装上就万事大吉了,必须要经过严格的配置才能真正起到防护作用。例如,允许来自哪些IP地址和端口号的数据允许进入本机或本网络,本机哪些端口允许向网络外部传送数据,都必须要进行深思熟虑并严格配置。3.2.3 嵌套的选择结构 小明维护了公司的一台服务器,这台服务器的防火墙规则为:允许IP地址为192.168.1.99的计算机访问服务器的3389端口,其他计算机一律不允许访问服务器的3389端口;允许IP地址为192.168.1.88的计算机访问服务器的1433端口,其他计算机一律不允许访问服务器的1433端口;任意计算机都可以访问服务器的80端
8、口;除了上述明确允许的,其他数据一律不允许进入服务器。编写程序,模拟这个防火墙的工作。3.2.3 嵌套的选择结构host = input(请输入来访的计算机IP地址:)port = int(input(请输入要访问服务器哪个端口:)flag = Falseif host=192.168.1.99 and port=3389: flag = Trueelif host=192.168.1.88 and port=1433: flag = Trueelif port=80: flag = Trueif flag: print(允许进入服务器。)else: print(不允许进入服务器。)3.2.3
9、 嵌套的选择结构 例例3-4 对学生作业或考试进行打分时,一般有百分制和字母等级两种方式。这两种打分标准之间有一定的对应关系,例如90,100区间对应字母A,80,90)区间对应字母B,70,80)区间对应字母C,60,70)区间对应字母D,0,60)区间对应字母F。编写程序,输入一个百分制成绩,输出对应的字母等级。3.2.3 嵌套的选择结构score = float(input(请输入一个百分制成绩:)if score100: print(无效成绩)else: # 如果score本来的值是实数,例如81.5 # 整除10之后得到8.0形式的数字,但不影响后续的计算 score = score
10、 / 10 if score in (9,10): print(A) elif score = 8: print(B) elif score = 7: print(C) elif score = 6: print(D) else: print(F)3.3 循环结构 循环结构根据指定的条件是否满足来决定是否需要重复执行特定的代码,Python中主要有for循环和while循环两种形式。 循环结构可以嵌套,也可以和选择结构以及异常处理结构互相嵌套,来表示更加复杂的业务逻辑。如果使用嵌套循环结构的话,最外层的循环变化最慢,越内层的循环变化速度越快。3.3.1 for循环结构 Python语言中的fo
11、r循环非常适合用来遍历可迭代对象(列表、元组、字典、集合、字符串以及map、zip等迭代器对象)中的元素,语法形式为:for 循环变量 in 可迭代对象: 循环体else: else子句代码块3.3.1 for循环结构 例例3-5 编写程序,输入一个包含若干整数或实数的列表,输出这些数字的平均数(保留最多3位小数)以及大于平均数的数字。3.3.1 for循环结构data = eval(input(请输入包含任意整数或实数的列表:)avg = round(sum(data)/len(data), 3)print(f平均数为:avg)print(大于平均数的数字有:)for num in data
12、: if num avg: print(num, end= )3.3.2 while循环结构while 条件表达式: 循环体else: else子句代码块3.3.2 while循环结构 例例3-6 小明买回来一对兔子,从第3个月开始就每个月生一对兔子,生的每一对兔子长到第3个月也开始每个月都生一对兔子,每一对兔子都是这样从第3个月开始每个月生一对兔子,那么每个月小明家的兔子总数构成一个数列,这就是著名的斐波那契数列,如图3-4所示。编写程序,输入一个正整数,输出斐波那契数列中小于该整数的所有整数。3.3.2 while循环结构3.3.2 while循环结构number = int(input(
13、请输入一个正整数:)# 序列解包,同时为多个变量赋值a, b = 1, 1while a 3 / 0Traceback (most recent call last): File , line 1, in 3 / 0ZeroDivisionError: division by zero# 函数用法不对,传递给函数的参数数量不对# 这时可以使用help(sum)查看一下sum()函数的说明文档 sum(1, 2, 3)Traceback (most recent call last): File , line 1, in sum(1, 2, 3)TypeError: sum() takes at
14、 most 2 arguments (3 given)3.4.1 常见异常表现形式# 函数用法不对,内置函数sorted()必须使用key参数指定排序规则# 正确用法为sorted(111,22,3, key=str) sorted(111,22,3, str)Traceback (most recent call last): File , line 1, in sorted(111,22,3, str)TypeError: sorted expected 1 argument, got 2# 函数用法不对,内置函数sorted()第一个参数必须是位置参数 sorted(iterable=1
15、11,22,3, key=str)Traceback (most recent call last): File , line 1, in sorted(iterable=111,22,3, key=str)TypeError: sorted expected 1 argument, got 03.4.1 常见异常表现形式# 列表是可变的,属于不可哈希对象,不能作为集合的元素 data = 1, 2Traceback (most recent call last): File , line 1, in data = 1, 2TypeError: unhashable type: list# 大
16、括号可以用来定义字典和集合,但不能同时包含“键:值”对和非“键:值”对 data = a:97, b:98, 99, 100SyntaxError: invalid syntax# 变量不存在,这样的情况一般是拼写错误造成的 print(age)Traceback (most recent call last): File , line 1, in print(age)NameError: name age is not defined3.4.1 常见异常表现形式# 文件不存在,这样的情况一般是路径错误或者拼写错误造成的# 还有种可能是Windows操作系统隐藏了真正的扩展名,看到的扩展名并不
17、是真的# 使用字符串表示文件路径时,建议加字母r使用原始字符串,见2.1.3和8.1节 with open(20200121.txt, encoding=utf8) as fp: content = fp.read()Traceback (most recent call last): File , line 1, in with open(20200121.txt, encoding=utf8) as fp:FileNotFoundError: Errno 2 No such file or directory: 20200121.txt3.4.1 常见异常表现形式# 读取文本文件时使用了不
18、正确的编码格式,见8.1节 with open(rC:/Python38/20200120.txt, encoding=utf8) as fp: print(fp.read()Traceback (most recent call last): File , line 2, in print(fp.read() File C:Python38libcodecs.py, line 322, in decode (result, consumed) = self._buffer_decode(data, self.errors, final)UnicodeDecodeError: utf-8 co
19、dec cant decode byte 0 xb6 in position 0: invalid start byte3.4.1 常见异常表现形式# 以w模式打开的文件不能读取其中的内容,见8.1节 with open(20200726.txt, w, encoding=utf8) as fp: print(fp.read()Traceback (most recent call last): File , line 2, in print(fp.read()io.UnsupportedOperation: not readable3.4.1 常见异常表现形式 import sqlite3
20、conn = sqlite3.connect(database.db) sql = SELECT * FROM student WHERE zhuanye=网络工程# 数据库中不存在名为student的数据表# 此时应检查SQL语句是否有拼写错误以及连接的数据库路径是否正确 for row in conn.execute(sql): print(row)Traceback (most recent call last): File , line 1, in for row in conn.execute(sql):sqlite3.OperationalError: no such table:
21、 student3.4.1 常见异常表现形式# 输入的内容包含非数字字符,无法转换为整数 number = int(input(请输入一个正整数:)请输入一个正整数:12,345Traceback (most recent call last): File , line 1, in number = int(input(请输入一个正整数:)ValueError: invalid literal for int() with base 10: 12,345 data = 1, 2, 3, 4, 5# 列表对象没有名为rindex的方法,无法调用 data.rindex(3)Traceback (
22、most recent call last): File , line 1, in data.rindex(3)AttributeError: list object has no attribute rindex3.4.1 常见异常表现形式# Python不支持字符串与整数相加 print(A + 32)Traceback (most recent call last): File , line 1, in print(A + 32)TypeError: can only concatenate str (not int) to str# 不支持对复数计算余数 (3+4j) % (2+1j)
23、Traceback (most recent call last): File , line 1, in (3+4j) % (2+1j)TypeError: cant mod complex numbers.3.4.1 常见异常表现形式# 3(4+5)不能理解为3*(4+5)# 这样写相当于把3当作函数来调用,出错并提示整数对象不可调用 print(3(4+5)Traceback (most recent call last): File , line 1, in print(3(4+5)TypeError: int object is not callable# 字符串漏掉了最后的引号,没有
24、闭合 print(Hello world) SyntaxError: EOL while scanning string literal3.4.1 常见异常表现形式# 集合的大括号没有闭合 print(3,4,5) SyntaxError: closing parenthesis ) does not match opening parenthesis # 在交互模式中每次只能执行一条语句# 这样的错误一般是从文件中复制了多条语句到交互模式中执行造成的 x = 3y = 5SyntaxError: multiple statements found while compiling a sing
25、le statement# 续行符“”后面不能再有代码有效字符 x = 3 + 5 - 2SyntaxError: unexpected character after line continuation character3.4.1 常见异常表现形式 from PIL import Image im = Image.open(1234.jpg)# 调用方法时传递的实参数量不对,此时应使用help(im.getpixel)查看使用说明# 这里正确的用法应该是print(im.getpixel(30,40)# 也就是使用表示横坐标和纵坐标位置的元组(30,40)作为方法getpixel()的参数
26、 print(im.getpixel(30,40)Traceback (most recent call last): File , line 1, in print(im.getpixel(30,40)TypeError: getpixel() takes 2 positional arguments but 3 were given3.4.2 异常处理结构语法与应用(1)try.except.else.finally.try: #可能会引发异常的代码块except 异常类型1 as 变量1: #处理异常类型1的代码块except 异常类型2 as 变量2: #处理异常类型2的代码块.els
27、e: #如果try块中的代码没有引发异常,就执行这里的代码块finally: #不论try块中的代码是否引发异常,也不论异常是否被处理 #总是最后执行这里的代码块3.4.2 异常处理结构语法与应用(2)assert断言assert condition, informationcondition可以是任何表达式,assert要求这个表达式的值必须等价于True,否则就会引发异常,information用来指定异常具体信息的字符串。3.4.2 异常处理结构语法与应用(3)raise关键字关键字raise可以用来在程序中显式引发异常或者重新抛出最后一个异常。如果raise关键字后面没有任何表达式就重
28、新抛出当前程序执行过程中最后一个异常,如果没有异常就简单地抛出一个RuntimeError表示发生了错误。3.4.2 异常处理结构语法与应用 raiseTraceback (most recent call last): File , line 1, in raiseRuntimeError: No active exception to reraise# 重新抛出最后发生的一个错误 try: print(A + 32)except: raiseTraceback (most recent call last): File , line 2, in print(A + 32)TypeError
29、: can only concatenate str (not int) to str3.5 综合例题解析 例例3-9 编写程序,用户每次输入一个整数表示第几个月份,然后输出斐波那契数列中这个月份的兔子数量,然后用户再输入一个月份重复上面的过程,如果输入的是0表示结束输入退出程序。要求考虑到输入非整数时可能会发生的错误并给出相应的处理。code例3-9.py3.5 综合例题解析 例例3-10 编写程序,接收一个正整数n,输出所有的n位水仙花数。如果一个n位正整数的各位数字的n次方之和等于这个数字本身,那么这个正整数是水仙花数。例如153是3位水仙花数,因为153=13+53+33,再例如370
30、、371、407都是3位水仙花数,1634、8208、9474是4位水仙花数,54748、92727、93084是5位水仙花数,只有548834这一个6位水仙花数,7位水仙花数有1741725、4210818、9800817、9926315。code例3-10.py3.5 综合例题解析 例例3-11 编写程序,打印九九乘法表。for i in range(1, 10): for j in range(1, i+1): # i*j:2d表示计算并替换表达式i*j的值 # 把计算结果格式化为2位字符串,不足2位的使用空格填充 # 表示左对齐,也就是在右侧填充空格 print(fi*j=i*j:0
31、and x0: print(f鸡x只,兔y只。) else: print(无解。)ymxmnynyxmyx,22423.5 综合例题解析 例例3-13 编写程序,计算百钱买百鸡问题。假设公鸡5元一只,母鸡3元一只,小鸡1元三只,现在有100块钱,想买100只鸡,输出所有可能的购买方案。3.5 综合例题解析#假设能买x只公鸡,x最大为20for x in range(21): #假设能买y只母鸡,y最大为33 for y in range(34): #假设能买z只小鸡 z = 100-x-y if z%3=0 and (5*x + 3*y + z/3 = 100): print(f公鸡x只,母鸡
32、y只,小鸡z只)3.5 综合例题解析 例例3-14 编写程序,输入一个正整数n,然后计算前n个正整数的阶乘之和1!+2!+3!+.+n!的值。try: n = int(input(请输入一个正整数:) assert n 0except: print(必须输入正整数。)else: # result表示前n项的和,temp表示每一项 result, temp = 0, 1 for i in range(1, n+1): temp = temp * i result = result + temp print(result)3.5 综合例题解析 例例3-15 编写程序,计算李白买酒问题。李白闲来街上
33、走,提着酒壶去买酒。遇店加一倍,见花喝一斗。店不相邻开,花不成双长。三遇店和花,喝光壶中酒。请问此壶中,原有多少酒?。3.5 综合例题解析# 最后喝光了所有的酒num = 0for i in range(3): # 遇到鲜花 num = num + 1 # 遇到酒店 num = num / 2print(num)3.5 综合例题解析3.5 综合例题解析3.5 综合例题解析from math import sin, radians# 正多边形的边数ns = list(range(6, 15) + 100, 1000, 1500, 2000, 3000, 5000for n in ns: # ra
34、dians()用来把角度转换为弧度 # sin()用来计算弧度的正弦值 print(sin(radians(360/2/n)*n)3.5 综合例题解析 例例3-17 编写程序,输入一个正整数n,判断是否为丑数。如果一个正整数的质因数只包含2、3或5,不包含其他质因数,那么这个数是丑数。3.5 综合例题解析n = int(input(请输入一个正整数:)for i in (2, 3, 5): while True: m, r = divmod(n, i) if r != 0: break else: n = mprint(是丑数 if n=1 else 不是丑数)3.5 综合例题解析 例例3-18 假设墙上有一排5个洞,其中一个洞里有狐狸,玩家来抓这只狐狸,每天只能抓一次。玩家打开一个洞口的门,如果里面有小狐狸就抓到了,不考虑狐狸挣脱甚至抓伤玩家的情况。如果洞口里没有小狐狸就第二天再来抓,但是第二天小狐狸会在有人来抓之前跳到隔壁洞口里。如果在规定的次数之内无法抓住狐狸,玩家失败。如果在规定的次数之内能够抓到狐狸,玩家赢得一局。编写程序,模拟这个游戏以及玩家抓狐狸和狐狸跳跃的过程。code例3-18.py3.5 综合例题解析