程序设计思想与方法python讲义(第六至十三章).ppt_第1页
程序设计思想与方法python讲义(第六至十三章).ppt_第2页
程序设计思想与方法python讲义(第六至十三章).ppt_第3页
程序设计思想与方法python讲义(第六至十三章).ppt_第4页
程序设计思想与方法python讲义(第六至十三章).ppt_第5页
已阅读5页,还剩243页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

程序设计思想与方法程序设计思想与方法 6 61313章章 潘理 Email: 定义函数定义函数 v什么是函数 v为什么需要函数 v函数和参数 v带有返回值的函数 v函数和程序结构 什么是函数什么是函数? ? v函数是一种程序构件,是构成大程序的小程序. 函数定义:将一组完成某个特定功能的语句组合起来,取一 个名字 函数调用:通过函数名执行者组语句 函数的输入称为参数 函数的输出称为返回值 v我们已经熟悉的函数: 自己编的函数,如常用的main() Python内建函数,如abs() Python标准库函数,如math.sqrt()和string.split() 对象的方法,如win.close()和p.draw() 3 定义函数定义函数 v什么是函数 v为什么需要函数 v函数和参数 v带有返回值的函数 v函数和程序结构 为什么需要函数为什么需要函数? ? v编程更容易把握 复杂程序分解成较小部件 v代码可重用 提高开发效率 更易维护 v代码更简洁 v程序更易理解 5 编程实例编程实例: :生日歌生日歌 v用函数减少重复代码 def main(): print “Happy birthday to you!” print “Happy birthday to you!” print “Happy birthday, dear Fred.” print “Happy birthday to you!” 重复代码的坏处 : 1.费时费力 2.代码维护的 一致性 def happy(): print “happy birthday to you!“ def singFred(): happy() happy() print “Happy birthday, dear Fred.“ happy() def main(): singFred() main() 定义函数定义函数 v什么是函数 v为什么需要函数 v函数和参数 v带有返回值的函数 v函数和程序结构 函数和参数函数和参数 v如果要为tom唱一首数据生日歌,必须另外 写一个函数singTom vsingTom和singFred的区别在于第三个语句 v将Tom或Fred写成一个变量,这两个函数变 成一个函数。 v这个变量称为函数的参数,它是函数的输入 。 编程实例编程实例: :生日歌生日歌( (续续) ) def happy(): print “happy birthday to you“ def sing(person): happy() happy() print “appy birthday, dear”, person , “.“ happy() print “ “ def main(): sing(“Fred“) sing(“Lucy“) sing(“Elmer“) main() 参数实例参数实例: :计算利息计算利息 v计算利息程序中两处画柱子的代码是类似的 循环外的初始柱子 循环内的每年的柱子 v解决方法:定义一个函数 def drawBar(win, year, height): bar = Rectangle(Point(year+1, 1), Point(year + 2, height) bar.setFill(green) bar.draw(win) 11 完整的程序完整的程序 def main(): win = GraphWin(“Investment Growth Chart“, 512, 384) win.setCoords(0.0, 0.0, 14.0, 6.0) Text(Point(0.5, 1), 0.0K).draw(win) Text(Point(0.5, 2), 2.5K).draw(win) Text(Point(0.5, 3), 5.0K).draw(win) Text(Point(0.5, 4), 7.5K).draw(win) Text(Point(0.5, 5), 10.0K).draw(win) principal = input(“enter initial principal:“) apr = input(“enter interest rate: “) drawBar(win, 0, 1 + principal * 0.0004) for year in range(1, 11): principal = principal * (1 + apr) drawBar(win, year, 1 + principal * 0.0004) raw_input(“press any key to quit: “) win.close() main() 形参和实参形参和实参 v函数定义: def drawBar(window,year,height) window,year,height成为形式参数,表示函数 执行时的输入 v函数调用: drawBar(win,0, 1 + principal * 0.0004) win, 0, 1 + principal*0.0004称为实际参数 ,代表某次函数函数执行的输入 v参数传递:将实际参数赋给形式参数 函数调用过程函数调用过程 v函数定义 def (): v函数调用 () 调用程序暂停 函数形参被赋值为实参(按位置对应) 执行函数体 控制返回调用点的下一条语句 函数调用过程图解函数调用过程图解 定义函数定义函数 v什么是函数 v为什么需要函数 v函数和参数 v带有返回值的函数 v函数和程序结构 带返回值的函数带返回值的函数 v函数的返回值:函数执行的结果 v函数与调用者之间的沟通: 通过参数从调用者输入值 通过返回值向调用者输出值 v定义 def (形参): return Python遇见return语句时即退出函数,并计算表达式 将结果返回给调用者 v使用 x = () 编程实例:编程实例:factorialfactorial v计算n! v该函数是一个有参数又有返回值的函数 。参数是n,返回值是n! # coding = gbk def p(n): x = 1 for i in range(1, n+1): x = x * i return x def main(): n = input(“请输入一个整数:“) print n, “!的值为:“, p(n) main() 定义函数定义函数 v什么是函数 v为什么需要函数 v函数和参数 v带有返回值的函数 v函数和程序结构 函数与程序结构函数与程序结构 v函数不只是为了减少重复代码. v函数还使程序更加模块化(modular). 即使增加了代码量! v编程实例:计算利率 将主程序中并未重复出现的语句序列改写成 了一个函数,原地方改成一个函数调用。 代码量不减反增,但程序可读性大大增强! def createWin(): win = GraphWin(“Investment Growth Chart“, 512, 384) win.setCoords(0.0, 0.0, 14.0, 6.0) Text(Point(0.5,1), 0.0K).draw(win) Text(Point(0.5,2), 2.5K).draw(win) Text(Point(0.5,3), 5.0K).draw(win) Text(Point(0.5,4), 7.5K).draw(win) Text(Point(0.5,5), 10.0K).draw(win) return win def main(): win = createWin() principal = input(“enter initial principal:“) apr = input(“enter interest rate: “) drawBar(win, 0, 1 + principal * 0.0004) for year in range(1, 11): principal = principal * (1 + apr) drawBar(win, year, 1 + principal * 0.0004) raw_input(“press any key to quit: “) win.close() main() END 分支程序设计分支程序设计 v前面出现的所有程序的执行过程都是从 第一个语句执行到最后一个语句,这称 为顺序执行。 v例如求一元二次方程的解 # equation1.py import math def main(): a, b, c = input(“Enter three coefficients:“) discRoot = math.sqrt(b * b - 4 * a * c) r1 = (-b + discRoot) / (2 * a) r2 = (-b - discRoot) / (2 * a) print “The solutions are:“, r1, r2 main() 当b * b 4 * a * c : : 布尔表达式 : 语句序列. v语义:计算的真假.若为真,则执行 ,并把控制转向下一条语句;若为假, 则直接把控制转向下一条语句. 3131 条件表达式条件表达式 v简单条件:关系表达式,比较两个表达式 关系运算: =, , != 数值比较 字符串比较: 按字典序. v复杂条件:布尔表达式. 布尔运算符:and, or, not 布尔表达式: 结果为true/false 3232 andand的定义的定义 vand表示“并且”: PQP and Q FFF FTF TFF TTT 3333 oror的定义的定义 vor表示“或者”: v日常用语中的“或”往往具有互斥的涵义,即二 选一.与此处的or有不同! PQP or Q FFF FTT TFT TTT 3434 notnot的定义的定义 vnot表示“否定”: Pnot P TF FT 布尔运算符的优先级布尔运算符的优先级 vnot最高, and次之, or最低 思考: a or not b and c何意? 最好使用括号! 35 例例: :判断两点是否位置相同判断两点是否位置相同 if p1.getX() = p2.getX() and p1.getY() = p2.getY(): # points are the same else: # points are different 36 解一元二次方程解一元二次方程 import math def main(): a, b, c = input(“input a, b, c:“) d = b * b - 4 * a * c if (d 0): x1 = (-b + math.sqrt(d) / 2 / a x2 = (-b - math.sqrt(d) / 2/ a print “x1 = “, x1, “ x2 = “, x2 main() 缺点缺点 v在 b * b 4 * a * c : else: v语义 若为真,执行,控制转 向下一条语句;否则执行,控 制转向下一条语句. 39 解一元二次方程解一元二次方程 import math def main(): a, b, c = input(“input a, b, c:“) d = b * b - 4 * a * c if (d .py 在会话或其他程序中import并执行 库:不能直接执行 l模块中没有main()一行 l被其他程序import但不执行 454545 有条件执行程序有条件执行程序( (续续) ) v混合型模块:既能作为独立程序直接执行 ,又能作为库被其他程序import而不执行. #myfile.py def main(): def other(): if _name_ = _main_: main() import一个模块时, Python将该 模块中的一个特殊变量_name_设 置为该模块的名字; 直接执行模块时, _name_被设 置为_main_ 分支程序设计分支程序设计 v单分支 v多分支 v异常处理 多分支决策多分支决策 v语法 if : elif : . elif else v语义:找到第一个为真的条件并执行对应语 句序列,控制转向下一条语句;若无,则执 行else下的语句序列,控制转向下一条语句。 47 完善一元二次方程完善一元二次方程 v考虑等根的情况 import math def main(): a, b, c = input(“input a, b, c:“) if (abs(a) except : except : . except: . v语义语义 :执执行。若无错错,控制转转下一语语句;若 有错错,查查找匹配该错误该错误 的except子句,找到则执则执 行 相应应的处处理程序,找不到则则程序崩溃溃,系统报错统报错 。 53 完善一元二次方程问题完善一元二次方程问题 v用异常处理语句来捕获math.sqrt的溢出错误 try: . except ValueError: . v错误类型:从系统报错信息中可得. 如ValueError,TypeError, NameError等 54 import math def main(): a, b, c = input(“input a, b, c:“) if (abs(a) in : v语义:循环标志变量var取遍序列sequence中 的每个值;对var所取的每个值执行一遍循环 体body。 编程实例编程实例: :求平均值求平均值 v需求:输入若干个数,求平均值. v显然可用熟悉的累积器算法模式 v算法: 输入数值个数n 初始化累积变量sum=0 循环n次 输入数值x 累加到sum 输出平均值sum/n v翻译到Python: avg.py 61 def main(): n = input(“input a num:“) sum = 0 for i in range(n): sum =sum + input(“) print “average = “ , sum / n main() 凯撒密码(凯撒密码(Caesar cipherCaesar cipher) va-D、b-E、 c-F、d-G、e-H s-V 、z-C veg. 明文:access control v可变为: DFFHVV FRQWURO # coding gbk def main(): str_before = raw_input(“请输入明文:“) str_after = “ for ch in str_before: if ord(ch) : 语义:只要条件成立就反复执行循环体;当条件 不成立则执行下一条语句. 676767 whilewhile循环的特点循环的特点 v循环前测试条件 若不满足,则循环体一次都不执行 v循环体影响下一次条件测试 否则导致无穷循环 例如:for循环改写成while循环 i = 0 while i = 0 : sum =sum + data num = num + 1 data = input(“input data:“) print “average = “ , sum / num main() 常见循环模式常见循环模式: :文件循环文件循环 vavgavg2都是交互式输入数据的 不便处理大数据量. 一个输入错误即导致需要重新运行程序. v改进:建立一个数据文件. 数据处理应用中广泛使用 v模式: 打开数据文件f for line in f : 处理每个数据 v编程实例:avg3.py 72 Avg3.py:Avg3.py:统计整个文件统计整个文件 def main(): sum = 0.0 num = 0 infile = open(“data.txt“, r) for line in infile.readlines(): sum =sum + eval(line) num = num + 1 print “average = “ , sum / num main() 缺点缺点 v在处理前,将整个文件读入内存,导致 运行速度减慢,甚至无法运行。 v解决方法:分批读入,每次读入一行。 文件结束时,readline返回一个空串。 Avg4.pyAvg4.py def main(): sum = 0.0 num = 0 infile = open(“data.txt“, r) line = infile.readline() while line != “: sum =sum + eval(line) num = num + 1 line = infile.readline() print “average = “ , sum / num main() 循环控制结构循环控制结构 For循环回顾 While循环 嵌套循环 后测试循环和Break语句 循环的中途退出 常见循环模式常见循环模式: :嵌套循环嵌套循环 v嵌套循环:一个循环语句的循环体内有另一个 循环语句. v用途:遍历一维空间的元素只需一个循环变量, 遍历二维空间的元素需要两个循环变量, 遍历n维空间的元素需要n个循环变量. v例如:假设数据文件包含多段数据,段与段之 间用空行分开,需要分段统计。 77 Avg5.pyAvg5.py def main(): sum = 0.0 num = 0 infile = open(“data1.txt“, r) line = infile.readline() while line != “: while line != “n“ and line != “: sum =sum + eval(line) num = num + 1 line = infile.readline() print “average = “ , sum / num sum = 0.0 num = 0 line = infile.readline() main() 循环控制结构循环控制结构 For循环回顾 While循环 嵌套循环 后测试循环和Break语句 循环的中途退出 其他循环结构其他循环结构: :后测试循环后测试循环 v问题:输入验证 检查用户输入是否符合要求,不符合就要求用户重 新输入,直至符合为止. v这是一种后测试循环: 执行循环体后才测试条件 循环体至少执行一次 直至条件成立才退出循环 有些语言提供repeatuntil语句 80 后测试循环后测试循环 vPython没有提供特殊的语句 v可以用while循环实现,只要保证第一次进 入循环时条件为真 v例如:要求用户输入一个大于0的数,如果 不满足要求,则重新输入。可用语句: Data = -1 While data = 0: break 比用一个非法值(如前面的1)来强制while循环一次 的做法好. v慎用break,尤其是一个循环体用多个break出 口. 循环控制结构循环控制结构 For循环回顾 While循环 嵌套循环 后测试循环和Break语句 循环的中途退出 半路循环半路循环(Loop and a Half)(Loop and a Half) v循环出口在循环体中间.例如 while 1: x = input(“Enter a nonnegative number: “) if x = 0: break print “negative!“ v用半路循环实现哨兵循环: while 1: 读取下一数据x if x是哨兵: break 处理x END 模拟与设计模拟与设计 RacquetballRacquetball问题的思考问题的思考 878787 模拟模拟 v计算机有远远高于人类的计算能力,能 解决人类所不能解决的一些问题。如天 气预报,设计飞机等 v模拟:用计算机为实际问题建模,从而提 供非如此不能获得的信息. v我们已经掌握的工具足以让我们编程解 决有意思的问题. 一个模拟问题一个模拟问题:Racquetball:Racquetball v问题:为什么球技只比对手略差,却输掉绝 大多数的比赛? 一种可能是心理上的:你头脑中自以为比对手 只是略差,实际情况是你差很多. 另一种可能:这是壁球运动本身的特性,能力 上的细微差距却导致压倒性的胜负. v解决方法:用计算机模拟壁球,通过模拟不同 水平球员之间的数千场比赛来看看这是必然的 还是偶然的, 88 8989 美式壁球基本知识美式壁球基本知识 v球,球拍,场地 v一人发球开始比赛 v然后两人交替击球(称为一个rally) v当一人未能击出合法球,则输掉本rally; 发球方输则交换发球权; 发球方赢则得1分. v先得15分者赢1局. 程序规格程序规格 v球技水平:用球员作为发球方的获胜概率 来模拟. v程序规格 输入:两个球员的水平,模拟比赛局数. 输出:两球员各自的获胜局数及比例. 90 关键技术:随机数关键技术:随机数 v模拟的是不确定性事件:rally的输赢是随机的. 这类模拟也称为Monte Carlo算法 v如何用确定性的计算机模拟非确定性? 用函数生成随机数(实际上是伪随机数). l从种子值开始,计算出一个“随机”数; l如果还需要,就用上一个随机数反馈给生成函数,生成下一个 随机数. Python库random提供了一些伪随机数生成函数: l从加载库的日期时间导出种子值. lrandrange():生成指定范围(类似range)内的一个整数 lrandom():生成0,1)间的一个浮点数 91 用用randomrandom模拟输赢模拟输赢 v设发球人获胜概率是prob v程序中显然需要这样的代码: if 发球者胜了本回合: score = score + 1 并且要使该条件为真的情况占prob v用random函数模拟: if random() scoreB: winsA = winsA + 1 else: winsB = winsB + 1 return winsA, winsB 第三层设计第三层设计 vsimOneGame:整个模拟拟程序的关键键. 是个不确定循环环:不断进进行回合较较量,直至 一局结结束 需要两个累积积器:记记分 需要一个二值值累积积器:记录发记录发 球方 得分初始化为为0 发发球方置为为“A“ 当本局未结结束就循环环: 模拟拟一次发发球 修改比赛赛状态态 返回比分 第三层设计第三层设计( (续续) ) def simOneGame(probA, probB): scoreA = 0 scoreB = 0 serving = “A“ while not gameOver(scoreA, scoreB): if serving = “A“: if random() = 0.0: 更新 print “Distance: %0.1f meters.“ % (xpos) 114114114 编程实例编程实例: :炮弹模拟炮弹模拟( (续续) ) v算法核心部分:更新各值 xpos = xpos + xvel * time yvel_new = yvel 9.8 * time ypos = ypos + time * (yvel + yvel_new) / 2 yvel = yvel_new v抽象函数,得到的main函数为 def main(): angle, vel, h0, time = getInput() xpos, ypos = 0, h0 xvel, yvel = getXYComponents(vel, angle) while ypos = 0.0: xpos, ypos, yvel = updatePos(time, xpos,ypos,xvel,yvel) print “Distance: %0.1f meters.“ % (xpos) 函数函数updateData()updateData()的弊端的弊端 v过多参数: 5个参数,3个返回值. v函数参量过多通常意味着有更好的组织方式 vOO设计:设计一个抛物体类Projectile,让它 自己记住当前的位置、速度、以及y方向速度 的变化,使main函数不用操心这些细节 def main(): angle, vel, h0, time = getInput() cball = Porjectile(angle,vel,h0) while cball.getY() = 0.0: cball.update(time) print “Distance: %0.1f meters.“ % (cball.getX() 类的定义类的定义 对象回顾 类的定义 封装 编程实例 类的定义类的定义 v语法 class : 方法定义:同函数定义. l方法是依附于类的函数.一般函数则是独立的 . l方法的第一个参量是专用的:指向方法的作用 对象.传统上习惯用self这个名字. 回忆:对象是数据和操作的结合. l上面的类定义中,方法对应于操作.但数据呢? 117 118118118 例例: :类定义类定义 v多面骰子 #msdie.py from random import randrange class MSDie: def _init_(self,s): self.sides = s self.value = 1 def roll(self): self.value = randrange(1,self.sides+1) def getValue(self): return self.value def setValue(self,v): self.value = v 实例变量实例变量 vPython的类并不明显定义实例变量,而是在方 法中直接使用. 主要是在_init_方法中(见后) l用self.的方式给出 l如MSDie中的sides和value v每个类的实例(对象)具有自己的实例变量副本, 用来存储该对象自己的数据. v对实例变量的访问: . v实例变量与函数局部变量不同! 119 方法调用方法调用 v方法调用:同函数调用,但需指明作用对象. 因此不需要再为形参self提供实参了. v例如:主程序main()中执行 die1.setValue(8) 构造函数构造函数 v对象构造函数(constructor):构造一个新 的对象并赋初值 _init_ v用法: (1)在类外部用类名生成新实例: die1 = MSDie(6) (2)Python创建一个MSDie新实例,并对该实例 调用_init_(),从而初始化其实例变量: die1.sides = 6 die1.value = 1 121 编程实例编程实例:Porjectile:Porjectile类类 v构造器 炮弹的实例变量:xpos, ypos, xvel,yvel 构造器需要三个初值来为实例变量初始化: cball = Projectile(angle,vel,h0) 因此得到: def _init_(self,a,v,h): self.xpos = 0 self.ypos = h theta = math.pi * a / 180 self.xvel = v * math.cos(theta) self.yvel = v * math.sin(theta) 122 编程实例编程实例:Porjectile:Porjectile类类( (续续) ) v读取实例变量的方法 def getX(self): return self.xpos def getY(self): return self.ypos v更新实例变量的方法: def update(self,time): self.xpos = self.xpos + self.xvel * time yvelnew = self.yvel 9.8 * time yvelavg = (self.yvel + yvelnew) / 2 self.ypos = self.ypos + yvelavg * time self.yvel = yvelnew vOO版炮弹模拟程序:cball3.py 类的定义类的定义 对象回顾 类的定义 封装 编程实例 封装封装 v封装(encapsulation):如果确认某类对象对解决问 题有用,即可当作此类对象已存在,从而直接使用对 象功能;至于对象的实现细节则封装在相应类定义 中. 这是抽象(忽略实现细节),也是SoC. vPython的封装只是一种程序设计思想和方法,并非 语言本身提供的能力. 在程序的任何地方可以随意访问实例变量. 严格意义的OO:内部细节在类外部是不可见的,只能通 过方法(接口)访问. 125 126126126 类模块文件类模块文件 v类定义一般作为单独的模块,以提供给其 他所有程序使用. v类模块文件类似于函数库 v很多OO语言都提供类库 类模块的格式类模块的格式 v如前所述,模块的第一行一般是一行注释 v注释会被Python编译器所忽略 v有一类特殊的注释,编译器会保存下来,它 是用”括起来 特殊注释的使用特殊注释的使用 v模块、类和函数定义的第一行可以是一个特殊的 注释字符串,说明所定义的模块、类和函数的性 质、作用等,形如 #projectile.py “ This module provides .“ class Projectile: “ This class .“ def getX(self) “ This function .“ vdocstring被系统保存在模块/类/函数的属性 _doc_中,可访问 类的定义类的定义 对象回顾 类的定义 封装 编程实例 编程实例编程实例: :掷骰子掷骰子 v图形化模拟掷两个 骰子,程序显示投掷 结果. v提供两个按钮:一 个用来投掷,一个用 来退出程序. v显然需要两个GUI 部件:按钮和骰子. 定制定制GUIGUI部件部件: :按钮按钮 v按钮:图形窗口中的矩形区域,点击可以影响 应用程序的行为. v应该支持的方法: 构造器 activate:按钮处于激活状态 deactivate:按钮处于失效状态 clicked:按钮被点击 getLabel:获得按钮标签 v应该存储的实例变量 可通过实现上述方法来明确需要哪些变量 按钮方法实现:按钮方法实现:activateactivate v按钮激活时: 边框由细变粗 填充色由灰变黑 def activate(self): self.label.setFill(black) self.rect.setWidth(2) self.active = 1 可见需要实例变量:Text对象label, Rectangle对象 rect, 布尔变量active deactivate()的实现类似 132 按钮方法实现例按钮方法实现例:clicked:clicked v按钮被点击: getMouse()返回的坐标位于按钮矩形范围内 def clicked (self,p): return self.active and self.xmin myList = 34, 26, 15, 10 myList2 15 myList2 = 0 myList 34, 26, 0, 10 v字符串的操作 myString = “Hello World“ myString2 l myString2 = z Traceback (innermost last): File “, line 1, in ? TypeError: object doesnt support item assignment 列表与数组列表与数组 v很多编程语言提供数组(array)类型. vPython列表与数组的区别: 列表是动态的,而数组是定长的 列表元素可以是混合类型的,而数组元素是同 类型的 v例如,silly = 1, “spam”, 4, “U”是合法的列 表,但不是合法的数组。 程序设计思想与方法 - 155 专用于列表的操作专用于列表的操作 方法含义 list.append(x)将x添加到表尾 list.sort()将列表排序,比较函数可以作为参数 list.reverse()倒置表元素 list.index(x)返回x在表中的下标 list.count(x)返回x在表中的出现次数 list.remove(x)删除x在表中的第一次出现 list.pop(i)删除表中的第i个元素,并返回该元素值 x in list检查x是否在表中,返回一个布尔值 可应用于列表的字符串操作可应用于列表的字符串操作 v合并: + v重复: * v索引: v分段: : v长度: len() v迭代: for in : . vdel : 编程实例编程实例 v计算输入的一组数据的均值和方差 v均值的定义为 v方差的定义为 解题思想解题思想 v循环读入每一个统计数据,存入一个列 表 v计算平均值 v计算方差 v显示结果 数据读入数据读入 v设计一个函数getNumber完成此功能。 vgetNumber函数重复读入一个字符串, 将字符串转换为数字,添加到列表nums 中,知道读入了一个空字符串,返回 nums def getNumbers(): nums = # start with an empty list # sentinel loop to get numbers xStr = raw_input(“Enter a number ( to quit) “) while xStr != “: x = eval(xStr) nums.append(x) # add this value to the list xStr = raw_input(“Enter a number ( to quit) “) return nums 计算平均值计算平均值 v设计函数mean完成此功能 v函数mean将nums中的每个数据加入到 一个变量sum,返回sum/n def mean(nums): sum = 0.0 for num in nums: sum = sum + num return sum / len(nums) 计算方差计算方差 v设计函数Dev完成此功能 v该该函数将nums中的每个数据与均值值相 减后的平方加起来存入变变量sum v返回sum/n def Dev(nums, xbar): sum = 0.0 for num in nums: dev = xbar - num sum = sum + dev * dev return sum/len(nums) MainMain函数函数 def main(): print 程序计算一组数据的均值和方差 data = getNumbers() xbar = mean(data) std = Dev(data, xbar) print n均值是:, xbar print n方差是:, std if _name_ = _main_: main() 数据集合数据集合 数据集合 列表与类一起使用 字典 列表与类结合使用列表与类结合使用 v类将一些数据与操作封装成一个对象 v列表将一些同类对象组合成整体 v这两者的结合可以表示任意复杂的数据 集合体. 167 编程实例编程实例: :对对DieViewDieView的改进的改进 v将骰子的7个点构成一个列表 好处:对整个列表进行操作时,代码变得简单,因为可 以应用循环语句.如: for pip in self.pips: pip.setFill(self.background) for i in 0,3,6: self.pipsi.setFill(self.foreground ) 根据掷掷出的value决定点亮骰子哪些点:可以使用表 驱动驱动 的写法 点亮骰子上的点点亮骰子上的点 for pip in self.pips: self.pip.setFill(self.background) if value = 1: on = 3 elif value = 2: on = 0,6 elif value = 3: on = 0,3,6 elif value = 4: on = 0,2,4,6 elif value = 5: on = 0,2,3,4,6 else: on = 0,1,2,4,5,6 for i in on: self.pipsi.setFill(self.foreground) 进一步的优化进一步的优化 v这个onTable是不变的,可以作为类的实例变量 ,由_init_初始化. onTable = , 3, 2,4, 2,3,4, 0,2,4,6, 0,2,3,4,6, 0,1,2,4,5,6 for pip in self.pips: self.pip.setFill(self.background) on = onTablevalue for i in on: self.pipsi.setFill(self.foreground) 修改后的修改后的dieviewdieview类的构造函数类的构造函数 def _init_(self, win, center, size): # first define some standard values self.win = win # save this for drawing pips later self.background = “white“ # color of die face self.foreground = “black“ # color of the pips self.psize = 0.1 * size # radius of each pip hsize = size / 2.0 # half the size of the die offset = 0.6 * hsize # distance from center to outer pips # create a square for the face cx, cy = center.getX(), center.getY() p1 = Point(cx - hsize, cy - hsize) p2 = Point(cx + hsize, cy + hsize) rect = Rectangle(p1, p2) rect.draw(win) rect.setFill(self.background) # Create 7 circles for standard pip locations self.pip1 = self._makePip(cx - offset, cy - offset) self.pip2 = self._makePip(cx-offset, cy) self.pip3 = self._makePip(cx-offset, cy+offset) self.pip4 = self._makePip(cx, cy) self.pip5 = self._makePip(cx+offset, cy-offset) self.pip6 = self._makePip(cx+offset, cy) self.pip7 = self._makePip(cx+offset, cy+offset) self.pips = self.pip1, self.pip2, self.pip3, self.pip4, self.pip5, self.pip6, self.pip7 self.onTable = , 3, 2,4, 2,3,4, 0,2,4,6, 0,2,3,4,6, 0,1,2,4,5,6 # Draw an initial value self.setValue(1) setValuesetValue函数函数 def setValue(self, value): “Set this die to display value.“ # turn all pips off for pip in self.pips: pip.setFill(self.background) # turn correct pips on on = self.onTablevalue for i in on: self.pipsi.setFill(self.foreground) 编程实例编程实例: :计算器计算器 v程序 = 数据结构的集合 + 处理数据结构的算法的集合 v因此:整个应用程序本身可看 作对象! v编程实例:计算器类 每个计算器是计算器类的一个 对象. 计算器类计算器类calculatorcalculator v创建一个计算器的初始界面:由构造函 数完成 v与用户的交互:用户按下某一按钮,显 示部分会显示相应的按钮,由run函数 实现 构造函数构造函数 v创建一个图形界面及合适的坐标值 def _init_(self): # 创建计算器的窗口 win = GraphWin(“calculator“,250,300) win.setCoords(0,0,6,7) win.setBackground(“slategray“) self.win = win v创建按钮 self._createButtons() v创建显示部分 self._createDisplay() 创建按钮创建按钮 v利用Button类 def createButtons(self): # 设定每个按钮的位置、宽度及值 buttonSpecs = (2,1,.75,0), (3,1,.75,.), (4.5,1,2,=), (1,2,.75,1), (1,3,.75,4), (1,4,.75,7), (2,2,.75,2), (2,3,.75,5), (2,4,.75,8), (3,2,.75,3), (3,3,.75

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论