




已阅读5页,还剩243页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
程序设计思想与方法613章,潘理Email:panli,定义函数,什么是函数为什么需要函数函数和参数带有返回值的函数函数和程序结构,什么是函数?,函数是一种程序构件,是构成大程序的小程序.函数定义:将一组完成某个特定功能的语句组合起来,取一个名字函数调用:通过函数名执行者组语句函数的输入称为参数函数的输出称为返回值我们已经熟悉的函数:自己编的函数,如常用的main()Python内建函数,如abs()Python标准库函数,如math.sqrt()和string.split()对象的方法,如win.close()和p.draw(),3,定义函数,什么是函数为什么需要函数函数和参数带有返回值的函数函数和程序结构,为什么需要函数?,编程更容易把握复杂程序分解成较小部件代码可重用提高开发效率更易维护代码更简洁程序更易理解,5,编程实例:生日歌,用函数减少重复代码defmain():print“Happybirthdaytoyou!”print“Happybirthdaytoyou!”print“Happybirthday,dearFred.”print“Happybirthdaytoyou!”,重复代码的坏处:1.费时费力2.代码维护的一致性,defhappy():printhappybirthdaytoyou!defsingFred():happy()happy()printHappybirthday,dearFred.happy()defmain():singFred()main(),定义函数,什么是函数为什么需要函数函数和参数带有返回值的函数函数和程序结构,函数和参数,如果要为tom唱一首数据生日歌,必须另外写一个函数singTomsingTom和singFred的区别在于第三个语句将Tom或Fred写成一个变量,这两个函数变成一个函数。这个变量称为函数的参数,它是函数的输入。,编程实例:生日歌(续),defhappy():printhappybirthdaytoyoudefsing(person):happy()happy()print“appybirthday,dear”,person,.happy()print“defmain():sing(Fred)sing(Lucy)sing(Elmer)main(),参数实例:计算利息,计算利息程序中两处画柱子的代码是类似的循环外的初始柱子循环内的每年的柱子解决方法:定义一个函数defdrawBar(win,year,height):bar=Rectangle(Point(year+1,1),Point(year+2,height)bar.setFill(green)bar.draw(win),11,完整的程序,defmain():win=GraphWin(InvestmentGrowthChart,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(enterinitialprincipal:)apr=input(enterinterestrate:)drawBar(win,0,1+principal*0.0004)foryearinrange(1,11):principal=principal*(1+apr)drawBar(win,year,1+principal*0.0004)raw_input(pressanykeytoquit:)win.close()main(),形参和实参,函数定义:defdrawBar(window,year,height)window,year,height成为形式参数,表示函数执行时的输入函数调用:drawBar(win,0,1+principal*0.0004)win,0,1+principal*0.0004称为实际参数,代表某次函数函数执行的输入参数传递:将实际参数赋给形式参数,函数调用过程,函数定义def():函数调用()调用程序暂停函数形参被赋值为实参(按位置对应)执行函数体控制返回调用点的下一条语句,函数调用过程图解,定义函数,什么是函数为什么需要函数函数和参数带有返回值的函数函数和程序结构,带返回值的函数,函数的返回值:函数执行的结果函数与调用者之间的沟通:通过参数从调用者输入值通过返回值向调用者输出值定义def(形参):returnPython遇见return语句时即退出函数,并计算表达式将结果返回给调用者使用x=(),编程实例:factorial,计算n!该函数是一个有参数又有返回值的函数。参数是n,返回值是n!,#coding=gbkdefp(n):x=1foriinrange(1,n+1):x=x*ireturnxdefmain():n=input(“请输入一个整数:)printn,!的值为:,p(n)main(),定义函数,什么是函数为什么需要函数函数和参数带有返回值的函数函数和程序结构,函数与程序结构,函数不只是为了减少重复代码.函数还使程序更加模块化(modular).即使增加了代码量!编程实例:计算利率将主程序中并未重复出现的语句序列改写成了一个函数,原地方改成一个函数调用。代码量不减反增,但程序可读性大大增强!,defcreateWin():win=GraphWin(InvestmentGrowthChart,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)returnwin,defmain():win=createWin()principal=input(enterinitialprincipal:)apr=input(enterinterestrate:)drawBar(win,0,1+principal*0.0004)foryearinrange(1,11):principal=principal*(1+apr)drawBar(win,year,1+principal*0.0004)raw_input(pressanykeytoquit:)win.close()main(),END,分支程序设计,前面出现的所有程序的执行过程都是从第一个语句执行到最后一个语句,这称为顺序执行。例如求一元二次方程的解,#equation1.pyimportmathdefmain():a,b,c=input(Enterthreecoefficients:)discRoot=math.sqrt(b*b-4*a*c)r1=(-b+discRoot)/(2*a)r2=(-b-discRoot)/(2*a)printThesolutionsare:,r1,r2main(),当b*b4*a*c,!=数值比较字符串比较:按字典序.复杂条件:布尔表达式.布尔运算符:and,or,not布尔表达式:结果为true/false,32,32,and的定义,and表示“并且”:,33,33,or的定义,or表示“或者”:日常用语中的“或”往往具有互斥的涵义,即二选一.与此处的or有不同!,34,34,not的定义,not表示“否定”:,布尔运算符的优先级,not最高,and次之,or最低思考:aornotbandc何意?最好使用括号!,35,例:判断两点是否位置相同,ifp1.getX()=p2.getX()andp1.getY()=p2.getY():#pointsarethesameelse:#pointsaredifferent,36,解一元二次方程,importmathdefmain():a,b,c=input(inputa,b,c:)d=b*b-4*a*cif(d0):x1=(-b+math.sqrt(d)/2/ax2=(-b-math.sqrt(d)/2/aprintx1=,x1,x2=,x2main(),缺点,在b*b4*a*c0时,程序没有任何反应改进:在b*b4*a*c0时,输出一个出错信息,两分支决策,语法if:else:语义若为真,执行,控制转向下一条语句;否则执行,控制转向下一条语句.,39,解一元二次方程,importmathdefmain():a,b,c=input(inputa,b,c:)d=b*b-4*a*cif(d0):printnorootelse:x1=(-b+math.sqrt(d)/2/ax2=(-b-math.sqrt(d)/2/aprintx1=,x1,x2=,x2main(),缺陷,当a等0时,程序会异常终止。因为遇到了除数为0的问题在解一元二次方程时增加一个检测条件,检验方程是不是一元二次方程,#coding=gbkimportmathdefmain():a,b,c=input(inputa,b,c:)if(abs(a)0.000001):print不是一元二次方程else:d=b*b-4*a*cif(d0):printnorootelse:x1=(-b+math.sqrt(d)/2/ax2=(-b-math.sqrt(d)/2/aprintx1=,x1,x2=,x2main(),单分支程序设计,分支语句的基本格式及应用条件执行,44,44,44,有条件执行程序,回顾:Python模块分为程序/脚本:可直接执行模块最后一行是main(),即启动程序的语句执行方式直接执行Windows下双击模块图标DOS命令行下:python.py在会话或其他程序中import并执行库:不能直接执行模块中没有main()一行被其他程序import但不执行,45,45,45,有条件执行程序(续),混合型模块:既能作为独立程序直接执行,又能作为库被其他程序import而不执行.#myfile.pydefmain():defother():if_name_=_main_:main(),import一个模块时,Python将该模块中的一个特殊变量_name_设置为该模块的名字;直接执行模块时,_name_被设置为_main_,分支程序设计,单分支多分支异常处理,多分支决策,语法if:elif:.elifelse语义:找到第一个为真的条件并执行对应语句序列,控制转向下一条语句;若无,则执行else下的语句序列,控制转向下一条语句。,47,完善一元二次方程,考虑等根的情况,importmathdefmain():a,b,c=input(inputa,b,c:)if(abs(a)0.000001):printinputillegalelse:d=b*b-4*a*cif(d0):printnorootelif(abs(d)0.0000001):x=-b/2/aprintx=,xelse:x1=(-b+math.sqrt(d)/2/ax2=(-b-math.sqrt(d)/2/aprintx1=,x1,x2=,x2main(),49,分支程序设计,单分支多分支异常处理,异常处理,为保证程序的正确性,当程序中充斥着许多错误检测代码,使解决问题的算法反而不明显了.例如求一元二次方程的解,就是利用标准的公式。但为了用此公式,必须判断a是否为0,是否小于0。,51,解决办法,异常处理机制:把错误集中在一起处理,以免影响算法的主线条。Python提供try.except.可使程序不因运行错误而崩溃,尽量让用户不受意外结果的困扰。,例外处理语句,语法try:except:except:.except:.语义:执行。若无错,控制转下一语句;若有错,查找匹配该错误的except子句,找到则执行相应的处理程序,找不到则程序崩溃,系统报错。,53,完善一元二次方程问题,用异常处理语句来捕获math.sqrt的溢出错误try:.exceptValueError:.错误类型:从系统报错信息中可得.如ValueError,TypeError,NameError等,54,importmathdefmain():a,b,c=input(inputa,b,c:)if(abs(a)0.000001):printinputillegalelse:d=b*b-4*a*ctry:x1=(-b+math.sqrt(d)/2/ax2=(-b-math.sqrt(d)/2/aprintx1=,x1,x2=,x2exceptValueError:printnorootmain(),改进版2,将a等于0的判断也作为异常,是程序更加简洁,importmathdefmain():a,b,c=input(inputa,b,c:)d=b*b-4*a*ctry:x1=(-b+math.sqrt(d)/2/ax2=(-b-math.sqrt(d)/2/aprintx1=,x1,x2=,x2exceptValueError:printnorootexceptZeroDivisionError:printinputerrormain(),END,循环控制结构,For循环回顾While循环嵌套循环后测试循环和Break语句循环的中途退出,60,60,60,for循环:回顾,语法forin:语义:循环标志变量var取遍序列sequence中的每个值;对var所取的每个值执行一遍循环体body。,编程实例:求平均值,需求:输入若干个数,求平均值.显然可用熟悉的累积器算法模式算法:输入数值个数n初始化累积变量sum=0循环n次输入数值x累加到sum输出平均值sum/n翻译到Python:avg.py,61,defmain():n=input(inputanum:)sum=0foriinrange(n):sum=sum+input()printaverage=,sum/nmain(),凯撒密码(Caesarcipher),a-D、b-E、c-F、d-G、e-Hs-V、z-Ceg.明文:accesscontrol可变为:DFFHVVFRQWURO,#codinggbkdefmain():str_before=raw_input(请输入明文:)str_after=forchinstr_before:iford(ch)=0:breakprintnegative!用半路循环实现哨兵循环:while1:读取下一数据xifx是哨兵:break处理x,END,模拟与设计Racquetball问题的思考,87,87,87,模拟,计算机有远远高于人类的计算能力,能解决人类所不能解决的一些问题。如天气预报,设计飞机等模拟:用计算机为实际问题建模,从而提供非如此不能获得的信息.我们已经掌握的工具足以让我们编程解决有意思的问题.,一个模拟问题:Racquetball,问题:为什么球技只比对手略差,却输掉绝大多数的比赛?一种可能是心理上的:你头脑中自以为比对手只是略差,实际情况是你差很多.另一种可能:这是壁球运动本身的特性,能力上的细微差距却导致压倒性的胜负.解决方法:用计算机模拟壁球,通过模拟不同水平球员之间的数千场比赛来看看这是必然的还是偶然的,,88,89,89,美式壁球基本知识,球,球拍,场地一人发球开始比赛然后两人交替击球(称为一个rally)当一人未能击出合法球,则输掉本rally;发球方输则交换发球权;发球方赢则得1分.先得15分者赢1局.,程序规格,球技水平:用球员作为发球方的获胜概率来模拟.程序规格输入:两个球员的水平,模拟比赛局数.输出:两球员各自的获胜局数及比例.,90,关键技术:随机数,模拟的是不确定性事件:rally的输赢是随机的.这类模拟也称为MonteCarlo算法如何用确定性的计算机模拟非确定性?用函数生成随机数(实际上是伪随机数).从种子值开始,计算出一个“随机”数;如果还需要,就用上一个随机数反馈给生成函数,生成下一个随机数.Python库random提供了一些伪随机数生成函数:从加载库的日期时间导出种子值.randrange():生成指定范围(类似range)内的一个整数random():生成0,1)间的一个浮点数,91,用random模拟输赢,设发球人获胜概率是prob程序中显然需要这样的代码:if发球者胜了本回合:score=score+1并且要使该条件为真的情况占prob用random函数模拟:ifrandom()scoreB:winsA=winsA+1else:winsB=winsB+1returnwinsA,winsB,第三层设计,simOneGame:整个模拟程序的关键.是个不确定循环:不断进行回合较量,直至一局结束需要两个累积器:记分需要一个二值累积器:记录发球方得分初始化为0发球方置为A当本局未结束就循环:模拟一次发球修改比赛状态返回比分,第三层设计(续),defsimOneGame(probA,probB):scoreA=0scoreB=0serving=AwhilenotgameOver(scoreA,scoreB):ifserving=A:ifrandom()probA:scoreA=scoreA+1else:serving=Belse:ifrandom()probB:scoreB=scoreB+1else:serving=AreturnscoreA,scoreB,第三层设计(续),函数gameOverdefgameOver(a,b):#aandbrepresentscoresforaracquetballgame#RETURNStrueifthegameisover,falseotherwise.returna=15orb=15函数printSummarydefprintSummary(winsA,winsB):#Printsasummaryofwinsforeachplayer.n=winsA+winsBprintnGamessimulated:,nprintWinsforA:%d(%0.1f%)%(winsA,float(winsA)/n*100)printWinsforB:%d(%0.1f%)%(winsB,float(winsB)/n*100)完整程序:rball.py运行之,看看技术的小差距是否导致大胜负差?试一试:修改成模拟多局制比赛.,设计过程小结,自顶向下,逐步求精将算法表达为一系列较小问题为每个小问题设计一个(函数)接口用各小问题的接口细化算法对各小问题重复此过程,过程化的程序设计,自顶向下的设计自底向上的实现从结构图的底层开始实现,逐级向上.每完成一个模块,进行单元测试.,其他设计技术,原型技术(prototyping):从程序的一个简单版本开始,逐步增加功能,直至完全满足程序规格.初始的简单版本称为原型(prototype).原型技术导致螺旋式开发过程:原型的设计,实现,测试新功能的设计,实现,测试适合情况:对程序功能不熟悉,难以按自顶向下设计方法给出完整设计.,例:壁球模拟程序的原型,simOneGame()固定水平五五开固定比赛30个rallyfromrandomimportrandomdefsimOneGame():scoreA=0scoreB=0serving=Aforiinrange(30):ifserving=A:ifrandom()=0.0:xpos,ypos,yvel=updatePos(time,xpos,ypos,xvel,yvel)printDistance:%0.1fmeters.%(xpos),函数updateData()的弊端,过多参数:5个参数,3个返回值.函数参量过多通常意味着有更好的组织方式OO设计:设计一个抛物体类Projectile,让它自己记住当前的位置、速度、以及y方向速度的变化,使main函数不用操心这些细节defmain():angle,vel,h0,time=getInput()cball=Porjectile(angle,vel,h0)whilecball.getY()=0.0:cball.update(time)printDistance:%0.1fmeters.%(cball.getX(),类的定义,对象回顾类的定义封装编程实例,类的定义,语法class:方法定义:同函数定义.方法是依附于类的函数.一般函数则是独立的.方法的第一个参量是专用的:指向方法的作用对象.传统上习惯用self这个名字.回忆:对象是数据和操作的结合.上面的类定义中,方法对应于操作.但数据呢?,117,118,118,118,例:类定义,多面骰子#msdie.pyfromrandomimportrandrangeclassMSDie:def_init_(self,s):self.sides=sself.value=1defroll(self):self.value=randrange(1,self.sides+1)defgetValue(self):returnself.valuedefsetValue(self,v):self.value=v,实例变量,Python的类并不明显定义实例变量,而是在方法中直接使用.主要是在_init_方法中(见后)用self.的方式给出如MSDie中的sides和value每个类的实例(对象)具有自己的实例变量副本,用来存储该对象自己的数据.对实例变量的访问:.实例变量与函数局部变量不同!,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构造器需要三个初值来为实例变量初始化:cball=Projectile(angle,vel,h0)因此得到:def_init_(self,a,v,h):self.xpos=0self.ypos=htheta=math.pi*a/180self.xvel=v*math.cos(theta)self.yvel=v*math.sin(theta),122,编程实例:Porjectile类(续),读取实例变量的方法defgetX(self):returnself.xposdefgetY(self):returnself.ypos更新实例变量的方法:defupdate(self,time):self.xpos=self.xpos+self.xvel*timeyvelnew=self.yvel9.8*timeyvelavg=(self.yvel+yvelnew)/2self.ypos=self.ypos+yvelavg*timeself.yvel=yvelnewOO版炮弹模拟程序:cball3.py,类的定义,对象回顾类的定义封装编程实例,封装,封装(encapsulation):如果确认某类对象对解决问题有用,即可当作此类对象已存在,从而直接使用对象功能;至于对象的实现细节则封装在相应类定义中.这是抽象(忽略实现细节),也是SoC.Python的封装只是一种程序设计思想和方法,并非语言本身提供的能力.在程序的任何地方可以随意访问实例变量.严格意义的OO:内部细节在类外部是不可见的,只能通过方法(接口)访问.,125,126,126,126,类模块文件,类定义一般作为单独的模块,以提供给其他所有程序使用.类模块文件类似于函数库很多OO语言都提供类库,类模块的格式,如前所述,模块的第一行一般是一行注释注释会被Python编译器所忽略有一类特殊的注释,编译器会保存下来,它是用”括起来,特殊注释的使用,模块、类和函数定义的第一行可以是一个特殊的注释字符串,说明所定义的模块、类和函数的性质、作用等,形如#projectile.pyThismoduleprovides.classProjectile:Thisclass.defgetX(self)Thisfunction.docstring被系统保存在模块/类/函数的属性_doc_中,可访问,类的定义,对象回顾类的定义封装编程实例,编程实例:掷骰子,图形化模拟掷两个骰子,程序显示投掷结果.提供两个按钮:一个用来投掷,一个用来退出程序.显然需要两个GUI部件:按钮和骰子.,定制GUI部件:按钮,按钮:图形窗口中的矩形区域,点击可以影响应用程序的行为.应该支持的方法:构造器activate:按钮处于激活状态deactivate:按钮处于失效状态clicked:按钮被点击getLabel:获得按钮标签应该存储的实例变量可通过实现上述方法来明确需要哪些变量,按钮方法实现:activate,按钮激活时:边框由细变粗填充色由灰变黑defactivate(self):self.label.setFill(black)self.rect.setWidth(2)self.active=1可见需要实例变量:Text对象label,Rectangle对象rect,布尔变量activedeactivate()的实现类似,132,按钮方法实现例:clicked,按钮被点击:getMouse()返回的坐标位于按钮矩形范围内defclicked(self,p):returnself.activeandself.xmin=p.getX()=self.xmaxandself.ymin=p.getY()=self.ymax可见需要实例变量:xmin,xmax,ymin,ymax,133,按钮类:button.py,#button.pyfromgraphicsimport*classButton:def_init_(self,win,center,width,height,label):self.xmin=center.getX()-width/2.0self.xmax=center.getX()+width/2.0self.ymin=center.getY()-height/2.0self.ymax=center.getY()+height/2.0self.rect=Rectangle(Point(self.xmin,self.ymin),Point(self.xmax,self.ymax)self.rect.setFill(lightgray)self.rect.draw(win)self.label=Text(center,label)self.label.draw(win)self.deactivate(),defclicked(self,p):returnself.activeandself.xmin=p.getX()=self.xmaxandself.yminmyList=34,26,15,10myList215myList2=0myList34,26,0,10字符串的操作myString=HelloWorldmyString2lmyString2=zTraceback(innermostlast):File,line1,in?TypeError:objectdoesntsupportitemassignment,列表与数组,很多编程语言提供数组(array)类型.Python列表与数组的区别:列表是动态的,而数组是定长的列表元素可以是混合类型的,而数组元素是同类型的例如,silly=1,“spam”,4,“U”是合法的列表,但不是合法的数组。,专用于列表的操作,可应用于列表的字符串操作,合并:+重复:*索引:分段:长度:len()迭代:forin:.del:,编程实例,计算输入的一组数据的均值和方差均值的定义为方差的定义为,解题思想,循环读入每一个统计数据,存入一个列表计算平均值计算方差显示结果,数据读入,设计一个函数getNumber完成此功能。getNumber函数重复读入一个字符串,将字符串转换为数字,添加到列表nums中,知道读入了一个空字符串,返回nums,defgetNumbers():nums=#startwithanemptylist#sentinellooptogetnumbersxStr=raw_input(Enteranumber(toquit)whilexStr!=:x=eval(xStr)nums.append(x)#addthisvaluetothelistxStr=raw_input(Enteranumber(toquit)returnnums,计算平均值,设计函数mean完成此功能函数mean将nums中的每个数据加入到一个变量sum,返回sum/n,defmean(nums):sum=0.0fornuminnums:sum=sum+numreturnsum/len(nums),计算方差,设计函数Dev完成此功能该函数将nums中的每个数据与均值相减后的平方加起来存入变量sum返回sum/n,defDev(nums,xbar):sum=0.0fornuminnums:dev=xbar-numsum=sum+dev*devreturnsum/len(nums),Main函数,defmain():print程序计算一组数据的均值和方差data=getNumbers()xbar=mean(data)std=Dev(data,xbar)printn均值是:,xbarprintn方差是:,stdif_name_=_main_:main(),数据集合,数据集合列表与类一起使用字典,列表与类结合使用,类将一些数据与操作封装成一个对象列表将一些同类对象组合成整体这两者的结合可以表示任意复杂的数据集合体.,167,编程实例:对DieView的改进,将骰子的7个点构成一个列表好处:对整个列表进行操作时,代码变得简单,因为可以应用循环语句.如:forpipinself.pips:pip.setFill(self.background)foriin0,3,6:self.pipsi.setFill(self.foreground)根据掷出的value决定点亮骰子哪些点:可以使用表驱动的写法,点亮骰子上的点,forpipinself.pips:self.pip.setFill(self.background)ifvalue=1:on=3elifvalue=2:on=0,6elifvalue=3:on=0,3,6elifvalue=4:on=0,2,4,6elifvalue=5:on=0,2,3,4,6else:on=0,1,2,4,5,6foriinon:self.pipsi.setFill(self.foreground),进一步的优化,这个onTable是不变的,可以作为类的实例变量,由_init_初始化.onTable=,3,2,4,2,3,4,0,2,4,6,0,2,3,4,6,0,1,2,4,5,6forpipinself.pips:self.pip.setFill(self.background)on=onTablevalueforiinon:self.pipsi.setFill(self.foreground),修改后的dieview类的构造函数,def_init_(self,win,center,size):#firstdefinesomestandardvaluesself.win=win#savethisfordrawingpipslaterself.background=white#colorofdiefaceself.foreground=black#colorofthepipsself.psize=0.1*size#radiusofeachpiphsize=size/2.0#halfthesizeofthedieoffset=0.6*hsize#distancefromcentertoouterpips#createasquareforthefacecx,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),#Create7circlesforstandardpiplocationsself.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.pip7self.onTable=,3,2,4,2,3,4,0,2,4,6,0,2,3,4,6,0,1,2,4,5,6#Drawaninitialvalueself.setValue(1),setValue函数,defsetValue(self,value):Setthisdietodisplayvalue.#turnallpipsoffforpipinself.pips:pip.setFill(self.background)#turncorrectpipsonon=self.onTablevalueforiinon:self.pipsi.setFill(self.foreground),编程实例:计算器,程序=数据结构的集合+处理数据结构的算法的集合因此:整个应用程序本身可看作对象!编程实例:计算器类每个计算器是计算器类的一个对象.,计算器类calculator,创建一个计算器的初始界面:由构造函数完成与用户的交互:用户按下某一按钮,显示部分会显示相应的按钮,由run函数实现,构造函数,创建一个图形界面及合适的坐标值def_init_(self):#创建计算器的窗口win=GraphWin(calculator,250,300)win.setCoords(0,0,6,7)win.setBackground(slategray)self.win=win创建按钮self._createButtons()创建显示部分self._createDisplay(),创建按钮,利用Button类defcreateButtons(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,6),(3,4,.75,9),(4,2,.75,+),(4,3,.75,*),(4,4,.75,-),(5,2,.75,-),(5,3,.75,/),(5,4,.75,C)self.buttons=height=.75forcx,cy,bwidth,labelinbuttonSpecs:b=Button(self.win,Point(cx,cy),bwidth,height,label)b.activate()self.buttons.append(b),元组,创建按钮的关键是列表bSpecs,它给出了每个按钮的属性说明。它的每个成员称为一个元组元组:用圆括号包围的一组值.类似列表但内容不可修改.,178,创建显示区域,显示部分创建一个矩形和一个文本框def_createDisplay(self):bg=Rectangle(Point(.5,5.5),Point(5.5,6.5)bg.setFill(white)bg.draw(self.win)text=Text(Point(3,6),)text.draw(self.win)text.setFace(courier)text.setSt
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 民法遗产继承课件
- 民法总则全文课件
- 初中会考试卷及答案解析
- 亳州初二会考试卷及答案
- 医疗器械行业新质生产力发展
- 民族风少女课件
- 安全生产定义解析讲解
- 线上推广活动方案
- 《统计学-SPSS和Excel实现》(第9版)课件 第5章 参数估计
- 民族自治区域课件
- saas货运管理办法
- 2025新疆生产建设兵团草湖项目区公安局面向社会招聘警务辅助人员考试参考试题及答案解析
- 2026届广东省广州市高三上学期8月调研考试语文试题(含答案)
- 江苏省南通市如皋市2025-2026学年高三上学期开学考试数学试卷
- 2025年高一语文开学第一课指导课件
- 2025年事业单位工勤技能-河北-河北计算机操作员二级(技师)历年参考题库含答案解析(5套)
- 社会资本测量方法-洞察及研究
- 2025年江西省公安机关人民警察特殊职位招录考试(网络安全)历年参考题库含答案详解(5卷)
- 医院副高职称评审汇报
- 肿瘤放疗并发症综合防治
- 口腔医疗风险管理实施方案
评论
0/150
提交评论