用Python作文本處理-第一章-Python基礎(chǔ)_第1頁
用Python作文本處理-第一章-Python基礎(chǔ)_第2頁
用Python作文本處理-第一章-Python基礎(chǔ)_第3頁
用Python作文本處理-第一章-Python基礎(chǔ)_第4頁
用Python作文本處理-第一章-Python基礎(chǔ)_第5頁
已閱讀5頁,還剩92頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

?word業(yè)資料-可復(fù)制編輯-歡迎下載?用Python作文本處理/第一章1第一章--Python基礎(chǔ)o1.1第一節(jié)--技巧和形式?1.1.1主題--在文字處理里使用高階函數(shù)? 的應(yīng)用 ? 1.1.3主題--基礎(chǔ)數(shù)據(jù)類1.1.2? 1.1.3主題--基礎(chǔ)數(shù)據(jù)類 ? ?????????????BUILTIN--對象:新式數(shù)據(jù)類型原型BUILTIN--file:文件對象的新式類 BUILTIN--int:整數(shù)的新式類 BUILTIN--long:長整數(shù)的新式類 BUILTIN--float:浮點數(shù)的新式類 BUILTIN--complex:復(fù)數(shù)的新式類模塊--UserDict:包裝字典對象的類 BUILTIN--dict:字典對象的新式類 模塊--UserList:包裝列表對象的類 0BUILTIN--list:列表對象的新式類 1BUILTIN--tuple:元組對象的新式類2模塊--UserString:包裝字符串對象的類 3BUILTIN--str:字符串對象的新式類 字符串 word業(yè)資料-可復(fù)制編輯-歡迎下載 件里行操作 第一章--Python基礎(chǔ)n討論著重于適用文字處理的情況--其他編程任務(wù)本書不會詳細(xì)討第一節(jié)--技巧和形式主題--在文字處理里使用高階函數(shù)戰(zhàn)性。如果是首次接觸高階函數(shù)對于不熟悉這方面的word業(yè)資料-可復(fù)制編輯-歡迎下載A性。多數(shù)情況下,這些句子是用換行分隔,但有時也會用其他的形式。此外,Python分塊還我們想選擇那些符合我們要求的行文字,其標(biāo)準(zhǔn)是'isCond()':#*----------命令行式風(fēng)格的行選擇-----------------------#selected=[]#收集可用的行meifisCond(line):#(2.2版本這里是惰性讀取)delline#清除不用的名稱這樣讀取幾行沒有任何-錯誤-(效率問題參看[xreadlines])。但閱讀這樣的程序會多花幾秒鐘。在我看來,即使是這么一小段程序也不符合-簡單-的設(shè)環(huán)以后它的保留價值,同時循環(huán)的每一步都要給它賦值)。在函數(shù)式風(fēng)格里,我們可以寫的很簡單:#*----------函數(shù)式風(fēng)格的行選擇-------------------------#word業(yè)資料-可復(fù)制編輯-歡迎下載filenamereadlinesG的一個這個文件:#------------INSTALL.LOG樣本--------------------------#TitlePython2.2CDOWNLOADPYTHONEXEUNWISEEXESoftwareMicrosoftWindowsCurrentVersionUninstallPyyDPythonwxpopenexeSVCRTDLLword業(yè)資料-可復(fù)制編輯-歡迎下載ppgramsPython2\UninstallPy...LinkInfo:D:\Python22\UNWISE.EXE|D:\PYTHON22||0|1|0|gramsPythonLinkInfoDPythonpythonexeD\PYTHON22|動紀(jì)錄(每種類型會有不同的數(shù)據(jù)字段結(jié)構(gòu)),最簡單的是用布爾函數(shù)來確定每一行的類型,例如:#*-------每一行的布爾判定函數(shù)---------------------------#returnline[:10]=='FileCopy:'#或者使用line.startswith(...)ine字符串函數(shù)`"".startswith()`不容易出錯。用一種稍微緊湊的函數(shù)式編程風(fēng)格,您可以寫成這樣:#*-----------函數(shù)式風(fēng)格判定----------------------------#word業(yè)資料-可復(fù)制編輯-歡迎下載eRegDBRootalinelineRegDBKeyneRegDBVal選擇某種類型的行可以這樣做:Selectlinesthatfillpredicate------#dliness對所有"RegDB"行有興趣,你可以寫一個新的函數(shù)過濾器:FindtheRegDBlines---------------#ifline[:11]=='RegDBRoot:':return1elifline[:10]=='RegDBKey:':return1elifline[:10]=='RegDBVal:':return1elsereturn0#最好使用line.startswith(...)一種新的過濾條件。例如:#*-------------用2種條件來過濾------------------------#word業(yè)資料-可復(fù)制編輯-歡迎下載nelambdalinelenlinertlinefilterisRegDBVallines個例子中,我們依靠先前定義的過濾器函數(shù)。在'shortline()'或r對同一個字符串做若干處理使用`map()`也是同樣會嵌套多層。例如,假設(shè)您很簡單,他們可以嵌套在`map()`里:#*------------一行文字同時多種轉(zhuǎn)換---------------------#spstruppermapflipmapnormalizelines這種類型的`map()`或`filter()`會難以閱讀,應(yīng)當(dāng)避免。此外,有時會交替使用`map()`和`filter()`,使問題更加嚴(yán)重。例如,假設(shè)您要對每一行做一些處9word業(yè)資料-可復(fù)制編輯-歡迎下載 (典型的結(jié)構(gòu)會像一個list或dict)。與此相反,更高階的函數(shù)的"inputs"和utputs高階函數(shù)的一個典型例子就是一個-函數(shù)工廠-:這個函數(shù)(或類)會返回一個數(shù)的包裹器,這些返回值都會包含某種"配置"。做一個"Hello廠都會使用這樣的一個例子,如:...returnlambdam,n=n:m+n...word業(yè)資料-可復(fù)制編輯-歡迎下載幾個(通常是一階)函數(shù)作為參數(shù)并返回一個新的函數(shù),這個函數(shù)會把幾個具行:combinatorialpy-----------------#portmuladdtruthafnsargsmapapplyfnsargslenfnsrgsnsargsreducemulbooleachfnsargsambdaargfnsfnsconjoinfnsargfghfglambdaxffggfxandgxsreduceaddbooleachfnsargsaargfnsfnsdisjoinfnsargfgmefghaxffggfgxambdaxffgghhfghxword業(yè)資料-可復(fù)制編輯-歡迎下載這些高階函數(shù)來簡化一些較早的例子。和上面采用一樣的函數(shù)命名:#-----一些高階函數(shù)的使用例子-------------------------#tersjustproducefuncthatdoesbothfilterbothshortlineisRegVallinestiplyadhocfunctionsjustdescribeneed#不需要增加函數(shù),只需要描述需求RegDBRootisRegDBKeyisRegDBVallinesansformationsmakeonecombinedtransform#不需要嵌套轉(zhuǎn)換,只需要建立一個組合perflipnormalizepFlipNormlines的表示--執(zhí)行在所有行上做這個處理。這個例子已經(jīng)說明了組合函數(shù)的靈活性。通過濃縮幾個操作就能代替以前好幾個`map()`嵌套,我們還可作為一個經(jīng)驗,我建議不要在任何一個代碼行上使用一個以上的`filter()`和`map()`。如果這些"list"應(yīng)用函數(shù)需要嵌套,應(yīng)該使用一個保存中間結(jié)果的名量來增加可讀性。連續(xù)的函數(shù)式編程風(fēng)格讀起來會比較像命令行式風(fēng)格--Python組合不同的編程風(fēng)格。例如:word業(yè)資料-可復(fù)制編輯-歡迎下載#*------限制map()/filter()的嵌套層數(shù)---------------#rnicePropertymapsomeTransformlinesransformintermed任何連續(xù)嵌套的`filter()`或`map()`程序都可以用高階組合函數(shù)轉(zhuǎn)換成單一的。而這些產(chǎn)生的步驟也只需要很少幾步。在總代碼數(shù)量上抵消了定義組合之,函數(shù)式風(fēng)格的代碼通常只有命令行式風(fēng)格大約一半的長度 (越少的代碼一般意味著有相對較少的bug)。顯的調(diào)用(在這個意義上'combinatorial.py'使用`operator.add`和`operator.mul`不是偶然的)。例如,一個簡單的運算就可以表示復(fù)雜的邏輯關(guān)系,例如:#*----------使用值運算的簡單布爾表達(dá)式----------------#andfooorbar在文字處理上,這些判斷函數(shù)產(chǎn)生的真值往往是一段需要處理的文字,例如:#*----------函數(shù)返回值的邏輯運算----------------------#PsandfooPsorbarPs在上面這個表達(dá)式中,一些判斷函數(shù)對相同的字串(或其他東西)進(jìn)行判斷,命名--特別是如果你想在參數(shù)相同的前提上多次運算的話--將可以方便的創(chuàng)建一個有實際功能的表達(dá)式:1word業(yè)資料-可復(fù)制編輯-歡迎下載#*------組合函數(shù)的邏輯運算-------------------------#eitherfooPbarP利用組合技術(shù)創(chuàng)建的判斷函數(shù)同樣可以應(yīng)用在其他函數(shù)里:#*------使用組合的布爾函數(shù)---------------------------#dPlines合函數(shù)的應(yīng)用combinatorialpy了一些最常見的高階組合函數(shù)。但是,還有加強題目:一個組合函數(shù)應(yīng)該用一個或幾個函數(shù)作為參數(shù)并返回一個組合后的函數(shù)對象。哪些函數(shù)不是“嚴(yán)格”的組合函數(shù),并確定word業(yè)資料-可復(fù)制編輯-歡迎下載10ckmostrecentcalllast...?a.建立一個相似的'or_()'?b.建立同樣可以提前終止運算的'shortcut_all()'和?c.闡述那些情況最好使用不提前中斷的組合函數(shù)而不使用會提前中3.解釋'ident()'的真正作用幾行文字,其中一些行可能是空字符串。怎么設(shè)計過濾器可以找到所有開始為'#'的行?4.'not_()'可能應(yīng)該是一個組合庫的擴(kuò)展功能。我們可以這樣定義:word業(yè)資料-可復(fù)制編輯-歡迎下載ch例如:本處理的高階組合函數(shù)?考慮一下常用的一階函數(shù)。主題--Python數(shù)據(jù)類型的特殊性nAPython根據(jù)Python的“普遍多態(tài)性原則”(我自己創(chuàng)造的名詞),對象能“作什么”比據(jù)需求有所不同)。例如:#------------C++標(biāo)示型多態(tài)性---------------------------##include<stdio.h>assPrintvoidprint(inti)word業(yè)資料-可復(fù)制編輯-歡迎下載printfintdni);}voidprintdoubled){printf("double%f\n",d);}voidprint(floatf){printf("float%f\n",f);}t}ePython查。就像這樣:#-------Python"標(biāo)示型"多態(tài)性--------------------------#fromtypesimport*iftype(x)isFloatType:print"float",xeliftype(x)isIntType:print"int",xypeprintlongx不明白的要真正解決的問題!你感興趣的(通常)是'x'是什么類型,而不是'x'可以做什么你需要它來執(zhí)行的任務(wù)(它是哪種東西并不值得關(guān)心)。word業(yè)資料-可復(fù)制編輯-歡迎下載eileL我還沒有完全考慮到一些其他地方(如關(guān)系型數(shù)據(jù)庫,網(wǎng)絡(luò)數(shù)據(jù)等等)。為了看一下這個數(shù)據(jù)源可以“做什么”,我在兩處檢查對象擁有的能力:#--------Python功能型多態(tài)性----------------------------#mldomimportminidomreturnxml_src#已經(jīng)有DOM對象#看起來可以讀數(shù)據(jù)TypeUnicodeType#這是個文件名xmlopenxmlsrcread)word業(yè)資料-可復(fù)制編輯-歡迎下載dwith以的,往往在使用內(nèi)建函數(shù)`complex()`,`dict()`,`float()`,`int()`,`list()`,`long()`,`str()`,`tuple()`和`unicode()`時需要這么做。所有這些函數(shù)都會努力把任何東西轉(zhuǎn)換成需要數(shù)字的不精確部分--也許是因為他們的測量精度有限。對于整數(shù)#-----------檢查值能做什么-----------------------------#defapproxxintifhasattr(x,'__and__'):#支持位操作Ltry:#支持real/imagword業(yè)資料-可復(fù)制編輯-歡迎下載強化對象:ke個細(xì)節(jié)關(guān)注的是你如何實現(xiàn)這種魔術(shù)性--更確切地說,如何最好地利用現(xiàn)st建造對象:`int()`,`list()`,`unicode()`等等。新式類型有很多秘密和微妙設(shè)計word業(yè)資料-可復(fù)制編輯-歡迎下載[UserDict]也是一樣(最好讓你的所有腳本運行在最新的Python版本下)。需還可以有自身特有的功能: def__init__(self,i):self.i=i def__and__(self,i):returnself.i&i...deferr_range(self):...lbound=approx(self.i)...return"Value:[%d,%d)"%(lbound,lbound+0x0F)...eword業(yè)資料-可復(fù)制編輯-歡迎下載是這樣:>>>classI2(int):#New-stylefuzzyinteger...def__add__(self,j):...vals=map(int,[approx(self),approx(j)])...k=int.__add__(*vals)...returnI2(int.__add__(k,0x0F))...deferr_range(self):...lbound=approx(self)...return"Value:[%d,%d)"%(lbound,lbound+0x0F)...ValueiValueclassmain__.I2'>int再實現(xiàn)。用新式類型,你可以直接用'self'引用數(shù)據(jù),而不需要一個專門的屬性去保存數(shù)據(jù)(例如,'I'word業(yè)資料-可復(fù)制編輯-歡迎下載里的'self.i')。同時,人們普遍會使用不安全的操作方式來實現(xiàn)一些神奇函數(shù),主題--基礎(chǔ)數(shù)據(jù)類甚至不需要專門的定義一個數(shù)據(jù)類型(某種意義上說,每一個對象都是一種數(shù)據(jù)索引)。本書不會詳細(xì)介紹每一種專用函數(shù),大多數(shù)魔術(shù)性函數(shù)都是跟繼承的幾個版本更為明顯。word業(yè)資料-可復(fù)制編輯-歡迎下載義中需要覆蓋父類的時候,如:...def__repr__(self):returnobject.__repr__(self).upper()...BUILTIN--對象:新式數(shù)據(jù)類型原型ct型,最好是繼承'object'的子類,如'list','float'或'dict'.方法:?object.__eq__(self,other)robjecteq__()'函數(shù),默認(rèn)情況下,對象相等意味著是同一個東西('is'運算)。子類可以隨意定義比較的方式。word業(yè)資料-可復(fù)制編輯-歡迎下載?object.__ne__(self,other)'self'和'other'比較的布爾值。這個決定了數(shù)據(jù)類型如何回應(yīng)'!='和'<>'運不是同一個東西('isnot'運算)。似乎相等和不相等應(yīng)該返回相反的值,但這并沒有明確的限定。你可以強制這種關(guān)系:...#使用基礎(chǔ)類的比較方式...def__eq__(self,o):returnnotself<>o...def__ne__(self,o):returnnotself==o...Q...#使用專門的比較方式...def__ne__(self,other):...returnsomeComplexComparison(self,other)?object.__nonzero__(self)和'filter(None,...)'測試。對象的'.__nonzero__()'函數(shù)返回真值就視該對象為?object.__len__(self)tword業(yè)資料-可復(fù)制編輯-歡迎下載一個整數(shù)來代表對象的"長度"。對于容器型類型,這是很直接的意義--這?object.__repr__(self)?object.__str__(self)?str(object)返回一個字符串來表示'self'對象。這決定了數(shù)據(jù)類型如何響應(yīng)`repr()`和rBUILTIN--file:文件對象的新式類定義各種函數(shù)來創(chuàng)建"file-like"類型。不過即使使用最新版word業(yè)資料-可復(fù)制編輯-歡迎下載事實上直接繼承'file'是很少見的,我用大寫名稱'FILE'來表明一般的文件對象,只是把'file'作為參考的例子(實現(xiàn)所有已命名的函數(shù)功能)。?open(fname[,mode[,buffering]])?file(fname[,mode[,buffering]])'r'模式是閱讀,'w'是寫(覆蓋現(xiàn)有內(nèi)容),'a'是附加(寫在后面)。所有這些word業(yè)資料-可復(fù)制編輯-歡迎下載方法和屬性:eword業(yè)資料-可復(fù)制編輯-歡迎下載xint讀取一行文字,其中包括尾隨的換行符(如果有的話)。'size'同上。xintce根據(jù)'offset'(正負(fù)都可)來移動文件的指針。參數(shù)'whence'指定初始位置:0截斷文件內(nèi)容(變?yōu)?size'長度)。word業(yè)資料-可復(fù)制編輯-歡迎下載BUILTIN--int:整數(shù)的新式類BUILTIN--long:長整數(shù)的新式類作運算結(jié)果超出范圍會自動晉升為'long'對象。不過'long'不會自動降級回'int'--唯一的例外是使用`int()`函數(shù)。上有所不同,int通常速度很快(CPU直接使用)。整數(shù)和浮點數(shù)有很多相似的魔術(shù)性功能。例如,`float.__mul__()`和`int.__mul__()`。整數(shù)和浮點數(shù)不word業(yè)資料-可復(fù)制編輯-歡迎下載動使用左關(guān)聯(lián)。如果是在'int'和自定義類型對象之間運算那自定義的右關(guān)聯(lián)函數(shù)會覆蓋原先的基本操作。例如:...def__xor__(self,other):...return"XOR"...def__rxor__(self,other):...return"RXOR"...0方法:word業(yè)資料-可復(fù)制編輯-歡迎下載fword業(yè)資料-可復(fù)制編輯-歡迎下載?SEEALSO,[float],`int`,`long`,`sys.maxint`,[operator]BUILTIN--float:浮點數(shù)的新式類n題外話:li<comp.lang.python>):任何人認(rèn)為他完全了解浮點運算,那他不是天真那就是TimPeters(我猜或許是W.Kahan)。s我認(rèn)為是二者皆有可能(眨眼),浮點數(shù)對任何人都不容易,甚至就是h頁):word業(yè)資料-可復(fù)制編輯-歡迎下載。有關(guān)浮點數(shù)的訣竅是,盡管他們是用來代表我們生活中(分?jǐn)?shù))的數(shù),但操作點數(shù)只是近似值。例如:01功能:Python浮點數(shù)。也就是說,以嚴(yán)格的用在整數(shù)上。下面列出的浮點數(shù)運算也同樣適用于int和long(或int-like數(shù)據(jù)類型)。復(fù)數(shù)只是增加了少數(shù)幾個操作方法。里,您將需要手動定義所有你所需要的魔術(shù)性函數(shù)(工作量太大,不值得)。word業(yè)資料-可復(fù)制編輯-歡迎下載方法:?float.__abs__(self)返回絕對值。這會在內(nèi)置`abs()`函數(shù)中使用。?float.__add__(self,other)?float.__radd__(self,other)?float.__cmp__(self,other)和'!='運算中使用,也同樣會在內(nèi)置`cmp()`函數(shù)中使用。返回-1表示?float.__div__(self,other)?float.__rdiv__(self,other)truediv)'或'.__floordiv__()'。word業(yè)資料-可復(fù)制編輯-歡迎下載?float.__divmod__(self,other)?float.__rdivmod__(self,other)?float.__floordiv__(self,other)?float.__rfloordiv__(self,other)返回'self'和'other'的整除值。這會在'//'運算中使用(2.2+版本)。?float.__mod__(self,other)?float.__rmod__(self,other)?float.__mul__(self,other)?float.__rmul__(self,other)?float.__neg__(self)?float.__pow__(self,other)?float.__rpow__(self,other)?float.__sub__(self,other)word業(yè)資料-可復(fù)制編輯-歡迎下載?float.__rsub__(self,other)?float.__truediv__(self,other)?float.__rtruediv__(self,other)?SEEALSO,[complex],[int],`float`,[operator]BUILTIN--complex:復(fù)數(shù)的新式類。n'`complex.__ge__(),`complex.__gt__()`'complex.__le__()`,和`complex.__lt__()`都會默認(rèn)拋出'TypeError',而不是返回布爾值。這是因為里面有復(fù)數(shù):word業(yè)資料-可復(fù)制編輯-歡迎下載ckmostrecentcalllastnlineinTypeError:cannotcomparecomplexnumbersusing<,<=,>,>=沒有次序可言。盡管如此,當(dāng)你排列一個異構(gòu)的列表,還是會產(chǎn)生一個標(biāo)準(zhǔn)的次序排序(盡管是毫無意義的)。在Python2.2+,你可以彌補這個缺陷 (2.1-就沒有這么幸運了):...def__lt__(self,o):...ifhasattr(o,'imag'):...return(self.real,self.imag)<(o.real,o.imag)...else:...returnself.real<o...def__le__(self,o):returnself<oorself==o...def__gt__(self,o):returnnot(self==oorself<o)...def__ge__(self,o):returnself>oorself==o...word業(yè)資料-可復(fù)制編輯-歡迎下載C方法:?complex.conjugate(self)self一下,如果'self'是'n+mj'那共軛是'n-mj'。?complex.imag?complex.real?SEEALSO,[float],`complex`模塊--UserDict:包裝字典對象的類BUILTIN--dict:字典對象的新式類字典是不可變對象對應(yīng)其他對象的一種集合(參見條目不可變對象)。您可以word業(yè)資料-可復(fù)制編輯-歡迎下載如果您從`UserDict.UserDict`繼承創(chuàng)建字典類型,那所有特殊操作都會對應(yīng)式。下面是一個例子,兩種風(fēng)格的字典類數(shù)據(jù)類型:...def__setitem__(self,key,val):...self.data[key]=val......def__setitem__(self,key,val):...dict.__setitem__(self,key,val)...word業(yè)資料-可復(fù)制編輯-歡迎下載方法:?dict.__cmp__(self,other)mpselfother?dict.__contains__(self,x)ainsselfx的手段之一,但你可以改變這個操作(例如,檢查'x'是否是字典里的值而不是鍵值)。這會在'in'操作里使用。?dict.__delitem__(self,x)elitemselfx?dict.__getitem__(self,x)temselfxword業(yè)資料-可復(fù)制編輯-歡迎下載可以覆蓋此函數(shù)用來搜索不同的東西或返回特殊的值。例如:...def__getitem__(self,x):...ifself.has_key(x):...return(x,dict.__getitem__(self,x))...else:...tmp=dict([(v,k)fork,vinself.items()])...return(dict.__getitem__(tmp,x),x)...tbaconsausagespameggsckmostrecentcalllastnlineinword業(yè)資料-可復(fù)制編輯-歡迎下載?dict.__len__(self)enself默認(rèn)情況下這是鍵/值對的計數(shù),但你也可以用來計算不同的大小)。這會在內(nèi)置、len()、函數(shù)中使用。?dict.__setitem__(self,key,val)emselfkeyval鍵值'key'對應(yīng)的值'val'。這會在'self[key]=val'中使用。這個會改key應(yīng)的值'val'或增加一對'key'/'val'。?dict.clear(self)?dict.copy(self)返回'self'的一個備份(復(fù)制對應(yīng)關(guān)系)。?dict.get(self,key[,default=None])eydefaultNone?dict.has_key(self,key)word業(yè)資料-可復(fù)制編輯-歡迎下載skeyselfkey?dict.items(self)f?dict.iteritems(self)elf'.iteritems()'函數(shù)(Python2.2+)返回一個生成器對象。后者用在如果你的字?jǐn)?shù)都可以用于'for'循環(huán):......?dict.keys(self)?dict.iterkeys(self)fword業(yè)資料-可復(fù)制編輯-歡迎下載'.iterkeys()'函數(shù)(Python2.2+)返回一個生成器對象。SEEALSO,`dict.items()`?dict.popitem(self)f生'KeyError'錯誤。對元素出現(xiàn)的順序未定(不同版本和平臺會有不同秩序)。?dict.setdefault(self,key[,default=None])ultselfkeydefaultNonekey在字典中,則返回相應(yīng)的值。如果'key'不在字典中,則設(shè)置SEEALSO,`dict.get()`?dict.update(self,other)lfother?dict.values(self)?dict.itervalues(self)word業(yè)資料-可復(fù)制編輯-歡迎下載self'.itervalues()'函數(shù)(Python2.2+)返回生成器對象。?SEEALSO,`dict.items()`?SEEALSO,`dict`,[list],[operator]模塊--UserList:包裝列表對象的類BUILTIN--list:列表對象的新式類BUILTIN--tuple:元組對象的新式類 ("immutable")。二者很多操作方法是相同的,只是元組不能改變內(nèi)部的數(shù)如果您從`UserList.UserList`繼承創(chuàng)建列表類型,那所有特殊操作都會對應(yīng)到字典,不過也需要那些元素有'.__hash__()'函數(shù)(沒有這個魔術(shù)函數(shù)的元素是沒有資格充當(dāng)字典鍵值的)。元組可以作為鍵值使用,兩個元組的哈希值相word業(yè)資料-可復(fù)制編輯-歡迎下載鍵值,兩個列表里元素可能相同,但這也只是一時的(隨時都可能改變)。您可以很容易產(chǎn)生列表的哈希值。不過使用時要小心犯錯:...__hash__=lambdaself:hash(tuple(self))...8}ckmostrecentcalllastnlineinlst的哈希值也會變化,字典對象無法真正的關(guān)聯(lián)到它。您需要的是不會隨著對象變化而變化的東西:word業(yè)資料-可復(fù)制編輯-歡迎下載...__hash__=lambdaself:id(self)...8}里的元素的'.__cmp__()','.__ge__()','.__gt__()','.__le__()'和'.__lt__()'操該具有相同的含義,細(xì)節(jié)參看[operator],[float]和[dict]。方法:fother?tuple.__add__(self,other)word業(yè)資料-可復(fù)制編輯-歡迎下載lfother通常而言'lst+=other'和'lst=lst+other'具有相同的效果,但以后的版本可能根據(jù)標(biāo)準(zhǔn)的含義,兩個序列相加會產(chǎn)生新的(不同的)序列,里面的元素是所d型來做加法操作。例如:...def__iadd__(self,other):...ifissubclass(other.__class__,list):...returnlist.__iadd__(self,other)...else:...fromoperatorimportadd...returnmap(add,self,[other]*len(self))...word業(yè)資料-可復(fù)制編輯-歡迎下載ainsselfx?tuple.__contains__(self,x)emselfx從列表里刪除一個元素。這會在'del'操作里使用,如'delself[x]'。rtendiceselfstartend某個范圍內(nèi)的元素。這會在'del'操作里使用,如'delstitemselfpos?tuple.__getitem__(self,pos)endword業(yè)資料-可復(fù)制編輯-歡迎下載sliceselfstartend?tuple.__getslice__(self,start,end)hself?tuple.__hash__(self)作里使用。默認(rèn)情況下,元組(或其他不可變類型)會返回哈希值,而列表會r1tmulselfnum?tuple.__mul__(self,num)word業(yè)資料-可復(fù)制編輯-歡迎下載mulselfnum?tuple.__rmul__(self,num)timulselfnum在Python2.0+開始支持。通常而言'self*num'。一般來說,序列和數(shù)相乘會產(chǎn)生一個新的(不同的)序列,里面的內(nèi)容是'self'重復(fù)'num'次:lselfposvalrtendothericeselfstartendotherlfitemword業(yè)資料-可復(fù)制編輯-歡迎下載flfitemfseqelfitememlfpositemfitemword業(yè)資料-可復(fù)制編輯-歡迎下載elfcmpfuncselfcmpfunc?SEEALSO,`list`,`tuple`,[dict],[operator]模塊--UserString:包裝字符串對象的類BUILTIN--str:字符串對象的新式類Python里的字符串是不可變的字符序列("immutable")。創(chuàng)造字符串的語`str.__add__()`,`str.__getitem__()`,`str.__getslice__()`,`str.__hash__()`,`str.__len__()`,`str.__mul__()`和`str.__rmul__()`。[UserString]模塊還包括幾str]沒有的:`UserString.__iadd__()`,`UserString.__imul__()`word業(yè)資料-可復(fù)制編輯-歡迎下載和`UserString.__radd__()`。不過,即使你從[str]繼承也還是可以自己定義這?SEEALSO,`"".capitalize()`,`"".title()`,`"".center()`,方法:?str.__contains__(self,x)insselfx能用來確定單個字符是否在字符串中--這是有道理的,字符串是一個字符的序列:...ckmostrecentcalllastnlineinword業(yè)資料-可復(fù)制編輯-歡迎下載stringrequirescharacterasleftoperandttheexpectedbehaviorisacustomalwaysproducingthesamedacharacter樣來定義這個函數(shù):...def__contains__(self,x):...foriinrange(len(self)):...ifself.startswith(x,i):return1...10sbehavethesamewayasmydatatypeSword業(yè)資料-可復(fù)制編輯-歡迎下載化字符串討論:Web經(jīng)常會遇到。從一組字符串產(chǎn)生新的字符串是非常常見能學(xué)會"HelloWorld!"。第五章會......Youoweus$%sforaccount(#%s).PleasePay.......TheCompany"""word業(yè)資料-可復(fù)制編輯-歡迎下載Youoweus$500foraccount(#123-T745).PleasePay.y增加一個或減少一個格式)就會產(chǎn)生錯誤。Python典來寫格式。例如:......Youoweus$%(due)sforaccount(#%(acct)s).PleasePay.......TheCompany"""Youoweus$500foraccount(#123-T745).PleasePay.word業(yè)資料-可復(fù)制編輯-歡迎下載y有相關(guān)鍵值那還是可能會出現(xiàn)錯誤。可以使用[UserDict]模塊從兩種不同的(相抵觸)的方式來改進(jìn)這個問題。在Python2.2+內(nèi)置的'dict'好。一種方式是,避免字典里沒有相關(guān)鍵值:......Youoweus$%(due)sforaccount(#%(acct)s).PleasePay.......%(closing)sTheCompany"""t...def__init__(self,dict={}):UserDict.__init__(self,dict)...def__getitem__(self,key):...returnUserDict.get(self,key,)word業(yè)資料-可復(fù)制編輯-歡迎下載elyYouoweus$500foraccount(#).PleasePay.lnameacct基本上可以說得過去的信(不會有KeyError)。另一種方式是建立自定義字典對象在程

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論