首页 可爱的Python编程

可爱的Python编程

举报
开通vip

可爱的Python编程可爱的Python*Python技术前景开始使用PythonPython中的数据类型Python中的变量Python中的控制语句Python中的函数Python中的类Python对象的序列化Python中的正则表达式Python多线程编程Python中的socket编程Python设计模式更可爱的yield*什么是PythonPython技术优势Python的应用*Python是一种功能强大的解释性,交互性,面向对象(OO)的第四代计算机编程语言。她集成了模块、包、例外机制、动态造型以及非常高级的动态数据类型。它的...

可爱的Python编程
可爱的Python*Python技术前景开始使用PythonPython中的数据类型Python中的变量Python中的控制语句Python中的函数Python中的类Python对象的序列化Python中的正则表达式Python多线程编程Python中的socket编程Python 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 模式更可爱的yield*什么是PythonPython技术优势Python的应用*Python是一种功能强大的解释性,交互性,面向对象(OO)的第四代计算机编程语言。她集成了模块、包、例外机制、动态造型以及非常高级的动态数据类型。它的语法表达优美易读。它具有很多优秀的脚本语言的特点:解释的,面向对象的,内建的高级数据结构,支持模块和包,支持多种平台,可扩展。而且它还支持交互式方式运行,图形方式运行。它的语法有很多与众不同的特性。它具有动态语义和快速的原型开发能力,也许在短短的几分钟内,你就可以开发出使用其它语言可能需要花费几个小时的原型系统。Python丰富的工具集使得它位于传统脚本语言(如Tcl、Perl和Scheme)和系统编程语言(如C、C++和Java)之间,既具备了脚本语言的简单易用性,同时又能够提供只有系统语言才可能拥有的某些高级特性。*容易学习Python提供了一个交互式环境,这是他容易学习的主要原因之一,正如一个资深程序员所说,软件的复杂是因为千万件事堆在一起,交互式环境恰好可以让我门把程序分解开,我们可以试验每个不清楚的语言成分,同时这也是一个很好的测试平台。其次,Python程序很容易阅读。这得益于他的语法简洁,用缩排格式代替了{},程序短小精悍(比其它语言,例如Java的代码短2/3到3/4),同时语言直截了当,接近自然语言,很少有专门定义的特殊符号,这也是Python容易学习的原因之一。*火力强大容易学习并不代表功能简单,从桌面程序,到网络互联,图形处理,科学计算,实时控制,到处都有Python的身影,Python是编译执行的,跨平台的(Windows,Unix,Macantoshi),面向对象的。Java可以完成的功能,Python都可以替代之。此外,支持类和多继承的面向对象程序设计,代码可以被打包为模块和包。支持异常处理追踪并能够列出比较清晰,详细的错误提示。包含了一些高级的程序设计特性,例如代码生成器和解释器,自动垃圾收集功能使你从内存管理的争战中解脱出来。庞大的 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 库支持很多一般的程序设计任务,如网络服务器连接,正则表达式,文件操作,编译器很容易扩展,可以将C/C++编译后的摸板作为新的摸板加入到其中。*快速开发Python内建的高层次数据结构,以及动态类型和动态邦定,使得它非常适合于快速应用开发,也适合于连接已有的部件。Python的简单易于阅读的语法强调了可读性,因此降低了程序的维护费用,Python支持模块和包,并鼓励程序模块化和代码重用。高效运行Python可以编译执行,其运行效率接近C语言的运行速度,相同功能的代码运行速度约为C的90%,而同时Java的运行速度却只能达到C的50%。Python的流行程度Python对国内的用户也许比较陌生,但在国外早已得到成熟、广泛的应用。著名的搜索引擎google,其核心代码就是用Python完成的,迪斯尼公司的动画生成,许多unix的版本(包括Linux)都内建了Python环境支持。就连google本身也是由Python技术建立的。*在许多领域都有Python的用武之地。包括桌面应用、科学计算、图形技术、动画、游戏、WEB应用、嵌入式系统等等,目前成功一些成功应用有:Google核心搜索引擎美国宇航局使用Python实现CAD/CAE/PDM库及模型管理系统全球知名的光影技术先驱IndustrialLight&Magic使用Python处理电影光影合成全球最大的游戏厂商EVE-online利用Python使同时服务10.000个玩家在同一个程序的内存空间成为可能Yahoo使用Python建立起全球范围的站点群迪斯尼乐园DISNEY使用Python动画的生产……*Python的安装Python的运行Py2exe的打包*安装ActivePython包含了Python所有自带的内库,及其相应的帮助,安装完成后所有的环境变量自动设置好,可以直接启动。安装py2exe一个比较好用的Python程序打包工具,可以将你写的程序打成包,不至于一个个的PYC文件。安装wxPython界面开发的一个不错的选择,是wxWidgets用Python封装而来的。Python的安装极为简单快截,所有你需要建议安装ActivePython,再安装打包工具py2exe,最后如果要开发界面可以选择安装WxPython。*在以上的互动模式下可以直接输入Python代码进行互动运行。>>>strTest='hello!'>>>printstrTesthello!>>>ret=1+1>>>ret2>>>安装之后通过[开始][运行]python,或者[开始][运行]cmd,再输入python回车都可以进入python的互动模式。*文件setup.py的内容:fromdistutils.coreimportsetupimportpy2exesetup(#Thefirstthreeparametersarenotrequired,ifatleasta#'version'isgiven,thenaversioninforesourceisbuiltfrom#themandaddedtotheexecutables.version="0.5.0",description="py2exesamplescript",name="py2exesamples",#targetstobuildwindows=[“test.py"],#console=["Uninstall.py","Install.py"],)文件test.py的内容:fromTkinterimport*root=Tk()defcallback(event):print"clickedat",event.x,event.yframe=Frame(root,width=100,height=100)frame.bind("",callback)frame.pack()root.mainloop()在命令行下输入setup.pypy2exe即可完成打包过程:E:\pythontest\TKinter>setup.pypy2exe*数字类型字符类型列表类型字典类型*Python的数字几乎没有什么限制,类型也不是很确定,不像C/C++中int、long等都有大小限制。>>>a=123456789987654321123456789987654321123456789987654321123456789987654321>>>a123456789987654321123456789987654321123456789987654321123456789987654321L>>>a+1123456789987654321123456789987654321123456789987654321123456789987654322L*一般的运算符号+,-,*以及/的用法就跟其它的程序语言(像是Pascal或C)一样。你也可以用括号"()"来表示运算执行的先后次序:>>>2+24>>>(50-5*6)/45>>>7/-3-3浮点数的运算在Python里面也是支持的:>>>4*2.5/3.33.0303030303复数的运算也支持的,只需要把虚数部分加上“j”或是“J”在其后就可以了:>>>1j*1J(-1+0j)>>>1j*complex(0,1)(-1+0j)>>>a=1.5+0.5j>>>a.real1.5>>>a.imag0.5*字符串的表示字符串在Python中有很多种表达方式,它可以放在双括号””之中,也可以放在单括号’’里面,还可以放在””””””中:>>>'spameggs''spameggs'>>>'doesn\'t'"doesn't“>>>"\"Yes,\"hesaid."'"Yes,"hesaid.‘>>>"""test"""'test‘>>>print"""line1...line2"""line1line2*字符串的运算字符串可以用+这个操作数来相加(连接起来),或是用*这个操作数来重复之:>>>'Help'+'A''HelpA‘>>>'<'+word*5+'>'''字符串对象自带了很多的方法用于运算:>>>dir('')['__add__','__class__','__contains__','__delattr__','__doc__','__eq__','__ge__','__getattribute__','__getitem__','__getnewargs__','__getslice__','__gt__','__hash__','__init__','__le__','__len__','__lt__','__mod__','__mul__','__ne__','__new__','__reduce__','__reduce_ex__','__repr__','__rmod__','__rmul__','__setattr__','__str__','capitalize','center','count','decode','encode','endswith','expandtabs','find','index','isalnum','isalpha','isdigit','islower','isspace','istitle','isupper','join','ljust','lower','lstrip','replace','rfind','rindex','rjust','rstrip','split','splitlines','startswith','strip','swapcase','title','translate','upper','zfill']*字符串的切片>>>word='HelpA'>>>word[4]'A'>>>word[2:4]'lp'>>>word[-1:]'A‘>>>wodr[-5]‘H’如同在C语言一样,字符串是有标记(subscript(index))的,第一个字符的标记(subscript(index))就是0。在Python中没有另外一个字符character数据型态,一个字符就是一个长度为1的字符串,与C不同的是,Python的字符串是不可改变的(immutable)。最好避免错误的方法是把index看成是指向字符及字符间位置的指针,字符串的最开头是0,字符串的结尾处就是字符串的长度。如下图所示:+---+---+---+---+---+|H|e|l|p|A|+---+---+---+---+---+012345-5-4-3-2-1*Python能够了解一些较为复杂的数据型态,这些数据型态大多是用来处理一群的其它数据值。最方便使用的要算是list了,一个list可以写成一串由逗号分开的值(东西),然后用角括号括起来便成。放在list里的东西不需要是同一个数据型态。跟字符串的index用法相同,list的index也由0开始,同样你可以用index来切割lists、组合两个list等等:>>>a['spam','eggs',100,1234]>>>a[2]=a[2]+23>>>a['spam','eggs',123,1234]>>>a[0:2]=[1,12]>>>a[1,12,123,1234]>>>a*2[1,12,123,1234,1,12,123,1234]*Python中列表的用处远远不只前面讲的,它和字符串一样有专门的一套方法集用于其操作,具体就不列举了,可以通过帮助查询。下面再介绍几个很有用的用法:List的堆栈使用、队列使用、功能式程序设计工具。List的堆栈使用:>>>stack=[]>>>stack.append(1)>>>stack.append(2)>>>stack.append(3)>>>stack.pop()3>>>stack[1,2]>>>stack.pop()2>>>stack[1]>>>stack.pop()1>>>stack[]List的队列使用:>>>queue=[]>>>queue.append(1)>>>queue.append(2)>>>queue.append(3)>>>queue.pop(0)1>>>queue[2,3]>>>queue.pop(0)2>>>queue[3]>>>queue.pop(0)3>>>queue[]*功能式程序设计工具:有三个与list合用非常有用的内建工具函式:filter(),map(),以及reduce()。"filter(function,sequence)"这个函式会传回一个sequence(如果可能的话其成员为同一数据型态),这个sequence里面的成员都是将sequence里面的的成员,一一传入到function(item)所代表的函式后,传回值为true的成员所组合而成。这个函式对于传入的sequence有过滤的效果,如下例所示:>>>deff(x):...returnx>5...>>>filter(f,[1,2,7,9])[7,9]"map(function,sequence)"会针对sequence里的各个成员呼叫function(item),然后传回个别成员呼叫之后传回的结果。举例来说,要计算一连串的立方值,我们可以如此做:>>>defcube(x):returnx*x*x...>>>map(cube,range(1,11))[1,8,27,64,125,216,343,512,729,1000]"reduce(func,sequence)"会利用sequence的前两个成员当参数呼叫func,然后所得的传回值再与下一个成员当参数传入func,一直到整个sequence结束。下面的 例子 48个音标大全附带例子子程序调用编程序例子方差分析的例子空间拓扑关系例子方差不存在的例子 计算1到10的总和:>>>defadd(x,y):returnx+y...>>>reduce(add,range(1,11))55>>>defsum(seq):...defadd(x,y):returnx+y...returnreduce(add,seq,0)...>>>sum(range(1,11))55>>>sum([])0*另外一个在Python当中很好用的内建数据型态是字典(dictionary)。Dictionary有的时候在别的程序语言里面也叫做连结记忆(``associativememories‘’)或者是连结数组(``associativearrays‘’)。不同于sequence是由一连串的数字来做index,dictionary用一个特殊的不可改变的(immutable)钥(keys来当作其index。字符串及数字都不能被改变,所以都可以来当作dictionary的key。在dictionary里面key的值必须是唯一不重复的,我们最好把dictionary想象成一个没有顺序的key:value成对的组合。它所有支持的方法,你可以通过dir({})查找到。>>>tel={'jack':4098,'sape':4139}>>>tel['guido']=4127>>>tel{'sape':4139,'guido':4127,'jack':4098}>>>tel['jack']4098>>>deltel['sape']>>>tel['irv']=4127>>>tel{'guido':4127,'irv':4127,'jack':4098}>>>tel.keys()['guido','irv','jack']>>>tel.has_key('guido')1*变量的分类变量的赋值全局变量与局部变量特殊变量文件间的变量处理*Python中变量分普通变量和特殊变量:普通变量:保存数值、字串、元组、列表、字典、文件句柄特殊变量:模块、函数、类。*对变量的赋值过程:先建一个变量的实例,然后把实例的址址值给变量。变量实际上都是特别的指针,受限指针。只能取与赋值的指针,不能参与指针运算。例如下以代码:a=‘abc’#<1>a=[‘a’,’b’,’c’]#<2>运行完第一句后,a就指向‘abc’,运行完第二句后,a就指向[‘a’,’b’,’c’]。* 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 以下代码:a=b=c=[‘a’,’b’,’c’]#<1>b[1]=‘w’c[2]=‘k’#<2>c=‘12345678’#<3>运行到<1>,<2>,<3>是,对应的内存分别如左图,可以在每一句语句后打输出a,b,c的各值。变量赋值举例*单个文件中的全局变量与局部变量以下代码中,fun函数中可以用全局变量,在fun函数中g_a是只读的g_a=123deffun():g_a=4printg_afun()printg_ag_a=123deffun2():k=g_aprintg_a,kg_a=4fun2()printg_a以下代码呢?Fun2函数据中的g_a是全局还是局部变量呢?===Result=====4123运行出错。g_a是局部变量,不要忘了Python运行代码时是先编译的。g_a有赋值,就成了局部变量。如果加global则显式指示为全局变量*模块变量:importab=ac=b.ClassC#ClassC是一个类类变量:classClassD:def_init_(self):passdefHello(self,name):print'Hello%s'%nameb=ClassDa=b()a.Hello("whj")函数变量:defHello(name):print'Hello%s'%namea=Helloa('whj')特殊变量的赋值也同上述所讲的变量赋值一样处理。*文件inc.py的内容:g_str="org";g_list=["orgA","orgB","orgC"];printg_str;printg_list;defprint_org():print'=========beginprint_org';printg_str;printg_list;print'----------endprint_org';文件main.py的内容:fromincimport*defprint_main():print'++++++++++++beginprint_main'printg_str;printg_list;print'-------------endprint_main‘print_org();print_main()g_str="main";g_list[0]="main";print_org();print_main();g_list="ddd"print_org();print_main()运行:E:\python>pythonmain.py结果:org['orgA','orgB','orgC']=========beginprint_orgorg['orgA','orgB','orgC']----------endprint_org++++++++++++beginprint_mainorg['orgA','orgB','orgC']-------------endprint_main=========beginprint_orgorg['main','orgB','orgC']----------endprint_org++++++++++++beginprint_mainmain['main','orgB','orgC']-------------endprint_main=========beginprint_orgorg['main','orgB','orgC']----------endprint_org++++++++++++beginprint_mainmainddd-------------endprint_main**if叙述for叙述break及continue叙述pass叙述while叙述try..except叙述特殊的yield*大概最为人所知的statement就是if叙述了,举例如下:>>>x=int(raw_input("Pleaseenteranumber:"))>>>ifx<0:...x=0...print'Negativechangedtozero'...elifx==0:...print'Zero'...elifx==1:...print'Single'...else:...print'More'...elif的部份可以没有也可以有很多个,else部分可以有一个也可以没有。`elif'这个关键词是`elseif'的简化,而且有减少过分缩排的效果。用if...elif...elif...这样的写法可以来取代在其它一些程序语言中常见的switch或是case的写法。*在Python里的for叙述的用法与在C或是Pascal里的用法有所不同。不像是在Pascal中一定要执行某个数目的循环,也不像是在C中让使用者决定执行的进度(step)及结束执行的条件,Python的for叙述会将一个系列(sequence,像是list或是string)里所有的成员走遍一次,执行的顺序是依照成员在squence里的顺序。以下是一个例子:>>>#Measuresomestrings:...a=['cat','window','defenestrate']>>>forxina:...printx,len(x)...cat3window6defenestrate12在循环的执行之中改变sequence的内容是危险的一件事(当然,只有可变的sequence像list才能作更动),如果你真的需要在循环的执行中改变list的成员值,最好先复制一份这个list的拷贝,然后针对这个拷贝来做循环。list的切割(slice)提供了一个简便的制作拷贝的方法:>>>forxina[:]:#makeaslicecopyoftheentirelist...iflen(x)>6:a.insert(0,x)...>>>a['defenestrate','cat','window','defenestrate']*>>>forninrange(2,10):...forxinrange(2,n):...ifn%x==0:...printn,'equals',x,'*',n/x...break...else:...printn,'isaprimenumber'...如同在C语言里一样,break叙述中断最靠近的一个for或while循环。同样的,从C语言借过来的continue叙述会中断目前执行的循环,并且执行下一个循环。特别的是,Python的循环有一个else子句,这个子句之后的程序代码会在整个循环正常结束的时候执行,(对for)循环而言指的是list已经到底,对while循环而言指的是条件式变成false)。但是,若是在非正常结束(因为break叙述)的情况下else子句的程序代码就不会执行。底下的例子是一个循环,用来找出所有的质数:2isaprimenumber3isaprimenumber4equals2*25isaprimenumber6equals2*37isaprimenumber8equals2*49equals3*3*pass叙述什么也不做,通常是用在当你的程序的语法上需要有一个叙述,但是却不需要做任何事的时候。例子如下:>>>while1:...pass#Busy-waitforkeyboardinterrupt...程序在设计阶段,把一些类、函数、接口等都定义好,但是还没有实现的情况下,一般用pass表示,如下:>>>classCBaseOpt:...pass...>>>deffun():...pass*在这个程序中,首先,我们检验变量running是否为True,然后执行后面的while-块。在执行了这块程序之后,再次检验条件,在这个例子中,条件是running变量。如果它是真的,我们再次执行while-块,否则,我们继续执行可选的else-块,并接着执行下一个语句。当while循环条件变为False的时候,else块才被执行——这甚至也可能是在条件第一次被检验的时候。如果while循环有一个else从句,它将始终被执行,除非你的while循环将永远循环下去不会结束!number=23running=Truewhilerunning:    guess=int(raw_input('Enteraninteger:'))    ifguess==number:        print'Congratulations,youguessedit.'        running=False#thiscausesthewhilelooptostop    elifguess>>try:...open('myfile.txt').read()...exceptIOError,(errno,strerror):...print"I/Oerror(%s):%s"%(errno,strerror)...exceptValueError:...print"Couldnotconvertdatatoaninteger."...except:...print"Unexpectederror:",sys.exc_info()[0]...raise...else:...print'noexcept!'...I/Oerror(2):Nosuchfileordirectorytry...except的叙述有一个可有可无的else子句(elseclause)可以使用,当这个子句存在时,必须是放在所有的exceptclauses的后面。这个子句里的叙述是当try子句没有发生任何exception时,一定要执行的叙述except可以嵌套,不过一般是外面的比里面的要大,比如except:就包含了所有的异常。*>>>try:...open('myfile.txt').read()...finally:...print'finally!'...发生异常后,也会保证finally里的语句会执行。运行结果:finally!Traceback(mostrecentcalllast):File"",line2,in?IOError:[Errno2]Nosuchfileordirectory:'myfile.txt'*后续会详细介绍,这是个好东东,也是Python的一大特性。*函数的定义函数的参数函数的自省函数的作用域嵌套函数*函数是重用的程序段。它们允许你给一块语句一个名称,然后你可以在你的程序的任何地方使用这个名称任意多次地运行这个语句块。这被称为调用函数。我们已经使用了许多内建的函数,比如len和range。函数通过def关键字定义。def关键字后跟一个函数的标识符名称,然后跟一对圆括号。圆括号之中可以包括一些变量名,该行以冒号结尾。接下来是一块语句,它们是函数体。如下简单函数:defsayHello():    print'HelloWorld!'#blockbelongingtothefunctionsayHello()#callthefunction*函数形参形参是函数的参数名称。如a、b函数实参提供给函数调用的值为实参。如3、4、x、y;在第一个printMax使用中,我们直接把数,即实参,提供给函数。在第二个使用中,我们使用变量调用函数。printMax(x,y)使实参x的值赋给形参a,实参y的值赋给形参b。defprintMax(a,b):    ifa>b:        printa,'ismaximum'    else:        printb,'ismaximum'printMax(3,4)x=5y=7printMax(x,y)deffunc(a,b=5,c=10):    print'ais',a,'andbis',b,'andcis',cfunc(3,7)func(25,c=24)func(c=50,a=100)在第一次使用函数的时候,func(3,7),参数a得到值3,参数b得到值7,而参数c使用默认值10。在第二次使用函数func(25,c=24)的时候,根据实参的位置变量a得到值25。根据命名,即关键参数,参数c得到值24。变量b根据默认值,为5。在第三次使用func(c=50,a=100)的时候,我们使用关键参数来完全指定参数值。注意,尽管函数定义中,a在c之前定义,我们仍然可以在a之前指定参数c的值。名为func的函数有一个没有默认值的参数,和两个有默认值的参数。*如果用过C语言中的printf(),那么就会对参数个数可变的意义比较了解。在Python中*表示接受任意多个参数,除了前面的参数后,多余的参数都作为一个tuple传递给函数printf,可以通过arg来访问。>>>defprintf(format,*arg):...printformat%arg...>>>printf("%disgreaterthan%d",1,2)1isgreaterthan2>>>defprintf(format,**keyword):...forkinkeyword.keys():...print"keyword[%s]is%s"%(k,keyword[k])...>>>printf("ok",One=1,Two=2,Three=3)keyword[Three]is3keyword[Two]is2keyword[One]is1还可以把这两中机制和可选参数机制合在一起使用。函数接受参数的顺序,先接受固定参数,然后是可选参数,然后是接受任意参数,最后是带名字的任意参数。还有种形式可以实现任意多个参数,就是按照dictionary方式传递给函数。同上一种机制,只不过**keyword是用**表示接受任意多个有名字的参数传递,调用时要指定参数的名字,如One、Two、Three等。>>>deftestfun(fixed,optional=1,*arg,**keywords):...print"fixedparametersis",fixed...print"optionalparameteris",optional...print"Arbitraryparameteris",arg...print"keywordsparameteris",keywords...>>>testfun(1,2,"a","b","c",one=1,two=2,three=3)fixedparametersis1optionalparameteris2Arbitraryparameteris('a','b','c')keywordsparameteris{'three':3,'two':2,'one':1}*defprintMax(x,y):    '''Printsthemaximumoftwonumbers.    Thetwovaluesmustbeintegers.'''    x=int(x)#converttointegers,ifpossible    y=int(y)    ifx>y:        printx,'ismaximum'    else:        printy,'ismaximum'printMax(3,5)printprintMax.__doc__5ismaximumPrintsthemaximumoftwonumbers.        Thetwovaluesmustbeintegers.运行后的输出:在函数的第一个逻辑行的字符串是这个函数的文档字符串。注意,自省也适用于模块和类。文档字符串的惯例是一个多行字符串,它的首行以大写字母开始,句号结尾。第二行是空行,从第三行开始是详细的描述。可以使用__doc__(注意双下划线)调用printMax函数的文档字符串属性。请记住Python把每一样东西都作为对象,包括这个函数。自动化工具也可以从程序中提取文档。因此,强烈建议所写的任何正式函数编写文档字符串。随着Python发行版附带的pydoc命令,与help()类似地使用DocStrings。*Python按照LGB 规则 编码规则下载淘宝规则下载天猫规则下载麻将竞赛规则pdf麻将竞赛规则pdf 找变量,先找localnamespace(局部命名空间),再找globalnamespace(全局命名空间),然后再找buildinnamespace(内在命名空间)用global语句可以改变某些变量的命名空间。>>>a=1>>>deftestfun():...a=2...printa...>>>testfun()2>>>a1>>>a=1>>>deftestfun():...globala...a=2...printa...>>>testfun>>>testfun()2>>>a2函数testfun()中的a是localnamespace中,修改a不会改变globalnamespace中的a但是,用global语句可以修改一个变量的所在的namespace。*>>>defoutfun(a,b):...definnerfun(x,y):...returnx+y...returninnerfun(a,b)...>>>outfun(1,2)3这个在C语言是不容许的,因为C中的static函数可以替代这种功能。这种机制提供了一个函数范围的概念,某些函数只在某些函数的内部,才看得到,如果要公开,可以通过返回值,将内部函数返回。注意,嵌套函数不能访问外层函数的变量。*类定义类/类实例属性类继承类中的一些特殊方法重载特殊方法用法举例*classPerson:#<1>    def__init__(self,name):#<2>        self.name=name#<3>    defsayHi(self):#<4>        print'Hello,mynameis',self.namep=Person('Swaroop')p.sayHi()类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称,但是在调用这个方法的时候你不为这个参数赋值,Python会提供这个值。这个特别的变量指对象本身,按照惯例它的名称是self。Python中的self等价于C++中的self指针和Java、C#中的this参考。为何不需要给self赋值。举一个例子会使此变得清晰。假如你有一个类称为MyClass和这个类的一个实例MyObject。当你调用这个对象的方法MyObject.method(arg1,arg2)的时候,这会由Python自动转为MyClass.method(MyObject,arg1,arg2)——这就是self的原理了。这也意味着如果你有一个不需要参数的方法,你还是得给这个方法定义一个self参数。<1>我们使用class语句后跟类名,创建了一个新的类。这后面跟着一个缩进的语句块形成类体。<2>__init__方法在类的一个对象被建立时,马上运行。这个方法可以用来对你的对象做一些你希望的初始化。<3>self.name是成员变量。<4>sayHi是成员方法。*对象的变量由类的每个对象/实例拥有。因此每个对象有自己对这个域的一份拷贝,即它们不是共享的,在同一个类的不同实例中,虽然对象的变量有相同的名称,但是是互不相关的。通过一个例子会使这个易于理解。Python分类的变量和对象的变量,它们根据是类还是对象拥有这个变量而区分。类的变量由一个类的所有对象(实例)共享使用。只有一个类变量的拷贝,所以当某个对象对类的变量做了改动的时候,这个改动会反映到所有其他的实例上。Python利用这个实现了C++中的静态成员变量,就是同一个class的不同instance共享同一个变量。*运行结果:classPerson:    population=0    def__init__(self,name):        self.name=name        print'(Initializing%s)'%self.name        Person.population+=1    def__del__(self):        print'%ssaysbye.'%self.name        Person.population-=1        ifPerson.population==0:            print'Iamthelastone.'        else:            print'Therearestill%dpeopleleft.'%Person.population    defsayHi(self):        print'Hi,mynameis%s.'%self.name    defhowMany(self):        ifPerson.population==1:            print'Iamtheonlypersonhere.'        else:            print'Wehave%dpersonshere.'%Person.populationswaroop=Person('Swaroop')swaroop.sayHi()swaroop.howMany()kalam=Person('AbdulKalam')kalam.sayHi()kalam.howMany()swaroop.sayHi()swaroop.howMany()(InitializingSwaroop)Hi,mynameisSwaroop.Iamtheonlypersonhere.(InitializingAbdulKalam)Hi,mynameisAbdulKalam.Wehave2personshere.Hi,mynameisSwaroop.Wehave2personshere.AbdulKalamsaysbye.Therearestill1peopleleft.Swaroopsaysbye.Iamthelastone.*对于继承和C++一样,只是比C++中的继承更简单,没有了一堆什么私有公有继承。classSchoolMember:    def__init__(self,name,age):        self.name=name        self.age=age        print'(InitializedSchoolMember:%s)'%self.name    deftell(self):        print'Name:"%s"Age:"%s"'%(self.name,self.age),classTeacher(SchoolMember):    def__init__(self,name,age,salary):        SchoolMember.__init__(self,name,age)        self.salary=salary        print'(InitializedTeacher:%s)'%self.name    deftell(self):        SchoolMember.tell(self)        print'Salary:"%d"'%self.salaryclassStudent(SchoolMember):    def__init__(self,name,age,marks):        SchoolMember.__init__(self,name,age)        self.marks=marks        print'(InitializedStudent:%s)'%self.name    deftell(self):        SchoolMember.tell(self)        print'Marks:"%d"'%self.markst=Teacher('Mrs.Shrividya',40,30000)s=Student('Swaroop',22,75)print#printsablanklinemembers=[t,s]formemberinmembers:    member.tell()(InitializedSchoolMember:Mrs.Shrividya)(InitializedTeacher:Mrs.Shrividya)(InitializedSchoolMember:Swaroop)(InitializedStudent:Swaroop)Name:"Mrs.Shrividya"Age:"40"Salary:"30000"Name:"Swaroop"Age:"22"Marks:"75"运行结果:Python和JAVA一样也支持多重继承,这里不介绍了。*Class中有很多的特殊方法,像前面讲的__init__就是其中一个,下面我们再列举几个:__init__前面已经介绍,就是在对象创建时被自动调用,用于初试化;__del__前面也介绍了,在对象删除时被自动调用,可以做些我们的收尾工作;__repr__使用repr(obj)时自动调用,返回和eval()兼容的对象字符串eval(repr(obj));__str__使用str(obj)时自动调用,返回对象的字符串描述;__cmp__比较操作符,0表示相等,1表示大于,-1表示小于;__hash__返回一个32位的hashvalue,一般将对象hash后用作dictionary的key;__nozero__定义对象是否是逻辑假,返回0表示逻辑假,返回1表示逻辑真;__len__使用len(obj)时自动调用,返回对象的长度;__getitem__返回self[key]用来模拟list、dictionary等数据结构;__setitem__设置self[key],模拟self[key]=value;__delitem__模拟delself[key],调用这个函数;__contain__可以使对象像队列一样,处理in语句;__call__使对象像函数一样,可以调用,如obj(arg)。*重载__setattr__实现只读属性:classA:readonlyValue=100def__setattr__(self,attr,value):ifattr=="readonlyValue":raise"cannotchangethereadonlyvalue“a=A()printa.readonlyValuea.readonlyValue=102在给对象某个set值时会自动调用__setattr__,接受的参数分别是,对象本身(self),attribute的名字(attr),和要设的值(value)。那么重载__setattr__就可以实现我们想保护的属性。运行结果:100Traceback(mostrecentcalllast):File"readonlyattr.py",line12,in?a.readonlyValue=102File"readonlyattr.py",line7,in__setattr__raise"cannotchangethereadonlyvalue"cannotchangethereadonlyvalue*重载__getattr__实现对象组合:classB:defprintMe(self):print"IamB"defprintOk(self):print"Bsay:OK"classC:defprintMe(self):print"IamC"defprintOk(self):print"Csay:OK"classA:__realobj__=B()def__getattr__(self,attr):returngetattr(self.__realobj__,attr)defprintMe(self):print"IamA“a=A()a.__realobj__=B()a.printMe()a.printOk()a.__realobj__=C()a.printMe()a.printOk()实现__getattr__,可以通过组合对象的方法,代替继承机制。类继承和组合对象是面向对象的两种常用复用代码的方式,但是有个原则:优先使用组合,而不是继承。这个例子就是利用attribute的搜索算法,__getattr__是最后一步,也就是说如果在自身对象或者直接/间接的对象中找不到某个属性,那么就会通过__getattr__转嫁到__realobj__上了,从而实现对象的组合。IamABsay:OKIamACsay:OK运行结果:*利用setattr为对象动态增加attribute:classA:def__init__(self,**kws):fork,vinkws.items():setattr(self,k,v)defDumpObj(self):fork,vinvars(self).items():print"%10s:%s"%(k,v)D={"one":1,"two":2,"three":3}a=A(five=5,six=6)fork,vinD.items():setattr(a,k,v)DumpObj(a)从这个例子看出,其实一个对象也就是一个dicationary的高级数据结构。one:1six:6five:5three:3two:2运行结果:*对象工厂实现:classObjFactory:def__init__(self,clsobj=None,*args,**keyargs):self.clsobj=clsobjandclsobjorself.__class__self.args=argsself.keyargs=keyargsdefcreateObj(self):returnself.clsobj(*self.args,**self.keyargs)classtestClass:def__init__(self,value1,value2,*args,**keyargs):fork,vinkeyargs.items():setattr(self,k,v)self.args=argsself.value1=value1self.value2=value2defDumpObj(self):fork,vinvars(self).items():print"%10s:%s"%(k,v)f=ObjFactory(testClass,100,200,300,one=1,two=2,three=3)DumpObj(f.createObj())对象工厂是生产对象的地方,在C++中,为了灵活的生成不同的对象,采用了很多办法,在Python中更简单,表达更加紧凑,原因就是在Python中class本身就是一个对象。one:1value2:200value1:100args:(300,)three:3two:2运行结果:*
本文档为【可爱的Python编程】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
机构认证用户
爱赢
公司经营范围:网络软件设计、制作、图文设计、影视制作(编辑)
格式:ppt
大小:2MB
软件:PowerPoint
页数:0
分类:教育学
上传时间:2021-02-25
浏览量:5