《Python程序設(shè)計(jì)》課件第4章-Unicode與字符串-1_第1頁
《Python程序設(shè)計(jì)》課件第4章-Unicode與字符串-1_第2頁
《Python程序設(shè)計(jì)》課件第4章-Unicode與字符串-1_第3頁
《Python程序設(shè)計(jì)》課件第4章-Unicode與字符串-1_第4頁
《Python程序設(shè)計(jì)》課件第4章-Unicode與字符串-1_第5頁
已閱讀5頁,還剩58頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第4章Unicode與字符串計(jì)劃Unicode簡介Python字符串的常用操作Python2.x與Python3.x在支持Unicode方面的異同正則表達(dá)式Unicode簡介Bit(比特、位)Thebitisabasicunitofinformationincomputinganddigitalcommunications.Abitcanhaveonlyoneoftwovalues,andmaythereforebephysicallyimplementedwithatwo-statedevice.電路的高電平狀態(tài)與低電平狀態(tài)電容的充電狀態(tài)與放電狀態(tài)磁盤上磁性材料粒子的兩種不同的磁化狀態(tài)Thesevaluesaremostcommonlyrepresentedaseithera0or1.Byte(字節(jié))Thebyte(字節(jié))isaunitofdigitalinformationthatmostcommonlyconsistsofeightbits(8個(gè)比特).Historically,thebytewasthenumberofbitsusedtoencodeasinglecharacteroftextinacomputer,

andforthisreasonitisthesmallestaddressableunitofmemoryinmanycomputerarchitectures.1byte=8bits.

28=256.Permitsvalue0through255Byte(字節(jié))8位byte的概念可追溯至1956年的IBMStretchASCIIASCII(/??ski/ASS-kee)AmericanStandardCodeforInformationInterchangeASCII第一次以規(guī)范標(biāo)準(zhǔn)的類型發(fā)表是在1967年,最后一次更新是在1986年,共定義了128個(gè)字符(編號(hào)從0至127)其中33個(gè)字符無法顯示(一些終端提供了擴(kuò)展,使得這些字符可顯示為諸如笑臉、撲克牌花式等8-bit符號(hào))。且這33個(gè)字符多數(shù)都已是陳廢的控制字符1968年版ASCII編碼表ASCIIASCIIASCII的局限在于只能顯示26個(gè)基本英文字母、阿拉伯?dāng)?shù)字和英式標(biāo)點(diǎn)符號(hào),因此只能用于顯示現(xiàn)代美國英語(而且在處理英語當(dāng)中的外來詞如na?ve、café、élite等時(shí),所有重音符號(hào)都不得不去掉,即使這樣做會(huì)違反拼寫規(guī)則)ASCII只用到了0至127的編碼,而一個(gè)字節(jié)(1byte)含8個(gè)比特(8bits),28=256,可以有256個(gè)編碼,即0至255有人開始使用128至255編碼重音符號(hào)等,這就產(chǎn)生了ExtendedASCIIExtendedASCII(EASCII)1970年代,對128至255的利用,不同的公司(機(jī)器)有不同的標(biāo)準(zhǔn),致使文件交換困難EASCII(ExtendedASCII,擴(kuò)展的美國標(biāo)準(zhǔn)信息交換碼)是將ASCII碼由7位擴(kuò)充為8位而成EASCII的內(nèi)碼是由0到255共有256個(gè)字符組成EASCII碼比ASCII碼擴(kuò)充出來的符號(hào)包括表格符號(hào)、計(jì)算符號(hào)、希臘字母和特殊的拉丁符號(hào)EASCIIEASCII利用了128(二進(jìn)制:10000000)至255(二進(jìn)制:11111111)EASCII然而,256個(gè)字符并不夠用Forexample,youcan’tfitboththeaccentedcharactersusedinWesternEuropeandtheCyrillicalphabet(西里爾字符)usedforRussianintothe128–255rangebecausetherearemorethan128suchcharacters.EASCII雖然解決了部分西歐語言的顯示問題,但對更多的其他語言顯然無能為力Unicode出現(xiàn)了UnicodeUnicode是計(jì)算機(jī)科學(xué)領(lǐng)域里的一項(xiàng)業(yè)界標(biāo)準(zhǔn)由非營利機(jī)構(gòu)TheUnicodeConsortium維護(hù):/Unicode對世界上大部分的文字系統(tǒng)進(jìn)行了整理、編碼,使得電腦可以用更為簡單的方式來呈現(xiàn)和處理各種語言的文字早期的Unicode曾使用2

bytes,也就是16bits編碼字符,這樣可以有

216

=65536個(gè)不同的編碼,目標(biāo)是囊括所有人類語言的所有文字后來發(fā)現(xiàn)65536個(gè)編碼不夠用。當(dāng)今的Unicode范圍為:0–1,114,111(0x10ffff)Unicode的基本概念A(yù)

character

isthesmallestpossiblecomponentofatext.‘A’,‘B’,‘C’,etc.,arealldifferentcharacters.Soare‘è’and‘í’.TheUnicodestandarddescribeshowcharactersarerepresentedby

codepoints.Acodepointisanintegervalue,usuallydenotedinbase16.Inthestandard,acodepointiswrittenusingthenotationU+12CAtomeanthecharacterwithvalue0x12ca(4810indecimal).Unicode的基本概念TheUnicodestandardcontainsalotoftableslistingcharactersandtheircorrespondingcodepointsUnicode的基本概念A(yù)characterisrepresentedonascreenoronpaperbyasetofgraphicalelementsthat’scalledaglyph(字型)MostPythoncodedoesn’tneedtoworryaboutglyphs;figuringoutthecorrectglyphtodisplayisgenerallythejobofaGUItoolkitoraterminal’sfontrendererEncoding(編碼)AUnicodestringisasequenceofcodepoints,whicharenumbersfrom0to0x10ffff(十進(jìn)制:1,114,111)Thissequenceneedstoberepresentedasasetofbytes(meaning,valuesfrom0–255)inmemory.TherulesfortranslatingaUnicodestringintoasequenceofbytesarecalledan

encoding.Encoding(編碼)/unicode-converter一種簡易的編碼方式Thefirstencodingyoumightthinkofisanarrayof32-bit

integers.(2^32=4,294,967,296,whereastherangeofUnicodecodepointsisupto1,114,111)Inthisrepresentation,thestring“Python”wouldlooklikethis:一種簡易的編碼方式用32-bitinteger編碼,有缺點(diǎn):It’snotportable;differentprocessorsorderthebytesdifferently.It’sverywastefulofspace.Inmosttexts,themajorityofthecodepointsarelessthan127,orlessthan255,soalotofspaceisoccupiedbyzerobytes.It’snotcompatiblewithexistingCfunctionssuchasstrlen(),soanewfamilyofwidestringfunctionswouldneedtobeused.ManyInternetstandardsaredefinedintermsoftextualdata,andcan’thandlecontentwithembeddedzerobytes.解決方案思想:不要用固定長度的32-bitinteger(4bytes)。對常用的字符,給其一個(gè)小的編號(hào)(1byte),以節(jié)省空間;對不常用的字符,給其一個(gè)大編號(hào)一定要兼容已有的編碼標(biāo)準(zhǔn)(ASCII)UTF-8isoneofthemostcommonlyusedencodings.UTFstandsfor“UnicodeTransformationFormat”,andthe“8”meansthat8-bitnumbersareusedintheencoding.UTF-8UTF-8usesthefollowingrules:Ifthecodepointis<128,it’srepresentedbythecorrespondingbytevalue.Ifthecodepointisbetween128and0x7ff(十進(jìn)制:2047),it’sturnedintotwobytevaluesbetween128and255.Codepoints>0x7ffareturnedintothree-orfour-bytesequences,whereeachbyteofthesequenceisbetween128and255.UTF-8UTF-8hasseveralconvenientproperties:ItcanhandleanyUnicodecodepoint.AUnicodestringisturnedintoastringofbytescontainingnoembeddedzerobytes.Thisavoidsbyte-orderingissues,andmeansUTF-8stringscanbeprocessedbyCfunctionssuchasstrcpy()andsentthroughprotocolsthatcan’thandlezerobytes.AstringofASCIItextisalsovalidUTF-8text.UTF-8isfairlycompact;themajorityofcodepointsareturnedintotwobytes,andvalueslessthan128occupyonlyasinglebyte.Unicode現(xiàn)狀目前的Unicode字符分為17組編排,每組被稱為平面(Plane),而每平面擁有65536個(gè)碼位,共1,114,112個(gè)。目前只用了少數(shù)平面Unicode至今仍在不斷增修,每個(gè)新版本都加入更多新的字符。目前最新的版本為目前最新的版本為2020年3月公布的13.0.0,已經(jīng)收入143,859個(gè)字符超過9萬個(gè)字符與漢字有關(guān)不只是文字,而是包羅萬象例如:/charts/PDF/U1F300.pdf費(fèi)斯托斯圓盤費(fèi)斯托斯圓盤(PhaistosDisc)于1908年發(fā)現(xiàn)于希臘克里特島南部的斐斯托斯,黏土質(zhì)地,大約制成于公元前2000年前圓盤上有至今未能釋讀的古文字,用45種不同符號(hào)表示241個(gè)印記費(fèi)斯托斯圓盤費(fèi)斯托斯圓盤費(fèi)斯托斯圓盤也有Unicode!/charts/PDF/U101D0.pdfPython字符串的常用操作字符串在Python中,字符串也屬于序列類型,除了支持序列通用方法(包括分片操作)以外,還支持特有的字符串操作方法。字符串屬于不可變序列類型,不可以被在原處修改字符串Python字符串駐留機(jī)制:對于短字符串,將其賦值給多個(gè)不同的對象時(shí),內(nèi)存中只有一個(gè)副本,多個(gè)對象共享該副本長字符串不遵守駐留機(jī)制轉(zhuǎn)義字符(escapecharacter)轉(zhuǎn)義字符(escapecharacter),或稱轉(zhuǎn)義序列(escapesequence):反斜杠“\”,以及在其后的一個(gè)或多個(gè)字符,合起來在最終的字符串對象中會(huì)被一個(gè)單個(gè)字符所替代轉(zhuǎn)義字符讓我們能夠在字符串中嵌入一些不容易通過鍵盤輸入的字符轉(zhuǎn)義字符(escapecharacter)例如,這里有一個(gè)5個(gè)字符的字符串,其中嵌入了一個(gè)換行符和一個(gè)制表符:轉(zhuǎn)義字符(escapecharacter)如果不是轉(zhuǎn)義字符…對于一個(gè)“反斜杠+字符”的組合,如果這個(gè)組合不屬于轉(zhuǎn)義字符,那么就直接在最終的字符串中保留反斜杠。例如,以下的s1和s2這兩個(gè)字符串的值是相等的如果不是轉(zhuǎn)義字符…如果你想要一個(gè)“真正的反斜杠”字符,最好明確地表明否則,會(huì)帶來不易察覺的bug。比如,為了表示W(wǎng)indows下的路徑,只使用一個(gè)反斜杠“\”是危險(xiǎn)的,因?yàn)槟愫芸赡芤肓宿D(zhuǎn)義字符正確的做法是,如果希望寫出明確的常量反斜杠字符,重復(fù)兩個(gè)反斜杠(“\\”)或者使用raw字符串raw字符串抑制轉(zhuǎn)義如果字母r(大寫或小寫)出現(xiàn)在字符串的第一個(gè)引號(hào)之前,那么它將關(guān)閉轉(zhuǎn)義機(jī)制另一種辦法是:因?yàn)閮蓚€(gè)反斜杠是一個(gè)反斜杠的轉(zhuǎn)義,也可以通過寫兩個(gè)反斜杠來表示一個(gè)“真正的反斜杠”字符串格式化字符串格式化常用格式字符格式字符說明%s字符串(采用str()的顯示)%r字符串(采用repr()的顯示)%c單個(gè)字符%b二進(jìn)制整數(shù)%d十進(jìn)制整數(shù)%i十進(jìn)制整數(shù)%o八進(jìn)制整數(shù)%x十六進(jìn)制整數(shù)%e指數(shù)(基底寫為e)%E指數(shù)(基底寫為E)%f、%F、%F浮點(diǎn)數(shù)%g指數(shù)(e)或浮點(diǎn)數(shù)(根據(jù)顯示長度)%G指數(shù)(E)或浮點(diǎn)數(shù)(根據(jù)顯示長度)%%字符"%""%"字符串格式化字符串格式化/2/library/string.html#format-examples字符串格式化str.format()功能強(qiáng)大,值得仔細(xì)研究字符串常用方法find()、rfind()、index()、rindex()、count()find()和rfind方法分別用來查找一個(gè)字符串在另一個(gè)字符串指定范圍(默認(rèn)是整個(gè)字符串)中首次和最后一次出現(xiàn)的位置,如果不存在則返回-1;index()和rindex()方法用來返回一個(gè)字符串在另一個(gè)字符串指定范圍中首次和最后一次出現(xiàn)的位置,如果不存在則拋出異常;count()方法用來返回一個(gè)字符串在另一個(gè)字符串中出現(xiàn)的次數(shù)。字符串常用方法>>>s="apple,peach,banana,peach,pear">>>s.find("peach")6>>>s.find("peach",7)19>>>s.find("peach",7,20)-1>>>s.rfind('p')25>>>s.index('p')1>>>s.index('pe')6>>>s.index('pear')25>>>s.index('ppp')Traceback(mostrecentcalllast):File"<pyshell#11>",line1,in<module>s.index('ppp')ValueError:substringnotfound>>>s.count('p')5>>>s.count('pp')1>>>s.count('ppp')0字符串常用方法split()、rsplit()、partition()、rpartition()split()和rsplit()方法分別用來以指定字符為分隔符,將字符串左端和右端開始將其分割成多個(gè)字符串,并返回包含分割結(jié)果的列表;partition()和rpartition()用來以指定字符串為分隔符將原字符串分割為3部分,即分隔符前的字符串、分隔符字符串、分隔符后的字符串,如果指定的分隔符不在原字符串中,則返回原字符串和兩個(gè)空字符串。字符串常用方法>>>s="apple,peach,banana,pear">>>li=s.split(",")>>>li["apple","peach","banana","pear"]>>>s.partition(',')('apple',',','peach,banana,pear')>>>s.rpartition(',')('apple,peach,banana',',','pear')>>>s.rpartition('banana')('apple,peach,','banana',',pear')>>>s="2014-10-31">>>t=s.split("-")>>>print(t)['2014','10','31']>>>print(list(map(int,t)))[2014,10,31]字符串常用方法對于split()和rsplit()方法,如果不指定分隔符,則字符串中的任何空白符號(hào)(包括空格、換行符、制表符等等)都將被認(rèn)為是分隔符,返回包含最終分割結(jié)果的列表。>>>s='helloworld\n\nMynameisDong'>>>s.split()['hello','world','My','name','is','Dong']>>>s='\n\nhelloworld\n\n\nMynameisDong'>>>s.split()['hello','world','My','name','is','Dong']>>>s='\n\nhello\t\tworld\n\n\nMyname\tisDong'>>>s.split()['hello','world','My','name','is','Dong']字符串常用方法split()和rsplit()方法還允許指定最大分割次數(shù)>>>s='\n\nhello\t\tworld\n\n\nMynameisDong'>>>s.split(None,1)['hello','world\n\n\nMynameisDong']>>>s.rsplit(None,1)['\n\nhello\t\tworld\n\n\nMynameis','Dong']>>>s.split(None,2)['hello','world','MynameisDong']>>>s.rsplit(None,2)['\n\nhello\t\tworld\n\n\nMyname','is','Dong']>>>s.split(None,5)['hello','world','My','name','is','Dong']>>>s.split(None,6)['hello','world','My','name','is','Dong']字符串常用方法字符串聯(lián)接join()例子:>>>li=["apple","peach","banana","pear"]>>>sep=",">>>s=sep.join(li)>>>s"apple,peach,banana,pear"不推薦使用+連接字符串,優(yōu)先使用join()方法字符串常用方法lower()、upper()、capitalize()、title()、swapcase()分別用來將字符串轉(zhuǎn)換為小寫、大寫字符串、將字符串首字母變?yōu)榇髮?、將每個(gè)單詞的首字母變?yōu)榇髮懸约按笮懟Q>>>s="WhatisYourName?">>>s2=s.lower()>>>s2"whatisyourname?">>>s.upper()"WHATISYOURNAME?">>>s2.capitalize()"Whatisyour,name?">>>s.title()'WhatIsYourName?'>>>s.swapcase()'wHATISyOURnAME?'字符串常用方法生成映射表函數(shù)maketrans()和按映射表關(guān)系轉(zhuǎn)換字符串函數(shù)translate()>>>importstring>>>table=string.maketrans("abcdef123","uvwxyz@#$")>>>s="Pythonisagreateprogramminglanguage.Ilikeit!">>>s.translate(table)"Pythonisugryutyprogrumminglunguugy.Ilikyit!">>>s.translate(table,"gtm")#第二個(gè)參數(shù)表示要?jiǎng)h除的字符"Pyhonisuryuyproruinlunuuy.Ilikyi!"字符串常用方法strip()、rstrip()、lstrip()分別用來刪除兩端、右端或左端的空格或連續(xù)的指定字符>>>s="abc">>>s2=s.strip()>>>s2"abc">>>"aaaassddf".strip("a")"ssddf">>>"aaaassddf".strip("af")"ssdd">>>"aaaassddfaaa".rstrip("a")'aaaassddf'>>>"aaaassddfaaa".lstrip("a")'ssddfaaa'字符串常用方法內(nèi)置函數(shù)eval()>>>eval("3+4")7>>>a=3>>>b=5>>>eval('a+b')8>>>importmath>>>eval('help(math.sqrt)')Helponbuilt-infunctionsqrtinmodulemath:sqrt(...)sqrt(x)Returnthesquarerootofx.>>>eval('math.sqrt(3)')1.7320508075688772>>>eval('aa')Traceback(mostrecentcalllast):File"<pyshell#3>",line1,in<module>eval('aa')File"<string>",line1,in<module>NameError:name'aa'isnotdefined字符串常用方法成員判斷>>>"a"in"abcde"True>>>"j"in"abcde"Falses.startswith(t)、s.endswith(t)判斷字符串是否以指定字符串開始或結(jié)束>>>importos>>>[filenameforfilenameinos.listdir(r'c:\\')iffilename.endswith(('.bmp','.jpg','.gif'))]字符串常用方法center()、ljust()、rjust()返回指定寬度的新字符串,原字符串居中、左對齊或右對齊出現(xiàn)在新字符串中,如果指定寬度大于字符串長度,則使用指定的字符(默認(rèn)為空格)進(jìn)行填充>>>'Helloworld!'.center(20)'Helloworld!'>>>'Helloworld!'.center(20,'=')'====Helloworld!===='>>>'Helloworld!'.ljust(20,'=')'Helloworld!========'>>>'Helloworld!'.rjust(20,'=')'========Helloworld!'字符串常量>>>importstring>>>string.digits'0123456789'>>>string.punctuation'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'>>>string.letters'ABCDEFGHIJKLMNOPQRSTUVWXYZabcde

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論