字符串基礎(chǔ)
本章范圍
探索Python的str字符串類(lèi)型楼雹,它處理ASCII文本脐雪,不管使用哪個(gè)版本的python它都同樣工作详幽。對(duì)于Unicode的大部分內(nèi)容本章不會(huì)涉及太多筛欢,地37章你會(huì)再次遇到的。
Unicode簡(jiǎn)介
ASCII是Unicode文本的一種簡(jiǎn)單形式唇聘,但只是眾多可能的編碼和字母表中的一種版姑。
在Python3.X中,有三種字符串類(lèi)型迟郎,str用于Unicode文本(包括ASCII)剥险,bytes用于二進(jìn)制數(shù)據(jù)(包括已編碼的文本),而bytearray是bytes的一個(gè)可修改的變體宪肖。文件在兩種模式下工作表制,文本,它將內(nèi)容表示為str類(lèi)型并實(shí)現(xiàn)Unicode編碼匈庭,二進(jìn)制夫凸,它以原始bytes的形式處理,且不做數(shù)據(jù)轉(zhuǎn)換阱持。
大多數(shù)程序員不需要掌握最前沿的Unicode細(xì)節(jié)夭拌,所以關(guān)于Unicode的大部分內(nèi)容放在37章。
字符串基礎(chǔ)
從實(shí)際的角度來(lái)看,字符串可以用來(lái)表示能夠編碼的文本或字節(jié)的任何事物鸽扁。這樣的文本包包含符號(hào)和詞語(yǔ)蒜绽、載入到內(nèi)存中的文本文件的內(nèi)容。Internet網(wǎng)址和Python源代碼等桶现。字符可以用來(lái)保持用于媒體文件和網(wǎng)絡(luò)傳輸?shù)脑甲止?jié)躲雅,還有國(guó)際化程序使用的代碼和編碼形式的非ASCII Unicode文本。
Python的字符串被劃分為不可變序列這一類(lèi)別骡和,意味著字符串所包含的字符操作從左到右的位置順序相赁,并且他們不可用在原位置修改。
下面將介紹常見(jiàn)的字符串字面量和操作
操作? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 解釋
S = ' '? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 空字符串
S = "spam's"? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?雙引號(hào)和單引號(hào)相同
S = 's\np\ta\x00m'? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 轉(zhuǎn)義序列
S = """....MULITILINE..."""? ? ? ? ? ? ? ? ? ? ? ? ? ?三引號(hào)快字符串
S = r'\temp\spam'? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?原始字符串(不轉(zhuǎn)義)
B = b'sp\xc4m'? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? python2.6,2.7和Python3.X中的字節(jié)串
U = u'sp\u00c4m'? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Python2.X和3.3+中的Unicode字符串
S1 + S2? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 拼接
S * 3? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?重復(fù)
S[i]? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 索引
S[i:j]? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 分片
len(S)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 長(zhǎng)度
“a{0} parrot”.format(kind)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 字符串格式化方法
S.find('pa')? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 字符串方法:搜索
S.rstrip()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 移除右側(cè)空格
S.replace('pa','xx')? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?替換
S.split(',')? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?用分隔符分組慰于,這里的分隔符是 ,?
S.isdight()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?內(nèi)容測(cè)試
S.lower()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?大小寫(xiě)轉(zhuǎn)換
S.endwith('spam')? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?尾部測(cè)試
S.encode('latin-1')? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Unicode編碼
B.decode('utf8')? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Unicode解碼
for x in S: print(x)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?迭代
'spam' in S? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?成員關(guān)系
[c ** 2 for c in S]? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 成員關(guān)系
map(ord,S)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ord返回單個(gè)字符的ASCII序號(hào)
re.match('sp(.*)am',line)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 模式匹配钮科,庫(kù)模塊
除了這些操作外,Python還支持更高級(jí)的基于模式的字符串處理過(guò)程婆赠,可使用標(biāo)準(zhǔn)庫(kù)re模式實(shí)現(xiàn)绵脯。Python還支持更高級(jí)的文本處理工具,如XML解釋器休里。
字符串字面量
單引號(hào):? 'spa"m'
雙引號(hào)? ? ?"spa'm"
三引號(hào)? ? ? ? '''....spam...''',"""...spam..."""
轉(zhuǎn)義序列:? ? ? ? "s\tp\na\0m"
原始字符串? ? ? r"F:\01010\beautif"
字節(jié)字面量? ? ?b'sp\x01am'
Unicode字面量? ? ?u'eggs\u0020spam'
單引號(hào)和雙引號(hào)的形式是目前最常見(jiàn)的蛆挫,其他的形式都是非謂語(yǔ)特定功能的,對(duì)于最后兩種的討論將在第37章妙黍。
單引號(hào)和雙引號(hào)是一樣的
在Python字符串周?chē)睬郑瑔我?hào)和雙引號(hào)字符是可以互換的。也就是說(shuō)废境,字符串字面量可以包圍在兩個(gè)單引號(hào)或兩個(gè)雙引號(hào)之中畜挨,兩種形式同樣有效
你不進(jìn)行反斜杠轉(zhuǎn)義就可以在一種引號(hào)的字符串中包含另一種引號(hào)。
如果沒(méi)有逗號(hào)噩凹,Python會(huì)在表達(dá)式中自動(dòng)拼接相鄰的字符串字面量
在這些字符串之間添加逗號(hào)會(huì)創(chuàng)建一個(gè)元組巴元,而不是一個(gè)字符串。
你可以通過(guò)反斜杠轉(zhuǎn)義來(lái)嵌入引號(hào)字符
轉(zhuǎn)義序列代表特殊字符
是一個(gè)劣質(zhì)通過(guò)在引號(hào)前增加員工反斜杠的方式驮宴,在字符串內(nèi)部嵌入一個(gè)引號(hào)逮刨。這代表了字符串中的一種通用模式:反斜杠用來(lái)引入特殊的字符編碼,稱為轉(zhuǎn)義序列堵泽。
轉(zhuǎn)義序列能夠讓我們?cè)谧址星度氩蝗菀淄ㄟ^(guò)鍵盤(pán)輸入的字符修己。字符\以及字符串字面量中在在它后邊的一個(gè)或多個(gè)字符,在生成的字符串對(duì)象中會(huì)被單個(gè)字符所代替迎罗。這個(gè)字符擁有用過(guò)轉(zhuǎn)義序列定義的二進(jìn)制值睬愤。
這里是一個(gè)無(wú)辜字符的字符串,其中嵌入了一個(gè)換行符和一個(gè)制表符纹安。
其中兩個(gè)字符\n表示單個(gè)字符尤辱,在字符串中換行字符的二進(jìn)制值砂豌,類(lèi)似的,序列\(zhòng)t替換為制表符光督。
我們可以查看一下這個(gè)字符串的長(zhǎng)度阳距,為4,一個(gè)ASCII a字符结借,一個(gè)換行字符筐摘,一個(gè)制表符,一個(gè)ASCII b字符船老。
Python提供了一套轉(zhuǎn)義字符序列
轉(zhuǎn)義? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 意義
\newline? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 被省略(行的延續(xù))
\\? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?反斜杠(保留一個(gè)\)
\'? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?單引號(hào)(保留一個(gè)')
\"? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?雙引號(hào)(保留一個(gè)")
\a? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?響鈴
\b? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 退格
\f? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?換頁(yè)
\n? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 換行
\r? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 回車(chē)
\t? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 水平制表符
\v? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 垂直制表符
\xhh? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?十六進(jìn)制值 hh的字符(準(zhǔn)確為2個(gè)數(shù)位)
\ooo? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?八進(jìn)制 ooo 的字符(可達(dá)3個(gè)數(shù)位)
\0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?空字符:二進(jìn)制的0字符(表示字符串結(jié)尾)
\N{ id }? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Unicode數(shù)據(jù)庫(kù)ID
\uhhhh? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?16位十六進(jìn)制的Unicode字符
\Uhhhhhhhh? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?32位十六進(jìn)制的Unicode字符
\other? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 不轉(zhuǎn)義(保留\和other)
一些轉(zhuǎn)義序列運(yùn)行在字符串的字符之間嵌入絕對(duì)二進(jìn)制數(shù)字咖熟。
這里嵌入了兩個(gè)值為二進(jìn)制0的字符。
在Python中努隙,這樣的零(空)字符不會(huì)像C語(yǔ)言空字節(jié)那樣去結(jié)束一個(gè)字符串球恤。Python在內(nèi)存中保存整個(gè)字符串的長(zhǎng)度和文本。事實(shí)上荸镊,Python中沒(méi)有任何字符會(huì)結(jié)束一個(gè)字符串。下面是一個(gè)完全由絕對(duì)二進(jìn)制字符組成的字符串
注意堪置,不管任何指定不可打印字符躬存,Python都以16進(jìn)制顯示,我們可以自由地組合絕對(duì)數(shù)值轉(zhuǎn)義和更多的符號(hào)轉(zhuǎn)義類(lèi)型舀锨。
當(dāng)在Python中處理二進(jìn)制數(shù)據(jù)文件時(shí)岭洲,了解這些知識(shí)顯得格外重要。由于他們的內(nèi)容在腳本中是以字符串的形式出現(xiàn)的坎匿,因此處理包含各種二進(jìn)制字節(jié)值的二進(jìn)制文件也是完全可行的盾剩。,當(dāng)使用二進(jìn)制模式打開(kāi)時(shí)替蔬,文件對(duì)象從外部文件返回原始字符串告私。
關(guān)于最后一條,\other保留\和other承桥。如果Python認(rèn)為\后的字符不是有效的轉(zhuǎn)義編碼驻粟,那么它會(huì)直接在生成的字符串中保留反斜杠。
然而凶异,除非你能夠記住所有的轉(zhuǎn)義序列蜀撑,否則你不應(yīng)該依賴于這種方式。如果你想玩在字符串中明確的編寫(xiě)\剩彬,應(yīng)該使用\\酷麦,或者使用原始字符串。
原始字符阻止轉(zhuǎn)義
一個(gè)簡(jiǎn)單的例子喉恋,這里簡(jiǎn)單看是一個(gè)打開(kāi)文件的命令票唆,注意一下其中內(nèi)容拷况,有\(zhòng)n,有\(zhòng)t枯芬。這讓Python很難理解這是一個(gè)文件路徑。
這正是原始字符串需要解決的問(wèn)題徘意。如果字母r(大寫(xiě)或小寫(xiě))出現(xiàn)在字符串的第一個(gè)引號(hào)前面,它將會(huì)關(guān)閉轉(zhuǎn)義機(jī)制轩褐。結(jié)果節(jié)Python將會(huì)將反斜杠作為字面量來(lái)保持椎咧,完全就像輸入的那樣。尤其是Windows系統(tǒng)的文件路徑前面加上r才能更好的工作把介。
實(shí)際上勤讽,但Python打印了一個(gè)嵌入反斜杠的字符串時(shí),它直線也會(huì)使用這種雙反斜杠
的方案拗踢。
和數(shù)字的表示相同脚牍,交互提示打印結(jié)果的默認(rèn)格式就像代碼一樣,而且在輸入中有轉(zhuǎn)義的反斜杠巢墅。打印語(yǔ)句提供了一種對(duì)用戶更友好的格式诸狭,而在每處僅有一個(gè)反斜杠。
換了一個(gè)短的例子君纫,通過(guò)len函數(shù)檢查驯遇,發(fā)現(xiàn)每個(gè)反斜杠只占一個(gè)字符。
注意:
盡管r能阻止轉(zhuǎn)義蓄髓,但即便一個(gè)原始字符串也不能夠以單個(gè)反斜杠借我叉庐,因?yàn)椋葱备軙?huì)轉(zhuǎn)義后面的引號(hào)字符会喝,你必須轉(zhuǎn)義包圍的引號(hào)字符一將其嵌入到字符串中陡叠,也就是說(shuō),r'...\'表示一個(gè)有效的字符串字面量肢执,因此一個(gè)也原始字符串不能以奇數(shù)個(gè)反斜杠結(jié)尾枉阵。如果需要用單個(gè)反斜杠結(jié)束一個(gè)原始字符串,可以使用兩個(gè)反斜杠并切片切掉第二個(gè)
手動(dòng)添加一個(gè)反斜杠
或者忽略原始字符串原并在普通字符串中把反斜杠改為雙反斜杠
但是這樣對(duì)于前面的字符串如果有內(nèi)容需要不轉(zhuǎn)義就會(huì)出現(xiàn)問(wèn)題蔚万,
就像這樣岭妖,所以推薦前兩種方法。
三引號(hào)編寫(xiě)多行塊字符串
關(guān)于字符串還有一種三引號(hào)的字符串的字面量格式反璃,有時(shí)候稱為塊字符串昵慌,這是一種對(duì)于編寫(xiě)多行文本數(shù)據(jù)來(lái)說(shuō)很便捷的語(yǔ)法,這種形式以是三個(gè)引號(hào)開(kāi)始淮蜈,單引號(hào)雙引號(hào)都行斋攀,但是不能混著用,并緊跟任意行數(shù)的文本梧田,并且以與開(kāi)始相同的三個(gè)引號(hào)結(jié)束淳蔼。
這個(gè)字符串橫跨三行侧蘸。Python會(huì)把所有再三行之內(nèi)的文本收集到一個(gè)單獨(dú)的多行字符串中,并在代碼轉(zhuǎn)折處嵌入換行字符鹉梨。
實(shí)際上讳癌,三引號(hào)字符串會(huì)保留所有包圍的文本,包括位于代碼最右邊存皂,你認(rèn)為是注釋的文本晌坤。
這一定很蠢。
三引號(hào)字符串在程序輸入多行文本的任何時(shí)候都是很有用的旦袋。三引號(hào)字符串最常用于文檔字符串骤菠,當(dāng)它出現(xiàn)在文件的特定地點(diǎn)時(shí),會(huì)被當(dāng)作注釋疤孕。
實(shí)際應(yīng)用中的字符串
基本操作
首先是一些簡(jiǎn)單的商乎,創(chuàng)建字符串,拼接祭阀,重復(fù)
重復(fù)最初看起來(lái)有些令人費(fèi)解鹉戚,然而它在相當(dāng)?shù)牡膱?chǎng)合用起來(lái)十分順手。
例如你想要一行星號(hào)作為分隔線
注意運(yùn)算符重載已經(jīng)發(fā)揮了作用柬讨,這里正在使用運(yùn)算符+和*崩瓤。它們與應(yīng)用于數(shù)字時(shí)的加法和乘法運(yùn)算符+和*是相同的。Python執(zhí)行了正確的操作踩官,因?yàn)樗辣患雍捅怀说膶?duì)象類(lèi)型。但是小心境输,這個(gè)規(guī)則并不和你預(yù)期的那樣隨意蔗牡。例如。Python吧允許你在 + 表達(dá)式中混合數(shù)字和字符串嗅剖。例如‘a(chǎn)sdw' + 777
你也可以使用for語(yǔ)句在循環(huán)中對(duì)字符串進(jìn)行迭代辩越。for語(yǔ)句重復(fù)動(dòng)作,并使用in表達(dá)式運(yùn)算符對(duì)字符和子字符串進(jìn)行成員關(guān)系的測(cè)試信粮。這本質(zhì)上是一種搜索黔攒。對(duì)于子字符串,in很像是str.find()方法强缘,但是它的返回是一個(gè)布爾類(lèi)型督惰,而不是子字符串的位置
for 循環(huán)指派一個(gè)變量去獲取一個(gè)序列,這里是一個(gè)字符串旅掂,中的連續(xù)元素赏胚,并對(duì)每一個(gè)元素執(zhí)行一條或多條語(yǔ)句。
索引和分片
字符串是字符的有序集合商虐,所以我們能夠通過(guò)位置訪問(wèn)它的元素觉阅。在Python中崖疤,字符串的字符是通過(guò)索引來(lái)獲取的,在字符串后面的方括號(hào)中提供所需要的元素的偏移量典勇。你就會(huì)得到在指定位置上的單字符字符串劫哼。
Python的偏移量是從0開(kāi)始的,并且以比字符串的長(zhǎng)度小1的偏移量結(jié)束割笙。Python還支持負(fù)偏移量权烧。一個(gè)負(fù)偏移量會(huì)與字符串的長(zhǎng)度相加從而得到一個(gè)正偏移量】任担可以吧正偏移量看做從結(jié)尾處反向計(jì)數(shù)豪嚎。
偏移和分片,正偏移量從左到右谈火,0為第一個(gè)元素侈询,負(fù)偏移量從右到左,-1為最后一個(gè)偏移量糯耍。
上邊的例子中最后一行對(duì)分片進(jìn)行了演示扔字,它是索引的一種擴(kuò)展形式,返回的是一個(gè)完整片段
這里講的分片也指的是切片温技,是同一個(gè)東西的不同叫法革为。分片可以用來(lái)提取數(shù)據(jù)列,丟掉前綴和后綴文本等待舵鳞。
分片的基礎(chǔ)知識(shí)很簡(jiǎn)單震檩,當(dāng)你使用以一對(duì)冒號(hào)分隔的偏移量對(duì)字符串這樣的序列對(duì)象進(jìn)行索引時(shí),Python將會(huì)返回一個(gè)新的對(duì)象蜓堕,其中包含了由這對(duì)偏移量表示的連續(xù)內(nèi)容抛虏,左邊的偏移量作為下邊界(包括下邊界),而右邊的偏移量作為上邊界(不包括上邊界)套才。即Python將獲取從下邊界自動(dòng)但是不包括上邊界的所有元素迂猴,并返回一個(gè)包含所有獲取元素的新的對(duì)象,如果省略這兩個(gè)偏移量背伴,上下邊界的默認(rèn)值為0的被分片對(duì)象的長(zhǎng)度沸毁。
索引獲取特定偏移量處的元素:? ? S[i]
第一個(gè)元素的偏移量是0
負(fù)偏移量意味著從結(jié)尾或右端反向進(jìn)行計(jì)數(shù)
S[0]獲取第一個(gè)元素
S[-2]獲取倒數(shù)第二個(gè)元素
分片提取序列的類(lèi)型部分:? ? ? ? ? ? ? ? ? ? S[i:j]
上邊界并不包含在內(nèi)
分片的下邊界和上邊界,在缺省時(shí)默認(rèn)為0和序列長(zhǎng)度
S[1:3]獲取從偏移量為1知道但是不包括偏移量為3之間的所有元素
S[1:]獲取從偏移量為1直到末尾(序列長(zhǎng)度)之間的所有元素
S[:3]獲取從偏移量為0直到但是不包括偏移量為3之間的所有元素
S[:-1]獲取從偏移量為0但是不包括最后一個(gè)元素之間的所有元素
S[:]獲取從偏移量為0直到末尾之間的所有元素傻寂,實(shí)現(xiàn)了對(duì)S的頂層復(fù)制息尺。
擴(kuò)展的分片(S[i:j:k])接收一個(gè)步長(zhǎng)k,其默認(rèn)值為+1崎逃。允許跳過(guò)元素和反轉(zhuǎn)序列
上面列出的倒數(shù)第二項(xiàng)是一個(gè)非常常見(jiàn)的技巧掷倔,它實(shí)行了對(duì)一個(gè)序列對(duì)象的完全頂層復(fù)制,一個(gè)有著相同的值个绍,但是不同內(nèi)存片區(qū)的對(duì)象勒葱。
擴(kuò)展分片:第三個(gè)限制值和分片對(duì)象
分片的完整形式現(xiàn)在變成了S[I:J:K],它表示提取對(duì)象S中的全部元素浪汪,從偏移量I直到偏移量J-1,每隔K個(gè)元素索引因此凛虽。第三個(gè)限制K的默認(rèn)值為正數(shù)1死遭,這就是通常在一個(gè)分片中從左至右提取每一個(gè)元素的原因。
通過(guò)設(shè)置步長(zhǎng)K來(lái)指定步長(zhǎng)凯旋,因此A[::3]會(huì)取出序列中從頭到尾每三個(gè)元素取出一個(gè)
也可以使用負(fù)數(shù)作為步長(zhǎng)以相反的順序收集元素呀潭。
使用應(yīng)該負(fù)數(shù)步長(zhǎng),前兩個(gè)邊界的意義實(shí)際上進(jìn)行了反轉(zhuǎn)至非。
步長(zhǎng)為負(fù)數(shù)時(shí)钠署,從右向左,也就是上下邊界默認(rèn)值發(fā)生調(diào)換荒椭。從左到右步長(zhǎng)變成從右到左谐鼎。
字符串轉(zhuǎn)換工具
python的座右銘之一就是拒絕猜測(cè)。作為一個(gè)基本的例子趣惠,在Python中不能夠相加數(shù)字和字符串狸棍,即使這個(gè)字符串是全數(shù)字的。
這是有意設(shè)計(jì)的味悄,因?yàn)?既能夠進(jìn)行家訪運(yùn)算也能夠進(jìn)行拼接操作草戈,這種轉(zhuǎn)換的選擇會(huì)變得模棱兩可。如果你一定想要這個(gè)字符串和數(shù)字做加法操作應(yīng)該使用轉(zhuǎn)換工具進(jìn)行預(yù)先處理侍瑟,把字符串轉(zhuǎn)換為數(shù)字唐片。
int函數(shù)將字符串轉(zhuǎn)換為數(shù)值,而相應(yīng)的str函數(shù)可以將數(shù)字轉(zhuǎn)換為字符串涨颜,盡管你不能再+這樣的運(yùn)算符兩側(cè)混用字符串和數(shù)字類(lèi)型牵触,但是你能夠在進(jìn)行這樣的操作之前手動(dòng)轉(zhuǎn)換。
類(lèi)似的內(nèi)置函數(shù)可以在浮點(diǎn)數(shù)和字符串之間相互轉(zhuǎn)換
字符串代碼轉(zhuǎn)換
關(guān)于字符串轉(zhuǎn)換這個(gè)主題咐低,還可以將單個(gè)字符轉(zhuǎn)換為其底層的整數(shù)碼(它的ASCII字節(jié)值),可將其傳遞給內(nèi)置的ord函數(shù)來(lái)實(shí)現(xiàn)袜腥,它返回用來(lái)表示內(nèi)存中相應(yīng)字符的實(shí)際二進(jìn)制值见擦,而chr函數(shù)會(huì)執(zhí)行相反的操作,它獲取整數(shù)碼并將其轉(zhuǎn)換為對(duì)應(yīng)的字符:
從技術(shù)上講羹令,這兩者都可以在字符和它們的Unicode序數(shù)或“碼點(diǎn)”之間相互轉(zhuǎn)換鲤屡。Unicode序數(shù)只是它們?cè)诘讓幼址械淖R(shí)別數(shù)字。對(duì)于ASCII文本福侈,碼點(diǎn)是熟悉的7位整數(shù)酒来。可用內(nèi)存中的單個(gè)字節(jié)存儲(chǔ)肪凛,但是對(duì)于其他種類(lèi)的Unicode文本堰汉,碼點(diǎn)的范圍可能更加廣闊辽社。
至少對(duì)于但字符串來(lái)說(shuō),這提供了一種使用內(nèi)置函數(shù)int將字符串轉(zhuǎn)換為整數(shù)的代替方案翘鸭。
修改字符串
字符串是不可變序列滴铅,就是不能在原位置修改一個(gè)字符串。
如果想要改變一個(gè)字符串就乓,通常需要利用分片這樣的工具來(lái)創(chuàng)建并賦值一個(gè)新字符串汉匙。
倘若必要的話,可以將結(jié)果賦值回字符串最初的名稱
第一個(gè)例子通過(guò)在s后面拼接一個(gè)字符串生蚁,并賦值為原來(lái)的名字噩翠、第二個(gè)類(lèi)中通過(guò)分片,使用邦投,拼接將8個(gè)字符變成11個(gè)字符伤锚。
每次操作都是生成新的字符串,字符串方法也都是生成新的字符串對(duì)象尼摹。如果愿意保留那些對(duì)象见芹,你可以將他們賦值為新的變量名。每一次修改字符串都生成一個(gè)字符串并不像聽(tīng)起來(lái)那么效率低下蠢涝,就像以前講到的玄呛,Python在運(yùn)行的過(guò)程中對(duì)不在使用的字符串對(duì)象進(jìn)行垃圾回收,所以新的對(duì)象重用了之前所占用的空間和二。
最后徘铝,可以通過(guò)字符串各耍表達(dá)式來(lái)創(chuàng)建新的文本值。
盡管看起來(lái)像是替換惯吕,但格式化的結(jié)果是一個(gè)新的字符串對(duì)象惕它,而不是修改后的對(duì)象。
字符串方法
除了表達(dá)式運(yùn)算符外废登,字符串還有個(gè)了一系列實(shí)現(xiàn)更復(fù)雜的文本處理任務(wù)的方法淹魄。在Python中,表達(dá)式和內(nèi)置函數(shù)可以在不同的類(lèi)型之間工作堡距,但是方法通常特定于對(duì)象類(lèi)型甲锡,例如字符串方法。只在字符串對(duì)象上起作用羽戒。盡管一些類(lèi)型的方法集在Python3.X中有交集缤沦,例如,許多類(lèi)型都有count和copy方法易稠,但是比起其他工具缸废,它們與類(lèi)型的相關(guān)程度仍然更大一些
方法調(diào)用語(yǔ)法
方法是與特定對(duì)象相關(guān)聯(lián),并作用特定對(duì)象的簡(jiǎn)單函數(shù)。從技術(shù)的角度來(lái)講企量,它們是屬于對(duì)象的屬性测萎,而這些屬性碰巧引用了可調(diào)用函數(shù)罷了,這些函數(shù)總有一個(gè)隱含的主體梁钾。從更精細(xì)的角度看绳泉,函數(shù)就是代碼包,而方法調(diào)用同時(shí)結(jié)合了兩種操作:因此屬性獲取和一次函數(shù)調(diào)用:
屬性獲饶沸骸:
具有object.attribute形式的表達(dá)式可以理解為零酪,獲取對(duì)象object中的attribute屬性的值
調(diào)用表達(dá)式:
具有functiom(orguments)形式的表達(dá)式可以理解為:調(diào)用函數(shù)function的代碼,向其傳遞零個(gè)或多個(gè)逗號(hào)分隔為的參數(shù)argument對(duì)象拇勃,并返回函數(shù)function的結(jié)果值四苇。
合并二者可以調(diào)用一個(gè)方法對(duì)象,方法調(diào)用表達(dá)式
object.method(arguments)
從左至右進(jìn)行求值方咆,Python實(shí)現(xiàn)讀取對(duì)象object的方法method月腋,然后調(diào)用它,傳遞僅對(duì)象object和參數(shù)argument瓣赂∮苌В或者深入淺出的說(shuō),方法調(diào)用用表達(dá)式意味著:使用參數(shù)調(diào)用方法處理對(duì)象煌集。
如果方法計(jì)算出一個(gè)結(jié)果妓肢,它還會(huì)作為這個(gè)方法調(diào)用表達(dá)式的結(jié)果返回。
這一映射對(duì)于內(nèi)置類(lèi)型以及我們之后要小心的用戶定義的類(lèi)都是有效的苫纤,絕大多數(shù)對(duì)象都擁有可調(diào)用的方法碉钠,而且所有對(duì)象都可以通過(guò)這一同樣的方法調(diào)用語(yǔ)法來(lái)訪問(wèn)。為了調(diào)用對(duì)象的方法卷拘,必須確保這個(gè)對(duì)象是存在的喊废,如果缺少主題,則方法不能夠運(yùn)行(而且?guī)缀鯖](méi)有任何意義)栗弟。
字符串方法
我在這里先創(chuàng)建了一個(gè)簡(jiǎn)單的字符串s污筷,然后使用dir()函數(shù)查看一下這個(gè)字符串的方法
如你所見(jiàn),使用len()查看一下這個(gè)列表的長(zhǎng)度乍赫,78.我們沒(méi)有足夠的精力用大篇幅介紹全部?jī)?nèi)容颓屑。你可以查閱Python的庫(kù)手冊(cè)或參考文獻(xiàn)了解所有的細(xì)節(jié)。為了幫助你的入門(mén)耿焊,后面將會(huì)介紹一部分內(nèi)容。
字符串方法示例:修改字符串
拋去bytesarray遍搞,它支持原位置文本修改罗侯,但只適用于簡(jiǎn)單的8位類(lèi)型。
字符串是不可變的溪猿,所以不能再原位置進(jìn)行修改钩杰。
通常纫塌,為了從一原有字符串中創(chuàng)建新的文本值,可以通過(guò)分片和拼接這樣的操作來(lái)建立新的字符串讲弄。例如措左,為了替換字符串中的兩個(gè)字符,可以使用如下的代碼完成避除。
replace方法比這第一段代碼表現(xiàn)的更有普遍性怎披。它的參數(shù)是最初子串(任意長(zhǎng)度)和替換最初子串的字符串(任意長(zhǎng)度),之后進(jìn)行全局搜索瓶摆,有多少就替換多少凉逛。
注意一下大小寫(xiě),Python是嚴(yán)格區(qū)分大小寫(xiě)的群井,還有記住符號(hào)要切換英文状飞,這都是常見(jiàn)錯(cuò)誤。
鑒于這樣的角色书斜,replace可以當(dāng)作工具來(lái)私信啊替換模板诬辈。如果西藥替換可能實(shí)在任意偏移量出現(xiàn)的一個(gè)固定長(zhǎng)度的字符串,可以在做一個(gè)替換荐吉,或者使用字符串方法find搜索子串焙糟,之后使用分片。
find方法返回子串出現(xiàn)處的偏移量稍坯,默認(rèn)從前向后搜索酬荞,或者未找到時(shí)返回-1。
拼接操作和replace方法每次運(yùn)行都會(huì)生成新的字符串對(duì)象瞧哟。如果你不得不對(duì)一個(gè)超長(zhǎng)的字符串進(jìn)行多處修改混巧,為了優(yōu)化程序的性能,你可以將字符串轉(zhuǎn)換為一個(gè)支持原位置修改的對(duì)象勤揩。然后再修改回去咧党。
內(nèi)置的t函數(shù)從任意序列的元素中創(chuàng)建一個(gè)新的列表,在這個(gè)例子中陨亡,它將字符串的字符打散成一個(gè)列表傍衡。修改只有,如果你需要將其轉(zhuǎn)換回一個(gè)字符串负蠕,可以使用字符串的jion方法將列表合并為字符串蛙埂。記住不要用str函數(shù)。
join是字符串的方法遮糖,通過(guò)給定的風(fēng)符來(lái)調(diào)用绣的。join將列表或者其他可迭代對(duì)象中的字符串連接在一起,并在元素中間用分隔符分開(kāi),上面的例子中分隔符為空屡江。你也可以使用一些其他的分隔芭概。
字符串方法示例:解析文本
字符串方法的另一個(gè)常規(guī)角色是以簡(jiǎn)單的文本解析的形式出現(xiàn)的,分析結(jié)果并提取子串惩嘉,為了提取位于固定偏移量出的子串罢洲,我們可以使用分片技術(shù)。
這組數(shù)據(jù)出現(xiàn)在規(guī)定的偏移量處文黎,因此可以通過(guò)分片從最初的字符串中提取出來(lái)惹苗。只要你所需要的數(shù)據(jù)組件有固定的位置,這一技術(shù)就被當(dāng)作解析臊诊,相反鸽粉,如果是通過(guò)某種分隔符分隔開(kāi)了數(shù)據(jù)組件,可以通過(guò)分隔拿出這些組件抓艳。即便數(shù)據(jù)出現(xiàn)在字符串中的任意位置触机。
字符串的split方法將一個(gè)字符串從分隔符處切成一系列子串,在上一個(gè)例子中玷或。我們沒(méi)有給出分隔符參數(shù)儡首,使用默認(rèn)的分隔符是空白,這個(gè)字符串被一個(gè)或多個(gè)的空格偏友,指標(biāo)符或或者換行符分隔蔬胯,之后我們得到所生成的子串列表。
這里我們使用逗號(hào)當(dāng)作分隔符位他,這個(gè)分隔符也可以比單字符更長(zhǎng)氛濒。
盡管使用分片或分隔方法做數(shù)據(jù)解析的潛力有限,但是這兩種方法運(yùn)行都很快鹅髓,而且能夠勝任日常的基本文本提取操作舞竿。
實(shí)際應(yīng)用中的其他常見(jiàn)字符串方法
其他字符串方法都有著更為轉(zhuǎn)義的角色,例如去除每行沒(méi)的空白窿冯,執(zhí)行大小寫(xiě)轉(zhuǎn)換骗奖,測(cè)試內(nèi)容,以及檢測(cè)醒串,為或起始的子字符串:
替代的技巧有時(shí)也能夠取得與字符串方法相同的結(jié)果执桌,例如成員關(guān)系運(yùn)算符in能夠用來(lái)檢測(cè)一個(gè)子串是否存在,而長(zhǎng)度和分片操作則能夠用來(lái)模擬endswith方法
字符串格式化表達(dá)式
字符串格式化允許在單個(gè)步驟中對(duì)一個(gè)字符串執(zhí)行對(duì)個(gè)特定類(lèi)型的替換芜赌。嚴(yán)格來(lái)講仰挣,它不是必須的,但是很實(shí)用缠沈。
字符串格式化表達(dá)式:? ? '....%s...'%(values)
字符串格式化方法調(diào)用? ? '...{}...'.format(value)
關(guān)于字符串格式化表達(dá)式現(xiàn)在基本已經(jīng)棄用椎木,所以這里只講字符串格式化方法調(diào)用违柏。截止Python3.7.3還未被棄用,但是官方也表示十分不推薦香椎,在Python只講標(biāo)準(zhǔn)庫(kù)中%的身影影響了它的棄用,但是應(yīng)該快了禽篱。
字符串格式化方法基礎(chǔ)
字符串對(duì)象的format方法畜伐,是基于支持的函數(shù)調(diào)用語(yǔ)法,而不是表達(dá)式語(yǔ)法躺率,特別的玛界,它使用主題字符串作為模板,并且接受任意多個(gè)參數(shù)悼吱,哦用來(lái)表示將要根據(jù)模板替換的值慎框。
它的使用要求具備函數(shù)和調(diào)用的知識(shí)。但其使用多半是淺顯易懂的后添。在主題字符中笨枯,花括號(hào)通過(guò)為止來(lái)指定替換目標(biāo)以及將要插入的參數(shù)∮鑫鳎花括號(hào)利用是數(shù)字馅精,或者關(guān)鍵字。如{1}粱檀,{food}
本質(zhì)上洲敢,格式阿虎方法調(diào)用紅章的主題字符串也可以是創(chuàng)建一個(gè)臨時(shí)字符串的字面量,并且任意的對(duì)象類(lèi)型對(duì)可以在目標(biāo)上替換茄蚯。反正結(jié)果是字符串压彭,
添加鍵、屬性和偏移量
格式化字符串可以指定對(duì)象屬性和字典鍵渗常,就像在常規(guī)的Python語(yǔ)法中一樣壮不,方括號(hào)指定字典的鍵,而點(diǎn)表示通過(guò)位置或關(guān)鍵字所引用的對(duì)象屬性凳谦。
第一個(gè)例子忆畅,索引字典上的鍵‘kind',然后從已經(jīng)導(dǎo)入的sys模塊對(duì)象獲取‘platform‘屬性尸执。第二個(gè)例子做同樣的事情家凯,但是,通過(guò)關(guān)鍵字而不是位置指定對(duì)象如失。
格式化字符串中的方括號(hào)可以指定列表及其他序列的偏移量來(lái)執(zhí)行索引绊诲,但是,只有單個(gè)正偏移量才能在格式化字符串的語(yǔ)法中有效褪贵。因此噪叙,這一功能并不像是你想象的那樣通用咆爽。要指定負(fù)的偏移量或者使用任意表達(dá)式的結(jié)果盏混,必須在格式化字符串自身之外運(yùn)行表達(dá)式。
對(duì)于最后的要求动雹,可能時(shí)代變了,特異嘗試一下跟压,表達(dá)式胰蝠,負(fù)偏移現(xiàn)在在格式化字符串方法中好使了,我用的是Python3.7.3
高級(jí)格式化方法語(yǔ)法
你可以在格式化字符串中添加額外的語(yǔ)法來(lái)實(shí)現(xiàn)更具體的測(cè)試集震蒋,對(duì)于格式化方法茸塞,我們?cè)诳赡転榭盏奶鎿Q目標(biāo)的標(biāo)識(shí)碼中還是用一個(gè)冒號(hào),后面緊跟著可以指定字段大小查剖,對(duì)齊方式和特定類(lèi)型編碼的格式化說(shuō)明符钾虐。
如下是可以在一個(gè)格式字符串中作為替代目標(biāo)出現(xiàn)的形式化結(jié)果,替代四個(gè)部分都是可選的笋庄,中間必須有空格效扫。
{filedname component ! conversionflag:formatspec}
在這個(gè)替代目標(biāo)語(yǔ)法中:fieldname是便是參數(shù)的一個(gè)可選的數(shù)字或關(guān)鍵字。在python2.7,3.1和后續(xù)版本中可以將其省略以使用相對(duì)參數(shù)編號(hào)
component是有著大于等于兩個(gè)“name”或“[index]”引用的字符串无切,它們可以被省略以是能用完整的參數(shù)值荡短。其中的引用用來(lái)獲取參數(shù)的數(shù)學(xué)或索引值
coversionfalg如果出現(xiàn)以!開(kāi)始哆键,后面跟著r,s,或者a掘托,在這個(gè)值上分別調(diào)用repr,str籍嘹,ascii內(nèi)置函數(shù)闪盔。
formatspec如果出現(xiàn)則以:開(kāi)始,后面跟著文本辱士,指定了如何表示該值泪掀,包括字段寬度,對(duì)齊方式颂碘,補(bǔ)零异赫,小數(shù)精度等細(xì)節(jié),并且以一個(gè)可選的數(shù)據(jù)類(lèi)型碼結(jié)束头岔。
冒號(hào)后面的formatspec組件本身也有豐富的格式塔拳,形式上的描述如下。
[[fill]align][sign][#][0][width][,][.precision][typecode]
其中fill可以是除{或}之外的任意填充字符峡竣;
align可以是<靠抑、>、=或……适掰,分別表示左對(duì)齊右對(duì)齊颂碧,符號(hào)字符后的填充荠列,或居中對(duì)齊,
sign可以是+载城、-或空格肌似;
而,逗號(hào)選項(xiàng)請(qǐng)求表示千分位分隔符诉瓦,
width和precision與在%表達(dá)式中相同锈嫩,
formatspec也可以包含嵌套的只有字段名稱的{}格式化字符串,它從參數(shù)列表動(dòng)態(tài)地獲取值
高級(jí)格式化方法舉例
{0:10}意味著一個(gè)10字符寬的字段中第一個(gè)位置的參數(shù)垦搬,出現(xiàn)的:10表示10字符寬度。
用<>表示左對(duì)齊右對(duì)齊艳汽,
浮點(diǎn)數(shù)支持格式化聲明猴贰。
s? ? ? ? ? ? ? ? ? ?字符串
r? ? ? ? ? ? ? ? ? ? ?與s相同,但使用repr河狐,而不是str
c? ? ? ? ? ? ? ? ? ? ?字符(int或str)
d? ? ? ? ? ? ? ? ? ? ? ?10進(jìn)制數(shù)字(以10為底的整數(shù))
i? ? ? ? ? ? ? ? ? ? ? ? 整數(shù)
o? ? ? ? ? ? ? ? ? ? ? ? 8進(jìn)制整數(shù)(以8為底)
x? ? ? ? ? ? ? ? ? ? ? ? 16進(jìn)制整數(shù)(以16為底)
X? ? ? ? ? ? ? ? ? ? ? ? 與x相同米绕,但是使用大寫(xiě)字母
e? ? ? ? ? ? ? ? ? ? ? ? 帶有指數(shù)的浮點(diǎn)數(shù),小寫(xiě)
E? ? ? ? ? ? ? ? ? ? ? ? 與額相同馋艺,但是使用大寫(xiě)字母
f? ? ? ? ? ? ? ? ? ? ? ? ? 十進(jìn)制浮點(diǎn)數(shù)
F? ? ? ? ? ? ? ? ? ? ????與f相同栅干,但是使用大寫(xiě)字母
g? ? ? ? ? ? ? ? ? ? ? ? 浮點(diǎn)數(shù)e或f
G? ? ? ? ? ? ? ? ? ? ? ? 浮點(diǎn)數(shù)E或F
這里將3.14159變成以帶有指數(shù)的浮點(diǎn)數(shù),第一個(gè)沒(méi)有限制捐祠,第二個(gè)限制小數(shù)點(diǎn)保留3位碱鳞,第三個(gè)變成浮點(diǎn)數(shù)
還是3.14159,第一個(gè)變成浮點(diǎn)數(shù)踱蛀,第二個(gè)浮點(diǎn)數(shù)小數(shù)點(diǎn)保留二位窿给,第三個(gè)規(guī)定了六位數(shù),而且用0填充率拒,所以是06崩泡,如果只是6就用空格填充
fornat方法支持進(jìn)制轉(zhuǎn)換,
x16進(jìn)制猬膨,o八進(jìn)制,b2進(jìn)制角撞。
由于%字符串格式化表達(dá)式官方已經(jīng)不建議使用,所以二者的比較以及延伸的優(yōu)點(diǎn)這里不做討論勃痴。
通用性分類(lèi)
同一分類(lèi)中的類(lèi)型共享同一個(gè)操作集
字符串是·不可變序列:它們不能在原位置上修改谒所,并且它們是按照位置順序的排序的集合,可以通過(guò)偏移量訪問(wèn)召耘。序列類(lèi)型可執(zhí)行的操作包括------拼接百炬,索引,迭代等污它。
更正式來(lái)講剖踊,Python中有三大類(lèi)型分類(lèi)擁有這一般性庶弃。
數(shù)字(整數(shù),浮點(diǎn)數(shù)德澈,小數(shù)歇攻,分?jǐn)?shù)等)
? ? 支持加法和乘法等
序列(字符串,列表梆造,元組)
? ? 支持索引缴守,分片,拼接等
映射(字典)
? ? 支持按照鍵名稱的索引等
我們遇到的很多的其他類(lèi)型都與數(shù)字和字符串類(lèi)似镇辉。例如屡穗,對(duì)于任意的序列對(duì)象X和Y
? ? X+Y會(huì)創(chuàng)建一個(gè)包含了兩個(gè)操作對(duì)象內(nèi)容的新的序列對(duì)象
? ? X*N會(huì)創(chuàng)建一個(gè)包含操作對(duì)象X內(nèi)容N份副本的新的序列對(duì)象。
換句話說(shuō)忽肛,這些操作運(yùn)行起來(lái)對(duì)于任意一種序列對(duì)象都一樣村砂,包括字符串,列表屹逛,元組以及用戶定義的對(duì)象類(lèi)型础废。唯一的區(qū)別就是,你最終得到的新對(duì)象是根據(jù)操作對(duì)象X和Y的類(lèi)型決定的罕模,如果你拼接的列表评腺,那么你將得到一個(gè)新的列表而不是字符串、索引淑掌,分片蒿讥,以及其他的序列操作。在所有類(lèi)型的序列上執(zhí)行的效果都是一樣的锋拖,對(duì)象的類(lèi)型將會(huì)告訴Python去執(zhí)行什么樣的操作诈悍。
可變類(lèi)型能夠在原位置修改
不可變的分類(lèi)是需要特別注意的約束,盡管對(duì)于新用戶來(lái)說(shuō)兽埃,還是有可能在這里犯糊涂的侥钳,如果一個(gè)對(duì)象類(lèi)型是不可變的,你就不能在原位置修改它的值柄错;如果你這么做的話舷夺,將會(huì)報(bào)錯(cuò)。替代的辦法就是售貌,你必須運(yùn)行代碼來(lái)創(chuàng)建一個(gè)新對(duì)象给猾,包含這個(gè)新的值。Python中的主要核心類(lèi)型劃分為如下兩類(lèi):
不可變類(lèi)型(數(shù)字颂跨,字符串敢伸,元組。不可變集合)
? ? 不可變類(lèi)表中的對(duì)象類(lèi)型都不支持原位置修改恒削,盡管我們總是可以運(yùn)行表達(dá)式來(lái)創(chuàng)建新對(duì)象池颈,并將返回的結(jié)果分配給變量
可變對(duì)象
? ? 相反尾序,可變類(lèi)型總是可以通過(guò)不斷生成新對(duì)象的操作在原位修改,而不用創(chuàng)建新的東西躯砰。盡管這樣的對(duì)象可以復(fù)制每币,但是它們也支持在原位置處直接修改。
一般來(lái)說(shuō)琢歇,不可變類(lèi)型能夠保證用過(guò)對(duì)象不會(huì)被重新的其他部分改變兰怠,因而具有一定程度的完整性。詳情空間第六章關(guān)于共享對(duì)象引用的討論李茫。
本章小結(jié)
在本章中揭保,我們深入學(xué)習(xí)了字符串對(duì)象類(lèi)型,我們學(xué)習(xí)如何編寫(xiě)支持字面量魄宏,探索了字符串的操作掖举,包括序列表達(dá)式,字符串方法調(diào)用娜庇,以及表達(dá)式和方法調(diào)用這兩種字符串格式化方法,在這個(gè)過(guò)程中方篮,我們深入討論了各種概念名秀,例如分片,方法調(diào)用和三種塊字符串藕溅。我們也定義了一些在不同類(lèi)型這種普遍適用的核心思想匕得。例如,序列類(lèi)別中的所有類(lèi)型都共享一套完整的操作集巾表。
自己總結(jié)一下
首先一些字符串基礎(chǔ)汁掠,字面量和基本操作,單引號(hào)集币,雙引號(hào)的使用考阱,重要的轉(zhuǎn)義字符,以及三引號(hào)括起來(lái)的多行字符串鞠苟,可以當(dāng)注釋使用乞榨,字符串的索引,分片当娱;字符串轉(zhuǎn)換工具吃既,字符串常見(jiàn)方法,字符串格式化方法format
下面背誦并默寫(xiě)本章習(xí)題
本章習(xí)題
1.字符串的find方法可以用來(lái)搜索到列表嗎跨细?
不可用鹦倚。因?yàn)榉椒ㄊ翘囟ㄓ陬?lèi)型的,也就是說(shuō)冀惭,它們只能夠用于單元數(shù)據(jù)類(lèi)型上震叙。然而掀鹅,像X+Y這樣的表達(dá)式和len(X)這樣的內(nèi)置函數(shù)是具有一般性的,它們可以用于多種類(lèi)型上捐友。在本例中淫半,in成員關(guān)系表達(dá)式和字符串的find方法具有類(lèi)似的效果,但它不僅可以用來(lái)查找字符串匣砖,還可以查找列表科吭。在Python3.X中,人們嘗試按照類(lèi)別對(duì)方法進(jìn)行分組(例如猴鲫,可變序列類(lèi)型list和bytearrart具有類(lèi)似是方法集合)对人,但是方法仍然比其他的操作集更加特定于類(lèi)型。
2.字符串分片表達(dá)式可以用于列表嗎拂共?
可以牺弄。與方法不同,表達(dá)式具有一般性宜狐,可用于多種類(lèi)型势告。在本例中,分片表達(dá)式其實(shí)是一個(gè)操作序列抚恒,它可在任何類(lèi)型的序列對(duì)象上使用咱台,包括字符串,列表俭驮,以及元組回溺。唯一的差別就是,當(dāng)你對(duì)列表進(jìn)行分片時(shí)混萝,你得到一個(gè)新的列表遗遵,而這里你得到的是一個(gè)新的字符串。
3.如果將一個(gè)字符串轉(zhuǎn)換為ASCII整數(shù)碼逸嘀?任何進(jìn)行反向轉(zhuǎn)換车要,將一個(gè)整數(shù)轉(zhuǎn)換為字符?
內(nèi)置的ord(S)函數(shù)可以將單字符的字符串轉(zhuǎn)換為整數(shù)字符編碼崭倘;chr(I)可以將一個(gè)整數(shù)碼轉(zhuǎn)化回字符串屯蹦。但是,請(qǐng)牢記绳姨,這些整數(shù)只用于文本的ASCII編碼登澜,它們的字符只能從ASCII字符集中獲取。在Unicode模型中飘庄,文本字符串實(shí)際上是用來(lái)識(shí)別整數(shù)的Unicode碼點(diǎn)醒了脑蠕,它們可能超過(guò)ASCII保留的7位(比特)數(shù)字范圍。
4.在Python中,如何修改一個(gè)字符串谴仙?
字符串無(wú)法被修改迂求,它們是不可變對(duì)象,盡管如此晃跺,你可以通過(guò)拼接揩局,分片,執(zhí)行格式化表達(dá)式掀虎,調(diào)用replace這樣的方法創(chuàng)建新的字符串凌盯,在將結(jié)果賦值給最初的變量名,從而達(dá)到類(lèi)似的效果烹玉。
5.已知字符串S的值為's,pa,m'驰怎,說(shuō)出兩種取出中間兩個(gè)字符的方式。
可以使用S[2:4]對(duì)字符串進(jìn)行分片二打,或者使用S.split(',')[1]用逗號(hào)分隔字符串县忌,再進(jìn)行索引。
6.字符串‘’a\nb\x1f\000d‘’有多少個(gè)字符继效?
6個(gè)症杏。字符串“a\nb”\x1f\000d'中包含字符a,換行符(\n)瑞信,b鸳慈,二進(jìn)制的31(十六進(jìn)制轉(zhuǎn)義為\x1f),二進(jìn)制0(八進(jìn)制轉(zhuǎn)義為\000)以及d。把字符串傳給內(nèi)置的len函數(shù)可以驗(yàn)證這一點(diǎn)喧伞,打印出每個(gè)字符的ord結(jié)果,可查看實(shí)際的碼點(diǎn)(識(shí)別整數(shù))值绩郎。