您的位置:首页 > 编程语言 > Python开发

python读书笔记-《A Byte of Python》中文第三版后半部分

2015-12-14 13:43 691 查看
编辑器:windows,linux不要用notepad,缩进糟糕--------------[align=left]5.18缩进[/align][align=left]同一层次的语句必须有相同的缩进。每一组这样的语句称为一个块。[/align][align=left]1i=5[/align][align=left]2print('Valueis',i)#Error!Noticeasinglespaceatthestart[/align][align=left]oftheline行首有空格[/align][align=left]3print('Irepeat,thevalueis',i)[/align][align=left]当你运行的时候,会得到下面的出错信息:[/align][align=left]1File"whitespace.py",line4[/align][align=left]2print('Valueis',i)#Error!Noticeasinglespaceatthestart[/align][align=left]oftheline[/align][align=left]3^[/align][align=left]4IndentationError:unexpectedindent[/align]-------------[align=left]如何缩进[/align][align=left]不要混合使用制表符和空格来缩进,因为这在跨越不同的平台的时候,无法正常工作。我强烈建[/align][align=left]议你在每个缩进层次使用单个制表符或两个或四个空格。[/align][align=left]----------[/align][align=left]给静态语言程序员的注释:[/align][align=left]Python总是使用缩进来代表代码块,不再使用括号。[/align][align=left]--------------------------------------------------------------------------------[/align][align=left]第七章控制流[/align][align=left]7.2if语句[/align][align=left]#!/usr/bin/python[/align][align=left]2#Filename:if.py[/align][align=left]3[/align][align=left]4number=23[/align][align=left]5guess=int(input('Enteraninteger:'))[/align][align=left]6[/align][align=left]7ifguess==number:[/align][align=left]8print('Congratulations,youguessedit.')#Newblockstarts[/align][align=left]here[/align][align=left]9print('(butyoudonotwinanyprizes!)')#Newblockendshere[/align][align=left]10elifguess<number:[/align][align=left]11print('No,itisalittlehigherthanthat')#Anotherblock[/align][align=left]12#Youcandowhateveryouwantinablock...[/align][align=left]13else:[/align][align=left]14print('No,itisalittlelowerthanthat')[/align][align=left]15#youmusthaveguess>numbertoreachhere[/align][align=left]16print('Done')[/align][align=left]17#Thislaststatementisalwaysexecuted,aftertheifstatementis[/align][align=left]executed[/align][align=left]-----------[/align][align=left]注意:input()与raw_input()的区别[/align][align=left]网上:前者可以计算数值,后者表示字符串[/align][align=left]--------------[/align][align=left]最简单的有效if语句是:[/align][align=left]1ifTrue:[/align][align=left]2print('Yes,itistrue')[/align][align=left]---------------------------------[/align][align=left]while语句[/align][align=left]#!/usr/bin/python[/align][align=left]2#Filenamewhile.py[/align][align=left]3[/align][align=left]4number=23[/align][align=left]5running=True[/align][align=left]6[/align][align=left]7whilerunning:[/align][align=left]8guess=int(input("Enteraninteger:"))[/align][align=left]9[/align][align=left]10ifguess==number:[/align][align=left]11print("Congratulation,youguessedit.")[/align][align=left]12running=False#thiscausesthewhilelooptostop[/align][align=left]13elifguess<number:[/align][align=left]14print("No,itisalittlehigher.")[/align][align=left]15else:[/align][align=left]16print("No,itisalittlelower.")[/align][align=left]17else:[/align][align=left]18print("thewhileloopisover.")[/align][align=left]19#Doanythingelseyouwanttodohere[/align][align=left]20[/align][align=left]21print("done")[/align][align=left]输出:[/align][align=left]1$pythonwhile.py[/align][align=left]2Enteraninteger:50[/align][align=left]3No,itisalittlelowerthanthat.[/align][align=left]4Enteraninteger:22[/align][align=left]5No,itisalittlehigherthanthat.[/align][align=left]6Enteraninteger:23[/align][align=left]7Congratulations,youguessedit.[/align][align=left]8Thewhileloopisover.[/align][align=left]9Done[/align][align=left]-------------------[/align][align=left]7.4for循环[/align][align=left]#!/usr/bin/python[/align][align=left]2#Filename:for.py[/align][align=left]3[/align][align=left]4foriinrange(1,5):[/align][align=left]5print(i)[/align][align=left]6else:[/align][align=left]7print('Theforloopisover')[/align][align=left]输出:[/align][align=left]1$pythonfor.py[/align][align=left]21[/align][align=left]32[/align][align=left]43[/align][align=left]54[/align][align=left]6Theforloopisover[/align][align=left]-------------[/align][align=left]这个序列从第一个数开[/align][align=left]始到第二个数为止。例如,range(1,5)给出序列[1,2,3,4]。默认地,range的步长[/align][align=left]为1。如果我们为range提供第三个数,那么它将成为步长。例如,range(1,5,2)给出[/align][align=left][1,3]。记住,range向上延伸到第二个数,即它不包含第二个数。[/align][align=left]--------------[/align][align=left]在C/C++中,如果你想要写for(inti=0;i<5;i++),那么用Python,你写成foriin[/align][align=left]range(0,5)。[/align][align=left]-------------[/align][align=left]7.5break语句[/align][align=left]break语句是用来终止循环语句的,即哪怕循环条件没有变为False或序列还没有[/align][align=left]被完全迭代结束,也停止执行循环语句。[/align][align=left]一个重要的注释是,如果你从for或while循环中终止,任何对应的循环else块[/align][align=left]将不执行。[/align][align=left]#!/usr/bin/python[/align][align=left]2#Filename:break.py[/align][align=left]3[/align][align=left]4whileTrue:[/align][align=left]5s=(input('Entersomething:'))[/align][align=left]6ifs=='quit':[/align][align=left]7break[/align][align=left]8print('Lengthofthestringis',len(s))[/align][align=left]9print('Done')[/align][align=left]输出:[/align][align=left]1$pythonbreak.py[/align][align=left]2Entersomething:Programmingisfun[/align][align=left]3Lengthofthestringis18[/align][align=left]4Entersomething:Whentheworkisdone[/align][align=left]5Lengthofthestringis21[/align][align=left]6Entersomething:ifyouwannamakeyourworkalsofun:[/align][align=left]7Lengthofthestringis37[/align][align=left]8Entersomething:usePython![/align][align=left]9Lengthofthestringis12[/align][align=left]10Entersomething:quit[/align][align=left]11Done[/align][align=left]-------------------------[/align][align=left]7.7continue语句[/align][align=left]continue语句被用来告诉Python跳过当前循环块中的剩余语句,然后继续进行下[/align][align=left]一轮循环。[/align][align=left]-----------------------------------------------------------------------------[/align][align=left]第八章函数[/align][align=left]函数用关键字def来定义。def关键字后跟一个函数的标识符名称,然后跟一对[/align][align=left]圆括号。圆括号之中可以包括一些变量名,该行以冒号结尾。接下来是一块语句,它[/align][align=left]们是函数体。[/align][align=left]defsayHello():[/align][align=left]5print('HelloWorld!')#blockbelongingtothefunction[/align][align=left]6#Endoffunction[/align][align=left]7sayHello()#callthefunction[/align][align=left]8sayHello()#callthefunctionagain[/align][align=left]----------------[/align][align=left]8.2函数的参数[/align][align=left]defprintMax(a,b):[/align][align=left]5ifa>b:[/align][align=left]6print(a,'ismaximum')[/align][align=left]7elifa==b:[/align][align=left]8print(a,'isequalto',b)[/align][align=left]9else:[/align][align=left]10print(b,'ismaximum')[/align][align=left]printMax(3,4)#directlygiveliteralvaluse[/align][align=left][/align][align=left]x=5[/align][align=left]y=7[/align][align=left]printMax(x,y)#givevariablesasarguments[/align][align=left][/align][align=left]在第一个printMax使用中,我们直接把数,即实参,提供给函数。在第二个使用[/align][align=left]中,我们使用变量调用函数。printMax(x,y)使实参x的值赋给形参a,实参y的值赋[/align][align=left]给形参b。[/align][align=left]-------------------[/align][align=left]8.4使用全局语句[/align][align=left]没有global语句,是不可能为定义在函数外的变量赋值的。[/align][align=left]1#!/usr/bin/python[/align][align=left]2#Filename:func_global.py[/align][align=left]3[/align][align=left]4x=50[/align][align=left]5[/align][align=left]6deffunc():[/align][align=left]7globalx[/align][align=left]8[/align][align=left]9print('xis',x)[/align][align=left]10x=2[/align][align=left]11print('Changedglobalxto',x)[/align][align=left]12[/align][align=left]13func()[/align][align=left]14print('Valueofxis',x)[/align][align=left]-------------[/align][align=left]global语句被用来声明x是全局的——因此,当我们在函数内把值赋给x的时[/align][align=left]候,这个变化也反映在我们在主块中使用x的值的时候。[/align][align=left]你可以使用同一个global语句指定多个全局变量。例如globalx,y,z。[/align][align=left]-------------[/align][align=left]8.5使用非局部语句(nonlocal(3.X的特性)[/align][align=left]非局部作用域在你定义函数内的函数时会看到。[/align][align=left]由于在Python中,任何事物是可执行的代码,你可以在任何地方定义函数。[/align][align=left]#!/usr/bin/python[/align][align=left]2#Filename:func_nonlocal.py[/align][align=left]3[/align][align=left]4deffunc_outer():[/align][align=left]5x=2[/align][align=left]6print('xis',x)[/align][align=left]7[/align][align=left]8deffunc_inner():[/align][align=left]9nonlocalx[/align][align=left]10x=5[/align][align=left]11[/align][align=left]12func_inner()[/align][align=left]13print('Changedlocalxto',x)[/align][align=left]14[/align][align=left]15func_outer()[/align][align=left]-------------[/align][align=left]nonlocal的理解:局部内的全局语句。[/align][align=left]在外函数中定义了一个局部变量,当在外函数内部再建立一个内函数,并想让内函数内的变量在整个外函数内是全局的,[/align][align=left]就可以用nonlocal[/align][align=left]-------------------------------[/align][align=left]8.6默认参数值[/align][align=left]在函数定义的形参名后加上赋值运算符(=)和默认值,从而给形参指定默认参数值。[/align][align=left]注意,默认参数值应该是一个参数。更加准确的说,默认参数值应该是不可变的[/align][align=left]4defsay(message,times=1):[/align][align=left]5print(message*times)[/align][align=left]6[/align][align=left]7say('Hello')[/align][align=left]8say('World',5)[/align][align=left]输出:[/align][align=left]1$pythonfunc_default.py[/align][align=left]2Hello[/align][align=left]3WorldWorldWorldWorldWorld[/align][align=left]-------------------[/align][align=left]重要的:[/align][align=left]只有在形参表末尾的那些参数可以有默认参数值,即你不能在声明函数形参的时候,先声明有默[/align][align=left]认值的形参而后声明没有默认值的形参。这是因为赋给形参的值是根据位置而赋值的。例如,def[/align][align=left]func(a,b=5)是有效的,但是deffunc(a=5,b)是无效的。[/align][align=left]------------------------[/align][align=left]8.7关键参数[/align][align=left]如果某个函数有许多参数,而你只想指定其中的一部分,可以通过命名来为这些参数赋值——这被称作关键参数——我们使用名字(关键字)而不是位置(我们前面所一直使用的方法)来给函数指定实参。[/align][align=left]4deffunc(a,b=5,c=10):[/align][align=left]5print('ais',a,'andbis',b,'andcis',c)[/align][align=left]6[/align][align=left]7func(3,7)[/align][align=left]8func(25,c=24)[/align][align=left]9func(c=50,a=100)[/align][align=left]-------------[/align][align=left]8.8VarArgs参数[/align][align=left]定义一个能获取任意个数参数的函数,这可通过使用*号来实现。[/align][align=left]4deftotal(initial=5,*numbers,**keywords):[/align][align=left]5count=initial[/align][align=left]6fornumberinnumbers:[/align][align=left]7count+=number[/align][align=left]8forkeyinkeywords:[/align][align=left]9count+=keywords[key][/align][align=left]10returncount[/align][align=left]11[/align][align=left]12print(total(10,1,2,3,vegetables=50,fruits=100))[/align][align=left]----------------[/align][align=left]8.10return语句[/align][align=left]4defmaximum(x,y):[/align][align=left]5ifx>y:[/align][align=left]6returnx[/align][align=left]7else:[/align][align=left]8returny[/align][align=left]9[/align][align=left]10print(maximum(2,3))[/align][align=left]注意,没有返回值的return语句等价于returnNone。None是Python中表示没有任何东西的特殊类型。[/align][align=left]---------------[/align][align=left]8.11DocStrings[/align][align=left]文档字符串,它通常被简称为docstrings。[/align][align=left]DocStrings是一个重要的工具,由于它帮助你的程序文档更加简单易懂[/align][align=left]在函数的第一个逻辑行的字符串是这个函数的文档字符串。[/align][align=left]文档字符串的惯例是一个多行字符串,它的首行以大写字母开始,句号结尾。第[/align][align=left]二行是空行,从第三行开始是详细的描述。[/align][align=left]你可以使用__doc__(注意双下划线)调用printMax函数的文档字符串属性(属[/align][align=left]于函数的名称)。请记住Python把每一样东西都作为对象[/align][align=left]deffun():'''thedocoffun,funisalsoanabstract,canuseinhelp()'''globalx#stateoverallvarbyusingglobalvarinfunx=2print"xis:",x,"\n"x=50print"xis:",x,"\n"print"Aftergoingtofun:\n"fun()printfun.__doc__[/align][align=left][/align][align=left]shell中运行:[/align][align=left]>>help(fun)Helponfunctionfuninmodule__main__:fun()thedocoffun,funisalsoanabstract[/align][align=left]---------------------------------------------------------------[/align][align=left]第九章模块[/align]
#!/usr/bin/python#Filename:using_sys.py
import
sys
print
'Thecommandlineargumentsare:'
for
i
in
sys
.argv:
print
i
print
'\n\nThePYTHONPATHis'
,
sys
.path,
'\n'
sys
模块包含了与Python解释器和它的环境有关的函数。[align=left]如果它是未编译的模块,如用Python写的模块,Python解释器会查找列[/align][align=left]在sys.path变量中的路径。如果模块找到了,就会运行那个模块主体中的语句,[/align][align=left]模块就是可以利用的了。[/align][align=left]在sys模块中,argv变量可以用sys.argv来引用。它很清楚地表明这个名字[/align][align=left]是sys模块中的一部分。这种方法的一个优势是这个名称不会与任何在你的程序中使[/align][align=left]用的argv变量冲突。[/align][align=left]记住,脚本的名称总是sys.argv列表的第一个参数。所以,在这里,’using_sys.py’[/align][align=left]是sys.argv[0]、’we’是sys.argv[1]、’are’是sys.argv[2]以及’arguments’是sys.argv[3]。[/align][align=left]-----------------[/align][align=left]9.3from...import...语句[/align][align=left]如果你想要直接输入argv变量到你的程序中(避免在每次使用它时打sys.),那[/align][align=left]么你可以使用fromsysimportargv语句。如果你想要输入所有sys模块使用的名字,[/align][align=left]那么你可以使用fromsysimport*语句。[/align][align=left]--[/align][align=left].pyc文件:字节编译的文件。他已经完成了一部分模块的处理,下次运行会更快,而且与平台无关。[/align][align=left]--------------[/align][align=left]9.4模块的__name__[/align][align=left]每个模块都有一个名称,在模块中可以通过语句来找出模块的名称。[/align][align=left]当一个模块被第一次输入的时候,这个模块的[/align][align=left]主块将被运行。假如我们只想在程序本身被使用的时候运行主块,而在它被别的模块[/align][align=left]输入的时候不运行主块,我们该怎么做呢?这可以通过模块的__name__属性完成。[/align][align=left]例子:[/align][align=left]1#!/usr/bin/python[/align][align=left]2#Filename:using_name.py[/align][align=left]3[/align][align=left]4if__name__=='__main__':[/align][align=left]5print('Thisprogramisbeingrunbyitself')[/align][align=left]6else:[/align][align=left]7print('Iambeingimportedfromanothermodule')[/align][align=left]输出:[/align][align=left]1$pythonusing_name.py[/align][align=left]2Thisprogramisbeingrunbyitself[/align][align=left]3$python[/align][align=left]4>>>importusing_name[/align][align=left]5Iambeingimportedfromanothermodule[/align][align=left]如何工作:[/align][align=left]每个Python模块都有它的__name__,如果它是’__main__’,这说明这个模块被[/align][align=left]用户单独运行,我们可以进行相应的恰当操作。[/align][align=left]--------[/align][align=left]9.5创建自己的模块(***)[/align][align=left]模块应该被放置在我们输入它的程序的同一个目录中,或者在sys.path[/align][align=left]所列目录之一。[/align]#第一个例子
#!/usr/bin/python#Filename:mymodule.py
def
sayhi
():
print
'Hi,thisismymodulespeaking.'
version=
'0.1'
#Endofmymodule.py#第二个例子
#!/usr/bin/python
#Filename:mymodule_demo.py
import
mymodule
mymodule.sayhi()
print
'Version'
,mymodule.version
[align=left][/align][align=left]输出:[/align][align=left]1$pythonmymodule_demo.py[/align][align=left]2Hi,thisismymodulespeaking.[/align][align=left]3Version0.1[/align][align=left][/align][align=left]第二个版本:[/align][align=left]3[/align][align=left]4frommymoduleimportsayhi,__version__[/align][align=left]5[/align][align=left]6sayhi()[/align][align=left]7print('Version',__version__)[/align][align=left]如果已经在导入mymodule的模块中申明了一个__version__的名字,这就[/align][align=left]会有冲突。这也是有可能的,因为从实际情况来看,每个模块会用这个名字来申明它[/align][align=left]的版本。因此,推荐选择使用import语句,虽然会导致程序稍微有点冗长。[/align][align=left]你也可以这样使用:[/align][align=left]1frommymoduleimport*[/align][align=left]这会导入像sayhi这样公用的名字,但不会导入__version__,因为它是以双下划[/align][align=left]线开始的。[/align][align=left]--------------[/align][align=left]9.6dir函数[/align][align=left]使用内建的dir函数来列出模块定义的标识符。标识符有函数、类和变量。[/align][align=left]当你为dir()提供一个模块名的时候,它返回模块定义的名称列表。如果不提供[/align][align=left]参数,它返回当前模块中定义的名称列表。[/align][align=left]1$python[/align][align=left]2>>>importsys#getlistofattributes,inthiscase,forthesys[/align][align=left]module[/align][align=left]3>>>dir(sys)[/align][align=left]4['__displayhook__','__doc__','__excepthook__','__name__',[/align][align=left]5'__package__','__s[/align][align=left]6tderr__','__stdin__','__stdout__','_clear_type_cache',[/align][align=left]……………………………………[/align][align=left]27>>>dir()#getlistofattributesforcurrentmodule[/align][align=left]28['__builtins__','__doc__','__name__','__package__','sys'][/align][align=left]29>>>a=5#createanewvariable'a'[/align][align=left]30>>>dir()[/align][align=left]31['__builtins__','__doc__','__name__','__package__','a','sys'][/align][align=left]32>>>dela#delete/removeaname[/align][align=left]33>>>dir()[/align][align=left]34['__builtins__','__doc__','__name__','__package__','sys'][/align][align=left]---------------[/align][align=left]9.7包[/align][align=left]包是模块的文件夹,有一个特殊的__init__.py文件,用来表明这个文件夹是特殊[/align][align=left]的因为其包含有Python模块。[/align][align=left]假如你想创建一个叫做’world’的包,有子包’asia’,’africa’等等,并且,这些子包[/align][align=left]又包含模块,如’india’,’madagascar’等等。[/align][align=left]这就是你想构造的文件夹:[/align][align=left]---------------[/align][align=left]第十章:数据结构[/align][align=left]python的三种内建数据结构:列表、元组、字典。[/align][align=left]序列、应用、字符串[/align][align=left]列表(list)是处理一组有序项目的数据结构,在每个项目之间用逗号分割。[/align][align=left]如:shoplist=['apple','carrot','banana'][/align][align=left]列表是可变的数据类型。[/align][align=left]类的函数append(),在列表尾添加项目,用法是mylist.append('string')[/align][align=left]列表也是序列,可以使用del()删除某个元素,用sort()排序会影响列表本身。[/align][align=left]元组和列表相似,但是不可修改。[/align][align=left]元组通过圆括号中用逗号分割的项目定义。通常用在使语句或用户定义的函数能够安全地采用一组值的时候。[/align][align=left]如:zoo=('lion','tiger','panda')[/align][align=left]包含0个元素的元组是tuple=(),包含2个元素的元组是tuple=(2,)[/align][align=left]字典:把键(名字)和值(详细情况)联系在一起。[/align][align=left]如:dictionary={key1:value1,key2:value2}[/align][align=left]取值:dictionary[key1][/align][align=left]注意,键必须是唯一的。键不可变。值可以变。[/align][align=left]字典没有顺序。del可以删除字典的每个键值对。[/align][align=left]序列:列表、元组和字符串都是序列。[/align][align=left]序列的两个主要特点是索引操作符和切片操作符。[/align][align=left]索引操作符让我们可以从序列中抓取一个特定项目。切片操作符让我们能够获取序列的一个切片,即一部分序列。[/align][align=left]对象与引用:[/align][align=left]创建一个对象并给它赋一个变量时,这个变量仅仅引用那个对象,而不是表示这个对象本身![/align][align=left]也就是,变量名指向你计算机中存储那个对象的内存。这被称作名称到对象的绑定。[/align][align=left]字符串:[/align][align=left]str类有以一个作为分隔符的字符串join序列的项目的整洁的方法,它返回一个生成的大字符串。[/align][align=left]---------------[/align]第十一章:解决问题编写一个压缩备份程序---------------第十二章:面向对象编程对象可以使用普通的属于对象的变量存储数据。属于一个对象或类的变量被称为域。对象也可以使用属于类的函数来具有功能。这样的函数被称为类的方法。这些术语帮助我们把它们与孤立的函数和变量区分开来。域和方法可以合称为类的属性。域有两种类型——属于每个实例/类的对象或属于类本身。它们分别被称为实例变量和类变量。类使用class关键字创建。类的域和方法被列在一个缩进块中。-------[align=left]12.2self[/align][align=left]类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称,[/align][align=left]但是在调用这个方法的时候你不为这个参数赋值,Python会提供这个值。[/align][align=left]这个特别的变量指对象本身,按照惯例它的名称是self。[/align][align=left]12.3类[/align][align=left]一个尽可能简单的类如下面这个例子所示。[/align][align=left]1#!/usr/bin/python[/align][align=left]2#Filename:simplestclass.py[/align][align=left]3[/align][align=left]4classPerson:[/align][align=left]5pass#Anemptyblock[/align][align=left]6[/align][align=left]7p=Person()[/align][align=left]8print(p)[/align][align=left]输出:[/align][align=left]1$pythonsimplestclass.py[/align][align=left]2<__main__.Personobjectat0x019F85F0>[/align][align=left]我们使用class语句后跟类名,创建了一个新的类。这后面跟着一个缩进的语句[/align][align=left]块形成类体。在这个例子中,我们使用了一个空白块,它由pass语句表示。[/align][align=left]接下来,我们使用类名后跟一对圆括号来创建一个对象/实例。[/align][align=left]classPerson:[/align][align=left]5defsayHi(self):[/align][align=left]6print('Hello,howareyou?')[/align][align=left]7[/align][align=left]8p=Person()[/align][align=left]9p.sayHi()[/align][align=left]10#ThisshortexamplecanalsobewrittenasPerson().sayHi()[/align][align=left]输出:[/align][align=left]1$pythonmethod.py[/align][align=left]2Hello,howareyou?[/align][align=left]12.5__init__方法[/align][align=left]__init__方法在类的一个对象被建立时,马上运行。这个方法可以用来对你的对[/align][align=left]象做一些你希望的初始化。注意,这个名称的开始和结尾都是双下划线。[/align][align=left]1#!/usr/bin/python[/align][align=left]2#Filename:class_init.py[/align][align=left]3[/align][align=left]4classPerson:[/align][align=left]5def__init__(self,name):[/align][align=left]6self.name=name[/align][align=left]7defsayHi(self):[/align][align=left]8print('Hello,mynameis',self.name)[/align][align=left]9[/align][align=left]10p=Person('Swaroop')[/align][align=left]11p.sayHi()[/align][align=left]把__init__方法定义为取一个参数name(以及普通的参数self)。在[/align][align=left]这个__init__里,我们只是创建一个新的域,也称为name。注意它们是两个不同的[/align][align=left]变量,尽管它们有相同的名字。点号使我们能够区分它们。[/align][align=left]最重要的是,我们没有专门调用__init__方法,只是在创建一个类的新实例的时[/align][align=left]候,把参数包括在圆括号内跟在类名后面,从而传递给__init__方法。这是这种方法[/align][align=left]的重要之处。[/align][align=left]__init__方法相当于C++,Java,C#中的构造函数[/align][align=left]-----------------[/align][align=left]12.6类和对象变量(!!!???)[/align][align=left]有两种类型的域——类的变量和对象的变量,它们根据是类还是对象拥有这个变量而区分。[/align][align=left]类的变量由一个类的所有对象(实例)共享使用。只有一个类变量的拷贝,所以[/align][align=left]当某个对象对类的变量做了改动的时候,这个改动会反映到所有其他的实例上。[/align][align=left]对象的变量由类的每个对象/实例拥有。因此每个对象有自己对这个域的一份拷[/align][align=left]贝,即它们不是共享的,在同一个类的不同实例中,虽然对象的变量有相同的名称,[/align][align=left]但是是互不相关的。[/align]Python中所有的类成员(包括数据成员)都是公共的,所有的方法都是有效的。如果你使用的数据成员名称以双下划线前缀比如
__privatevar
,Python的名称管理体系会有效地把它作为私有变量。这样就有一个惯例,如果某个变量只想在类或对象中使用,就应该以单下划线前缀。而其他的名称都将作为公共的,可以被其他类/对象使用。记住这只是一个惯例,并不是Python所要求的(与双下划线前缀不同)。同样,注意
__del__
方法与destructor的概念类似。
#!/usr/bin/python#Filename:objvar.py
class
Person
:
'''Representsaperson.'''
population=
0
def
__init__
(self,name):
'''Initializestheperson'sdata.'''
self.name=name
print
'(Initializing%s)'
%self.name
#Whenthispersoniscreated,he/she#addstothepopulation
Person.population+=
1
def
__del__
(self):
'''Iamdying.'''
print
'%ssaysbye.'
%self.name
Person.population-=
1
if
Person.population==
0
:
print
'Iamthelastone.'
else
:
print
'Therearestill%dpeopleleft.'
%Person.population
def
sayHi
(self):
'''Greetingbytheperson.Really,that'sallitdoes.'''
print
'Hi,mynameis%s.'
%self.name
def
howMany
(self):
'''Printsthecurrentpopulation.'''
if
Person.population==
1
:
print
'Iamtheonlypersonhere.'
else
:
print
'Wehave%dpersonshere.'
%Person.population
swaroop=Person(
'Swaroop'
)swaroop.sayHi()swaroop.howMany()kalam=Person(
'AbdulKalam'
)
kalam.sayHi()
kalam.howMany()

swaroop.sayHi()
swaroop.howMany()
[align=left]-------------------------------------------------------[/align][align=left]????????????????[/align][align=left]对象和类的例子[/align][align=left]C:\Python27\test\ObjVarRobot.py[/align][align=left][/align][align=left]关于staticmathod():[/align]1\staticmethod基本上和一个全局函数差不多,只不过可以通过类或类的实例对象(python里光说对象总是容易产生混淆,因为什么都是对象,包括类,而实际上类实例对象才是对应静态语言中所谓对象的东西)来调用而已,不会隐式地传入任何参数。这个和静态语言中的静态方法比较像。2\classmethod是和一个class相关的方法,可以通过类或类实例调用,并将该class对象(不是class的实例对象)隐式地当作第一个参数传入。就这种方法可能会比较奇怪一点,不过只要你搞清楚了python里class也是个真实地存在于内存中的对象,而不是静态语言中只存在于编译期间的类型。3\另一种写法[align=left]@staticmethod[/align][align=left]defhowMany():[/align][align=left]……………………[/align][align=left]如何工作:[/align](???)population属于Robot类,因此是一个类变量。name变量属于对象(用self给其赋值),因此是一[align=left]个对象变量。[/align][align=left]因此,我们使用Robot.population来引用population类变量,而不是用self.population[/align][align=left]来引用。我们在该对象的方法中用self.name来引用对象变量name。记住类和对象变[/align][align=left]量之间这个简单的差别。也要注意一个与类变量有相同名字的对象变量会隐藏类变[/align][align=left]量![/align][align=left]howMany实际上是属于类而不是对象的方法。这意味着我们或者可以定义类方[/align][align=left]法或者可以定义静态方法,这取决于我们是否需要知道我们是那个类的部分。既然我[/align][align=left]们不需要这样的信息,就需要将其定义为静态方法。[/align][align=left]必须仅用self来引用同一对象的变量和方法。这叫属性参考。[/align][align=left]在这个程序中,也看到了和方法一样在类中使用docstrings。我们可以在运行的[/align][align=left]时候使用Robot.__doc__来获得类的docstring,用Robot.sayHi.__doc__来获得方法的[/align][align=left]docstring。[/align][align=left]就如同__init__方法一样,还有一个特殊的方法__del__,它在对象消逝的时候[/align][align=left]被调用。对象消逝即对象不再被使用,它所占用的内存将返回给系统作它用。在这个[/align][align=left]方法里面,我们只是简单地把Person.population减1。[/align][align=left]当对象不再被使用时,__del__方法运行,但是很难保证这个方法究竟在什么时[/align][align=left]候运行。如果你想要指明它的运行,你就得使用del语句,就如同我们在以前的例子[/align][align=left]中使用的那样。[/align][align=left]给C++/Java/C#程序员的注释:[/align][align=left]Python中所有的类成员(包括数据成员)都是公共的,所有的方法都是有效的。[/align][align=left]只有一个例外:如果你使用的数据成员名称以双下划线前缀比如__privatevar,Python的名称[/align][align=left]管理体系会有效地把它作为私有变量。[/align][align=left]这样就有一个惯例,如果某个变量只想在类或对象中使用,就应该以单下划线前缀。而其他[/align][align=left]的名称都将作为公共的,可以被其他类/对象使用。记住这只是一个惯例,并不是Python所要求[/align][align=left]的(与双下划线前缀不同)。[/align][align=left]????????????????????[/align][align=left]---------------------------------------------------[/align][align=left]12.7继承[/align]面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。如果为教师和学生两个独立的类添加共同的属性,比较好的方法是创建一个共同的类称为
SchoolMember。
然后让教师和学生的类继承这个共同的类。即它们都是这个类型(类)的子类型,然后我们再为这些子类型添加专有的属性。优点是,如果增加/改变了
SchoolMember
中的功能,它会自动地反映到子类中。然而,在一个子类型之中做的改动不会影响到别的子类型。另外一个优点是你可以把教师和学生对象都作为
SchoolMember
对象来使用,这在某些场合特别有用,比如统计学校成员的人数。一个子类型在任何需要父类型的场合可以被替换成父类型,即对象可以被视作是父类的实例,这种现象被称为多态现象。(???与C++的区别???)在重用父类的代码的时候,无需在不同的类中重复它。而如果我们使用独立的类的话,我们就不得不这么做了。在上述的场合中,
SchoolMember
类被称为基本类或超类。而
Teacher
Student
类被称为导出类或子类。
#!/usr/bin/python#Filename:inherit.py
class
SchoolMember
:
'''Representsanyschoolmember.'''
def
__init__
(self,name,age):self.name=nameself.age=age
print
'(InitializedSchoolMember:%s)'
%self.name
def
tell
(self):
'''Tellmydetails.'''
print
'Name:"%s"Age:"%s"'
%(self.name,self.age),
class
Teacher
(SchoolMember):
'''Representsateacher.'''
def
__init__
(self,name,age,salary):SchoolMember.__init__(self,name,age)self.salary=salary
print
'(InitializedTeacher:%s)'
%self.name
def
tell
(self):
SchoolMember.tell(self)
print
'Salary:"%d"'
%self.salary
class
Student
(SchoolMember):
'''Representsastudent.'''
def
__init__
(self,name,age,marks):SchoolMember.__init__(self,name,age)self.marks=marks
print
'(InitializedStudent:%s)'
%self.name
def
tell
(self):
SchoolMember.tell(self)
print
'Marks:"%d"'
%self.markst=Teacher(
'Mrs.Shrividya'
,
40
,
30000
)s=Student(
'Swaroop'
,
22
,
75
)
print
#printsablankline
members=[t,s]
for
member
in
members:
member.tell()
#worksforbothTeachersandStudents
[align=left][/align][align=left]学校成员类的例子:[/align][align=left]C:\Python27\inherit.py[/align][align=left]Python不会自动调用基本类的constructor,你得亲自显式调用它。[/align]Python总是首先查找对应类型的方法,如果不能在导出类中找到对应的方法,才开始到基本类中逐个查找。[align=left]----------------------------------------------------------[/align][align=left]第十三章:输入输出[/align]
#!/usr/bin/python#Filename:using_file.py
poem=
'''\ProgrammingisfunWhentheworkisdoneifyouwannamakeyourworkalsofun:usePython!'''
f=
file
(
'poem.txt'
,
'w'
)
#openfor'w'riting
f.write(poem)
#writetexttofile
f.close()
#closethefile
f=
file
(
'poem.txt'
)
#ifnomodeisspecified,'r'eadmodeisassumedbydefault
while
True
:line=f.readline()
if
len
(line)==
0
:
#ZerolengthindicatesEOF
break
print
line,
#NoticecommatoavoidautomaticnewlineaddedbyPython
f.close()
#closethefile
我们首先用写模式打开文件,然后使用
file
类的
write
方法来写文件,最后我们用
close
关闭这个文件。接下来,我们再一次打开同一个文件来读文件。如果我们没有指定模式,读模式会作为默认的模式。在一个循环中,我们使用
readline
方法读文件的每一行。这个方法返回包括行末换行符的一个完整行。所以,当一个空的字符串被返回的时候,即表示文件末已经到达了,于是我们停止循环。注意,因为从文件读到的内容已经以换行符结尾,所以我们在
print
语句上使用逗号来消除自动换行。最后,我们用
close
关闭这个文件。储存器pickle:[align=left]
#!/usr/bin/python#Filename:pickling.py
import
cPickle
asp
#importpickleasp
shoplistfile=
'shoplist.data'
#thenameofthefilewherewewillstoretheobject
shoplist=[
'apple'
,
'mango'
,
'carrot'
]
#Writetothefile
f=
file
(shoplistfile,
'w'
)p.dump(shoplist,f)
#dumptheobjecttoafile
f.close()
del
shoplist
#removetheshoplist#Readbackfromthestorage
f=
file
(shoplistfile)storedlist=p.load(f)
print
storedlist
[/align]为了在文件里储存一个对象,首先以写模式打开一个
file
对象,然后调用储存器模块的
dump
函数,把对象储存到打开的文件中。这过程称为储存。接下来,我们使用
pickle
模块的
load
函数的返回来取回对象。这个过程称为取储存。--------------------------------------------------[align=left]第十三章[/align][align=left]异常[/align]
SyntaxError语法错误
[align=left]
EOFError
的错误,这个错误基本上意味着它发现一个不期望的文件尾[/align]我们把所有可能引发错误的语句放在
try
块中,然后在
except
从句/块中处理所有的错误和异常。
except
从句可以专门处理单一的错误或异常,或者一组包括在圆括号内的错误/异常。如果没有给出错误或异常的名称,它会处理所有的错误和异常。对于每个
try
从句,至少都有一个相关联的
except
从句。
import
sys
try
:
s=
raw_input
(
'Entersomething-->'
)
except
EOFError:
print
'\nWhydidyoudoanEOFonme?'
sys
.exit()
#exittheprogram
except
:
print
'\nSomeerror/exceptionoccurred.'
#here,wearenotexitingtheprogram
print
'Done'
引发异常:你可以使用
raise
语句引发异常。你还得指明错误/异常的名称和伴随异常触发的异常对象。你可以引发的错误或异常应该分别是一个
Error
Exception
类的直接或间接导出类。
#!/usr/bin/python#Filename:raising.py
class
ShortInputException
(Exception):
'''Auser-definedexceptionclass.'''
def
__init__
(self,length,atleast):Exception.__init__(self)self.length=lengthself.atleast=atleast
try
:s=
raw_input
(
'Entersomething-->'
)
if
len
(s)<
3
:raiseShortInputException(
len
(s),
3
)
#Otherworkcancontinueasusualhere
except
EOFError:
print
'\nWhydidyoudoanEOFonme?'
except
ShortInputException,x:
print
'ShortInputException:Theinputwasoflength%d,\wasexpectingatleast%d'
%(x.length,x.atleast)
else
:
print
'Noexceptionwasraised.'
假如你在读一个文件的时候,希望在无论异常发生与否的情况下都关闭文件,该怎么做呢?这可以使用
finally
块来完成。注意,在一个
try
块下,你可以同时使用
except
从句和
finally
块。[align=left][/align][align=left]第十四章:标准库[/align][align=left]sys有exit、argv等参数[/align][align=left]os模块与操作系统和平台相关:[/align]
os.name
字符串指示你正在使用的平台。比如对于Windows,它是
'nt'
,而对于Linux/Unix用户,它是
'posix'
os.getcwd()
函数得到当前工作目录,即当前Python脚本工作的目录路径。
os.getenv()
os.putenv()
函数分别用来读取和设置环境变量。
os.listdir()
返回指定目录下的所有文件和目录名。
os.remove()
函数用来删除一个文件。
os.system()
函数用来运行shell命令。
os.linesep
字符串给出当前平台使用的行终止符。例如,Windows使用
'\r\n'
,Linux使用
'\n'
而Mac使用
'\r'
os.path.split()
函数返回一个路径的目录名和文件名。
>>>os.path.split('/home/swaroop/byte/code/poem.txt')('/home/swaroop/byte/code','poem.txt')
os.path.isfile()
os.path.isdir()
函数分别检验给出的路径是一个文件还是目录。类似地,
os.path.existe()
函数用来检验给出的路径是否真地存在。[align=left]第十五章:[/align]
名称说明
__init__(self,...)这个方法在新建对象恰好要被返回使用之前被调用。
__del__(self)恰好在对象要被删除之前调用。
__str__(self)在我们对对象使用
print
语句或是使用
str()
的时候调用。
__lt__(self,other)当使用小于运算符(<)的时候调用。类似地,对于所有的运算符(+,>等等)都有特殊的方法。
__getitem__(self,key)使用
x[key]
索引操作符的时候调用。
__len__(self)对序列对象使用内建的
len()
函数的时候调用。
[align=left]使用列表综合:[/align]
listone=[
2
,
3
,
4
]
listtwo=[
2
*i
for
i
in
listone
if
i>
2
]
print
listtwo
由于在
args
变量前有
*
前缀,所有多余的函数参数都会作为一个元组存储在
args
中。如果使用的是
**
前缀,多余的参数则会被认为是一个字典的键/值对。当要使函数接收元组或字典形式的参数的时候,有一种特殊的方法,它分别使用
*
**
前缀。种方法在函数需要获取可变数量的参数的时候特别有用。由于在
args
变量前有
*
前缀,所有多余的函数参数都会作为一个元组存储在
args
中。如果使用的是
**
前缀,多余的参数则会被认为是一个字典的键/值对。
>>>defpowersum(power,*args):...'''Returnthesumofeachargumentraisedtospecifiedpower.'''...total=0...foriinargs:...total+=pow(i,power)...returntotal...>>>powersum(2,3,4)25
lambda语句:
def
make_repeater
(n):
returnlambda
s:s*ntwice=make_repeater(
2
)
print
twice(
'word'
)
print
twice(
5
)
output:$pythonlambda.pywordword10[/code]
我们使用了make_repeater
函数在运行时创建新的函数对象,并且返回它。[code]lambda语句用来创建函数对象。本质上,
lambda
需要一个参数,后面仅跟单个表达式作为函数体,而表达式的值被这个新建的函数返回。注意,即便是
print
语句也不能用在lambda形式中,只能使用表达式。[/code]
exec语句用来执行储存在字符串或文件中的Python语句。[/code]eval语句用来计算存储在字符串中的有效Python表达式。[/code]assert语句用来声明某个条件是真的。例如,如果你非常确信某个你使用的列表中至少有一个元素,而你想要检验这一点,并且在它非真的时候引发一个错误,那么
assert
语句是应用在这种情形下的理想语句。当assert语句失败的时候,会引发一个
AssertionError
。[/code]repr函数用来取得对象的规范字符串表示。[/code]>>>i=[]>>>i.append('item')>>>`i`"['item']">>>repr(i)"['item']"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: