程序设计思想与方法python讲义(第六至十三章).ppt

上传人:小飞机 文档编号:6011249 上传时间:2023-09-14 格式:PPT 页数:248 大小:922KB
返回 下载 相关 举报
程序设计思想与方法python讲义(第六至十三章).ppt_第1页
第1页 / 共248页
程序设计思想与方法python讲义(第六至十三章).ppt_第2页
第2页 / 共248页
程序设计思想与方法python讲义(第六至十三章).ppt_第3页
第3页 / 共248页
程序设计思想与方法python讲义(第六至十三章).ppt_第4页
第4页 / 共248页
程序设计思想与方法python讲义(第六至十三章).ppt_第5页
第5页 / 共248页
点击查看更多>>
资源描述

《程序设计思想与方法python讲义(第六至十三章).ppt》由会员分享,可在线阅读,更多相关《程序设计思想与方法python讲义(第六至十三章).ppt(248页珍藏版)》请在三一办公上搜索。

1、程序设计思想与方法613章,潘理,定义函数,什么是函数为什么需要函数函数和参数带有返回值的函数函数和程序结构,什么是函数?,函数是一种程序构件,是构成大程序的小程序.函数定义:将一组完成某个特定功能的语句组合起来,取一个名字函数调用:通过函数名执行者组语句函数的输入称为参数函数的输出称为返回值我们已经熟悉的函数:自己编的函数,如常用的main()Python内建函数,如abs()Python标准库函数,如math.sqrt()和string.split()对象的方法,如win.close()和p.draw(),3,定义函数,什么是函数为什么需要函数函数和参数带有返回值的函数函数和程序结构,为什

2、么需要函数?,编程更容易把握复杂程序分解成较小部件代码可重用提高开发效率更易维护代码更简洁程序更易理解,5,编程实例:生日歌,用函数减少重复代码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()pri

3、nt Happy birthday,dear Fred.happy()def main():singFred()main(),定义函数,什么是函数为什么需要函数函数和参数带有返回值的函数函数和程序结构,函数和参数,如果要为tom唱一首数据生日歌,必须另外写一个函数singTomsingTom和singFred的区别在于第三个语句将Tom或Fred写成一个变量,这两个函数变成一个函数。这个变量称为函数的参数,它是函数的输入。,编程实例:生日歌(续),def happy():print happy birthday to youdef sing(person):happy()happy()prin

4、t“appy birthday,dear”,person,.happy()print“def main():sing(Fred)sing(Lucy)sing(Elmer)main(),参数实例:计算利息,计算利息程序中两处画柱子的代码是类似的循环外的初始柱子循环内的每年的柱子解决方法:定义一个函数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(Investm

5、ent 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:)drawBa

6、r(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(),形参和实参,函数定义:def drawBar(window,year,height)window,year,height成为形式参数,表示函数执行时的输入函数调用:drawBar(win,0,1+principal*0.0004)win,0,1+principal*0.

7、0004称为实际参数,代表某次函数函数执行的输入参数传递:将实际参数赋给形式参数,函数调用过程,函数定义def():函数调用()调用程序暂停函数形参被赋值为实参(按位置对应)执行函数体控制返回调用点的下一条语句,函数调用过程图解,定义函数,什么是函数为什么需要函数函数和参数带有返回值的函数函数和程序结构,带返回值的函数,函数的返回值:函数执行的结果函数与调用者之间的沟通:通过参数从调用者输入值通过返回值向调用者输出值定义def(形参):return Python遇见return语句时即退出函数,并计算表达式将结果返回给调用者使用x=(),编程实例:factorial,计算n!该函数是一个有参数

8、又有返回值的函数。参数是n,返回值是n!,#coding=gbkdef p(n):x=1 for i in range(1,n+1):x=x*i return xdef main():n=input(“请输入一个整数:)print n,!的值为:,p(n)main(),定义函数,什么是函数为什么需要函数函数和参数带有返回值的函数函数和程序结构,函数与程序结构,函数不只是为了减少重复代码.函数还使程序更加模块化(modular).即使增加了代码量!编程实例:计算利率将主程序中并未重复出现的语句序列改写成了一个函数,原地方改成一个函数调用。代码量不减反增,但程序可读性大大增强!,def creat

9、eWin():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=inpu

10、t(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,分支程序设计,前面出现的所有程序的执行过程都是从第一个语句执行到最后一个语句,这称为顺序执行。例如求一元二次方程的解,#equatio

11、n1.pyimport mathdef 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,r2main(),当b*b 4*a*c 0时,程序执行出错!,分支程序设计,单分支多分支异常处理,单分支程序设计,分支语句的基本格式及应用条件执行,30,30,30,单分支决策,语法if:布尔表达式:语句序列.语义:计算的真假.若为真,则执行,并把控制转向下一条语句;

12、若为假,则直接把控制转向下一条语句.,31,31,条件表达式,简单条件:关系表达式,比较两个表达式 关系运算:=,!=数值比较字符串比较:按字典序.复杂条件:布尔表达式.布尔运算符:and,or,not布尔表达式:结果为true/false,32,32,and的定义,and表示“并且”:,33,33,or的定义,or表示“或者”:日常用语中的“或”往往具有互斥的涵义,即二选一.与此处的or有不同!,34,34,not的定义,not表示“否定”:,布尔运算符的优先级,not最高,and次之,or最低思考:a or not b and c何意?最好使用括号!,35,例:判断两点是否位置相同,if

13、p1.getX()=p2.getX()and p1.getY()=p2.getY():#points are the sameelse:#points are different,36,解一元二次方程,import mathdef 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=,x2main(),缺点,在 b*b 4*a*c 0时,程序没有任何反应改进:在 b*b 4*a*c 0时,输出一个出错信息,两分支决策

14、,语法if:else:语义若为真,执行,控制转向下一条语句;否则执行,控制转向下一条语句.,39,解一元二次方程,import mathdef main():a,b,c=input(input a,b,c:)d=b*b-4*a*c if(d 0):print no root else:x1=(-b+math.sqrt(d)/2/a x2=(-b-math.sqrt(d)/2/a print x1=,x1,x2=,x2main(),缺陷,当a等0时,程序会异常终止。因为遇到了除数为0的问题在解一元二次方程时增加一个检测条件,检验方程是不是一元二次方程,#coding=gbkimport math

15、def main():a,b,c=input(input a,b,c:)if(abs(a)0.000001):print 不是一元二次方程 else:d=b*b-4*a*c if(d 0):print no root else:x1=(-b+math.sqrt(d)/2/a x2=(-b-math.sqrt(d)/2/a print x1=,x1,x2=,x2main(),单分支程序设计,分支语句的基本格式及应用条件执行,44,44,44,有条件执行程序,回顾:Python模块分为程序/脚本:可直接执行模块最后一行是main(),即启动程序的语句执行方式直接执行Windows下双击模块图标DO

16、S命令行下:python.py在会话或其他程序中import并执行库:不能直接执行模块中没有main()一行被其他程序import但不执行,45,45,45,有条件执行程序(续),混合型模块:既能作为独立程序直接执行,又能作为库被其他程序import而不执行.#myfile.pydef main():def other():if _name_=_main_:main(),import一个模块时,Python将该模块中的一个特殊变量_name_设置为该模块的名字;直接执行模块时,_name_被设置为_main_,分支程序设计,单分支多分支异常处理,多分支决策,语法if:elif:.elif el

17、se 语义:找到第一个为真的条件并执行对应语句序列,控制转向下一条语句;若无,则执行else下的语句序列,控制转向下一条语句。,47,完善一元二次方程,考虑等根的情况,import mathdef main():a,b,c=input(input a,b,c:)if(abs(a)0.000001):print input illegal else:d=b*b-4*a*c if(d 0):print no root elif(abs(d)0.0000001):x=-b/2/a print x=,x else:x1=(-b+math.sqrt(d)/2/a x2=(-b-math.sqrt(d)/

18、2/a print x1=,x1,x2=,x2main(),49,分支程序设计,单分支多分支异常处理,异常处理,为保证程序的正确性,当程序中充斥着许多错误检测代码,使 解决问题的算法反而不明显了.例如求一元二次方程的解,就是利用标准的公式。但为了用此公式,必须判断a是否为0,是否小于0。,51,解决办法,异常处理机制:把错误集中在一起处理,以免影响算法的主线条。Python提供try.except.可使程序不因运行错误而崩溃,尽量让用户不受意外结果的困扰。,例外处理语句,语法try:except:except:.except:.语义:执行。若无错,控制转下一语句;若有错,查找匹配该错误的exc

19、ept子句,找到则执行相应的处理程序,找不到则程序崩溃,系统报错。,53,完善一元二次方程问题,用异常处理语句来捕获math.sqrt的溢出错误try:.except ValueError:.错误类型:从系统报错信息中可得.如ValueError,TypeError,NameError等,54,import mathdef main():a,b,c=input(input a,b,c:)if(abs(a)0.000001):print input illegal else:d=b*b-4*a*c try:x1=(-b+math.sqrt(d)/2/a x2=(-b-math.sqrt(d)/2

20、/a print x1=,x1,x2=,x2 except ValueError:print no rootmain(),改进版2,将a等于0的判断也作为异常,是程序更加简洁,import mathdef main():a,b,c=input(input a,b,c:)d=b*b-4*a*c try:x1=(-b+math.sqrt(d)/2/a x2=(-b-math.sqrt(d)/2/a print x1=,x1,x2=,x2 except ValueError:print no root except ZeroDivisionError:print input errormain(),

21、END,循环控制结构,For循环回顾While循环嵌套循环后测试循环和Break语句循环的中途退出,60,60,60,for循环:回顾,语法for in:语义:循环标志变量var取遍序列sequence中的每个值;对var所取的每个值执行一遍循环体body。,编程实例:求平均值,需求:输入若干个数,求平均值.显然可用熟悉的累积器算法模式算法:输入数值个数n初始化累积变量sum=0循环n次输入数值x累加到sum输出平均值sum/n翻译到Python:avg.py,61,def main():n=input(input a num:)sum=0 for i in range(n):sum=sum+

22、input()print average=,sum/nmain(),凯撒密码(Caesar cipher),a-D、b-E、c-F、d-G、e-H s-V、z-C eg.明文:access control 可变为:DFFHVV FRQWURO,#coding gbkdef main():str_before=raw_input(请输入明文:)str_after=for ch in str_before:if ord(ch)ord(x):str_after=str_after+chr(ord(ch)+3)else:str_after=str_after+chr(ord(ch)-23)print

23、str_aftermain(),循环控制结构,For循环回顾While循环嵌套循环后测试循环和Break语句循环的中途退出,66,66,while循环,avg.py的缺点:需要用户输入n,不适合事先不知道n的场合解决方法:每次询问是否还有数据要输入不确定的条件循环:while语法while:语义:只要条件成立就反复执行循环体;当条件不成立则执行下一条语句.,67,67,67,while循环的特点,循环前测试条件若不满足,则循环体一次都不执行循环体影响下一次条件测试否则导致无穷循环例如:for循环改写成while循环i=0while i 10:print i i=i+1问题:若忘了最后一条语句会

24、怎样?,常见循环模式:交互循环,用户根据需要来循环执行程序某一部分例如:avg1.py不输入n,由程序自己数输入的值的个数设置一个是否继续循环的标志初始化sum=0,count=0,moredata=yeswhile moredata=yes:输入数据x 累积sum=sum+x 累积count=count+1 询问用户moredata?输出平均值sum/count,68,#avg.pydef main():sum=0.0 num=0 moreData=yes while moreData=yes:sum=sum+input(input data:)num=num+1 moreData=raw_

25、input(more data(yes or no)?)print average=,sum/nummain(),缺点,avg1.py不断要用户输入moredata,很烦人.改进:设置一个特殊数据值(称为哨兵)作为终止循环的信号.对哨兵唯一的要求就是能与普通数据区分模式:输入第一个数据while 该数据不是哨兵:处理该数据 输入下一个数据编程实例:avg2.py(负数哨兵),70,Avg2.py,def main():sum=0.0 num=0 data=input(input data:)while data=0:sum=sum+data num=num+1 data=input(input

26、 data:)print average=,sum/nummain(),常见循环模式:文件循环,avgavg2都是交互式输入数据的不便处理大数据量.一个输入错误即导致需要重新运行程序.改进:建立一个数据文件.数据处理应用中广泛使用模式:打开数据文件ffor line in f:处理每个数据编程实例:avg3.py,72,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=,su

27、m/nummain(),缺点,在处理前,将整个文件读入内存,导致运行速度减慢,甚至无法运行。解决方法:分批读入,每次读入一行。文件结束时,readline返回一个空串。,Avg4.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/nummain(),循环控制结构,For循环回顾While循环嵌套循环后测试循环和Break语句循环的中途退出

28、,常见循环模式:嵌套循环,嵌套循环:一个循环语句的循环体内有另一个循环语句.用途:遍历一维空间的元素只需一个循环变量,遍历二维空间的元素需要两个循环变量,遍历n维空间的元素需要n个循环变量.例如:假设数据文件包含多段数据,段与段之间用空行分开,需要分段统计。,77,Avg5.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()

29、print average=,sum/num sum=0.0 num=0 line=infile.readline()main(),循环控制结构,For循环回顾While循环嵌套循环后测试循环和Break语句循环的中途退出,其他循环结构:后测试循环,问题:输入验证检查用户输入是否符合要求,不符合就要求用户重新输入,直至符合为止.这是一种后测试循环:执行循环体后才测试条件循环体至少执行一次直至条件成立才退出循环有些语言提供repeatuntil语句,80,后测试循环,Python没有提供特殊的语句可以用while循环实现,只要保证第一次进入循环时条件为真例如:要求用户输入一个大于0的数,如果不满

30、足要求,则重新输入。可用语句:Data=-1While data=0:data=input(“),break语句,语法:break语义:退出break所处循环(通常是无穷循环).应用例:实现后测试循环while 1:x=input(Enter a nonnegative number:)if x=0:break比用一个非法值(如前面的1)来强制while循环一次的做法好.慎用break,尤其是一个循环体用多个break出口.,循环控制结构,For循环回顾While循环嵌套循环后测试循环和Break语句循环的中途退出,半路循环(Loop and a Half),循环出口在循环体中间.例如whil

31、e 1:x=input(Enter a nonnegative number:)if x=0:break print negative!用半路循环实现哨兵循环:while 1:读取下一数据x if x是哨兵:break 处理x,END,模拟与设计 Racquetball问题的思考,87,87,87,模拟,计算机有远远高于人类的计算能力,能解决人类所不能解决的一些问题。如天气预报,设计飞机等模拟:用计算机为实际问题建模,从而提供非如此不能获得的信息.我们已经掌握的工具足以让我们编程解决有意思的问题.,一个模拟问题:Racquetball,问题:为什么球技只比对手略差,却输掉绝大多数的比赛?一种可

32、能是心理上的:你头脑中自以为比对手只是略差,实际情况是你差很多.另一种可能:这是壁球运动本身的特性,能力上的细微差距却导致压倒性的胜负.解决方法:用计算机模拟壁球,通过模拟不同水平球员之间的数千场比赛来看看这是必然的还是偶然的,,88,89,89,美式壁球基本知识,球,球拍,场地一人发球开始比赛然后两人交替击球(称为一个rally)当一人未能击出合法球,则输掉本rally;发球方输则交换发球权;发球方赢则得1分.先得15分者赢1局.,程序规格,球技水平:用球员作为发球方的获胜概率来模拟.程序规格输入:两个球员的水平,模拟比赛局数.输出:两球员各自的获胜局数及比例.,90,关键技术:随机数,模拟

33、的是不确定性事件:rally的输赢是随机的.这类模拟也称为Monte Carlo算法如何用确定性的计算机模拟非确定性?用函数生成随机数(实际上是伪随机数).从种子值开始,计算出一个“随机”数;如果还需要,就用上一个随机数反馈给生成函数,生成下一个随机数.Python库random提供了一些伪随机数生成函数:从加载库的日期时间导出种子值.randrange():生成指定范围(类似range)内的一个整数random():生成0,1)间的一个浮点数,91,用random模拟输赢,设发球人获胜概率是prob程序中显然需要这样的代码:if 发球者胜了本回合:score=score+1并且要使该条件为真

34、的情况占prob用random函数模拟:if random()prob:score=score+1,92,自顶向下的分解,对复杂问题常采用自顶向下分解:将对一般问题的解决方案用若干个较小问题来表达.再对较小问题用同样的方法分解.直至小问题很容易求解.将所有小问题的解合并,就得到大问题的解.,93,自顶向下的分解,将计算机程序分解成不同部分,各部分功能重叠越少越好.好处:允许多人独立开发系统的不同部分便于重用确保系统可维护性易于增加新功能使系统易理解,94,结构图,模拟壁球问题的程序被分成了四个部分:将每个部分定义为一个函数为每个函数定义接口,即函数名,参数,返回值的信息高层设计时只须关心函数的

35、接口,而非函数的实现.用结构图(或称模块层次图)表示:,95,顶层设计,基本算法:介绍程序功能取得输入:probA,probB,n利用probA和probB模拟n局比赛输出结果报告基本程序def main():printIntro()probA,probB,n=getInputs()winsA,winsB=simNGames(n,probA,probB)printSummary(winsA,winsB),96,抽象,在设计的每一层,接口指明了需要下一层的哪些细节;其他可暂时忽略.抽象:确定某事物的重要特性并忽略其他细节的过程.抽象是基本的设计工具.自顶向下设计的整个过程可视为发现有用的抽象的系

36、统化方法.,第二层设计,两个简单函数def printIntro():print This program simulates a game of racquetballprint between two players called A and B.print The abilities of each player is indicated by a print probability(a number between 0 and 1)thatprint the player wins the point when serving.Player A print always has the

37、 first serve.“def getInputs():#RETURNS three simulation parameters probA,probB and na=input(What is the prob.player A wins a serve?)b=input(What is the prob.player B wins a serve?)n=input(How many games to simulate?)return a,b,n,第二层设计(续),设计simNGames()winsA和winsB初始化为0循环n次模拟一局if playerA胜:winsA加1else:w

38、insB加1def simNGames(n,probA,probB):winsA=winsB=0for i in range(n):scoreA,scoreB=simOneGame(probA,probB)if scoreA scoreB:winsA=winsA+1else:winsB=winsB+1return winsA,winsB,第三层设计,simOneGame:整个模拟程序的关键.是个不确定循环:不断进行回合较量,直至一局结束需要两个累积器:记分需要一个二值累积器:记录发球方得分初始化为0发球方置为A当本局未结束就循环:模拟一次发球修改比赛状态返回比分,第三层设计(续),def si

39、mOneGame(probA,probB):scoreA=0scoreB=0serving=Awhile not gameOver(scoreA,scoreB):if serving=A:if random()probA:scoreA=scoreA+1else:serving=Belse:if random()probB:scoreB=scoreB+1else:serving=Areturn scoreA,scoreB,第三层设计(续),函数gameOverdef gameOver(a,b):#a and b represent scores for a racquetball game#RE

40、TURNS true if the game is over,false otherwise.return a=15 or b=15函数printSummarydef printSummary(winsA,winsB):#Prints a summary of wins for each player.n=winsA+winsB print nGames simulated:,n print Wins for A:%d(%0.1f%)%(winsA,float(winsA)/n*100)print Wins for B:%d(%0.1f%)%(winsB,float(winsB)/n*100)

41、完整程序:rball.py运行之,看看技术的小差距是否导致大胜负差?试一试:修改成模拟多局制比赛.,设计过程小结,自顶向下,逐步求精将算法表达为一系列较小问题为每个小问题设计一个(函数)接口用各小问题的接口细化算法对各小问题重复此过程,过程化的程序设计,自顶向下的设计自底向上的实现从结构图的底层开始实现,逐级向上.每完成一个模块,进行单元测试.,其他设计技术,原型技术(prototyping):从程序的一个简单版本开始,逐步增加功能,直至完全满足程序规格.初始的简单版本称为原型(prototype).原型技术导致螺旋式开发过程:原型的设计,实现,测试新功能的设计,实现,测试适合情况:对程序功能

42、不熟悉,难以按自顶向下设计方法给出完整设计.,例:壁球模拟程序的原型,simOneGame()固定水平五五开固定比赛30个rallyfrom random import randomdef simOneGame():scoreA=0 scoreB=0 serving=A for i in range(30):if serving=A:if random().5:scoreA=scoreA+1 else:serving=B else:if random().5:scoreB=scoreB+1 else:serving=A print scoreA,scoreB,例:对原型的扩展,增加两个参数:选

43、手的技术水平改成完成一局比赛(一方先得15分)完成多局比赛,统计各人获胜局数增加交互式输入,格式化输出,设计的艺术,螺旋式开发与自顶向下设计是互补的方法.如:原型可使用自顶向下设计好的软件设计者会使用多种设计技术.通过实践学习软件设计.,END,类的定义,对象回顾类的定义封装编程实例,111,111,111,对象回顾,对象的构成:一组相关信息:属性处理该信息的一组方法:函数类决定了对象具有哪些信息和方法对象是类的实例通过类的构造函数创建新对象定义自己的类:即以OO方法来组织自己程序要处理的数据.,112,112,编程实例:炮弹模拟,程序规格输入:发射角,初速度,初始高度输出:射程注:不用微积分

44、,只用一些基本知识来算法化解决.算法输入模拟参数:角度,速度,高度,计算位置变化的时间间隔计算炮弹初始位置xpos,ypos计算炮弹初始水平和垂直速度xve,yvel当炮弹还在飞行,循环:更新一个时间间隔之后的xpos,ypos,yvel输出xpos,编程实例:炮弹模拟(续),def main():angle=input(.(in degrees)vel=input(.(in meters/sec)h0=input(.(in meters)time=input(.(in seconds)xpos,ypos=0,h0theta=angel*math.pi/180.0 xvel=vel*math.

45、cos(theta)yvel=vel*math.sin(theta)while ypos=0.0:更新print Distance:%0.1f meters.%(xpos),114,114,114,编程实例:炮弹模拟(续),算法核心部分:更新各值xpos=xpos+xvel*timeyvel_new=yvel 9.8*timeypos=ypos+time*(yvel+yvel_new)/2yvel=yvel_new抽象函数,得到的main函数为def main():angle,vel,h0,time=getInput()xpos,ypos=0,h0 xvel,yvel=getXYCompone

46、nts(vel,angle)while ypos=0.0:xpos,ypos,yvel=updatePos(time,xpos,ypos,xvel,yvel)print Distance:%0.1f meters.%(xpos),函数updateData()的弊端,过多参数:5个参数,3个返回值.函数参量过多通常意味着有更好的组织方式OO设计:设计一个抛物体类Projectile,让它自己记住当前的位置、速度、以及y方向速度的变化,使main函数不用操心这些细节def main():angle,vel,h0,time=getInput()cball=Porjectile(angle,vel,h

47、0)while cball.getY()=0.0:cball.update(time)print Distance:%0.1f meters.%(cball.getX(),类的定义,对象回顾类的定义封装编程实例,类的定义,语法class:方法定义:同函数定义.方法是依附于类的函数.一般函数则是独立的.方法的第一个参量是专用的:指向方法的作用对象.传统上习惯用self这个名字.回忆:对象是数据和操作的结合.上面的类定义中,方法对应于操作.但数据呢?,117,118,118,118,例:类定义,多面骰子#msdie.pyfrom random import randrangeclass MSDie

48、:def _init_(self,s):self.sides=sself.value=1def roll(self):self.value=randrange(1,self.sides+1)def getValue(self):return self.valuedef setValue(self,v):self.value=v,实例变量,Python的类并不明显定义实例变量,而是在方法中直接使用.主要是在_init_方法中(见后)用self.的方式给出如MSDie中的sides和value每个类的实例(对象)具有自己的实例变量副本,用来存储该对象自己的数据.对实例变量的访问:.实例变量与函数局

49、部变量不同!,119,方法调用,方法调用:同函数调用,但需指明作用对象.因此不需要再为形参self提供实参了.例如:主程序main()中执行die1.setValue(8),构造函数,对象构造函数(constructor):构造一个新的对象并赋初值_init_用法:(1)在类外部用类名生成新实例:die1=MSDie(6)(2)Python创建一个MSDie新实例,并对该实例调用_init_(),从而初始化其实例变量:die1.sides=6die1.value=1,121,编程实例:Porjectile类,构造器炮弹的实例变量:xpos,ypos,xvel,yvel构造器需要三个初值来为实例

50、变量初始化: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类(续),读取实例变量的方法def getX(self):return self.xposdef getY(self):return self.ypos更新实例变量的方法:def update(self,time):self.xpos=

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号