- Python大學(xué)實(shí)用教程
- 齊偉
- 7795字
- 2021-01-22 18:49:51
3.3 字符和字符串
觀察計(jì)算機(jī)的鍵盤(pán),上面每個(gè)鍵對(duì)應(yīng)著一個(gè)“字符”(character)。注意,字符不僅是字母,通常包括字母、數(shù)字、標(biāo)點(diǎn)符號(hào)和一些控制符等。當(dāng)計(jì)算機(jī)能夠處理字符后,它就不再單純“計(jì)算”了,而是具有了“電腦”的功能。
3.3.1 字符編碼
如前所述,計(jì)算機(jī)只能認(rèn)識(shí)二進(jìn)制數(shù)字,所有提交給它的東西都要轉(zhuǎn)化為二進(jìn)制才能被認(rèn)識(shí)。要想讓計(jì)算機(jī)能夠處理字符,也要如此處理。必須把字符與二進(jìn)制的位(bit)之間建立起一個(gè)對(duì)應(yīng)關(guān)系,這種對(duì)應(yīng)關(guān)系被稱(chēng)為“字符編碼”。
1960年代,美國(guó)發(fā)布了“美國(guó)信息交換標(biāo)準(zhǔn)代碼”(American Standard Code for Information Interchange,ASCII),主要規(guī)定了英語(yǔ)字符在計(jì)算機(jī)中的編碼。1986年發(fā)布的最新版一共規(guī)定了128個(gè)字符的編碼。
利用Python中的內(nèi)置函數(shù)ord可以得到ASCII中某個(gè)字符編碼的十進(jìn)制表示。

這個(gè)十進(jìn)制數(shù)字對(duì)應(yīng)的二進(jìn)制數(shù)字可以用bin()函數(shù)得到。

只不過(guò)在ASCII中,每個(gè)字符的編碼只占用了1字節(jié)的后7位,最前面的一位統(tǒng)一規(guī)定為0,即為01000001。
ASCII對(duì)于英語(yǔ)而言已經(jīng)足夠了,但英語(yǔ)以外的語(yǔ)言則不然了。比如漢字,顯然不能用1字節(jié)(1字節(jié)最多可以表示256種字符,而漢字多達(dá)10萬(wàn)個(gè),最常用的大約有3000~4000個(gè)),于是就要用多字節(jié)表示一個(gè)字符。比如,簡(jiǎn)體中文編碼GB2312使用2字節(jié)表示一個(gè)漢字,理論上能夠支持256×256=65536個(gè)字符。
除了漢語(yǔ),還有好多種語(yǔ)言,它們都需要讓計(jì)算機(jī)認(rèn)識(shí),于是就有了各種樣式的編碼(僅中文就有多種編碼,如GB2312編碼、BIG5編碼、HKSCS編碼、GBK編碼等)。結(jié)果導(dǎo)致同一個(gè)二進(jìn)制數(shù)字在不同編碼方案中對(duì)應(yīng)著不同的字符,這就是“亂碼”產(chǎn)生的原因之一。所以,需要一個(gè)統(tǒng)一的編碼方案。
于是Unicode應(yīng)運(yùn)而生。Unicode的中文翻譯為:萬(wàn)國(guó)碼、國(guó)際碼、統(tǒng)一碼、單一碼,目的是實(shí)現(xiàn)編碼方案的“世界大同”,由位于美國(guó)加州的The Unicode Consortium(統(tǒng)一碼聯(lián)盟,一個(gè)非贏利機(jī)構(gòu))負(fù)責(zé)維護(hù)。
但是,Unicode 只是一個(gè)字符集,而沒(méi)有制定編碼規(guī)則,所以需要再制定Unicode的實(shí)現(xiàn)方式(Unicode Transformation Format,UTF),于是出現(xiàn)了UTF-16、UTF-32等。現(xiàn)在使用最廣泛的是UTF-8(8-bit Unicode Transformation Format),也是互聯(lián)網(wǎng)普遍采用的Unicode實(shí)現(xiàn)方式。圖3-3-1所示的是本書(shū)作者所用的IDE設(shè)置的編碼方式。

圖3-3-1 IDE的編碼設(shè)置
在交互模式中,還可以查看自己的計(jì)算機(jī)所使用的默認(rèn)編碼。下面的操作顯示了作者所用計(jì)算機(jī)的編碼方式。


在3.2.10節(jié)中寫(xiě)的程序文件中,第一行“#coding:utf-8”也是聲明本程序文件所采用的字符編碼方式是UTF-8(與所使用編輯器編碼方式保持一致)。
在Python中,不但可以使用ord函數(shù)得到每個(gè)字符的編碼,而且能夠使用chr函數(shù)實(shí)現(xiàn)反向操作。

因?yàn)镻ython 3支持Unicode,所以每個(gè)漢字都對(duì)應(yīng)一個(gè)編碼數(shù)字。

解決了單個(gè)字符問(wèn)題,就可以研究多個(gè)字符組成的“串”了。
3.3.2 認(rèn)識(shí)字符串
其實(shí),前面已經(jīng)出現(xiàn)的“hello,world”就是一個(gè)字符串(string)。所謂字符串,在Python中就是用單引號(hào)或雙引號(hào)包裹著的若干字符(見(jiàn)圖3-3-2)。

圖3-3-2 字符串組成部分

字符串也是Python中的內(nèi)置對(duì)象類(lèi)型,用type函數(shù)查看,返回值為str,它就是字符串的類(lèi)型名稱(chēng)。
注意,包裹字符串的單引號(hào)或者雙引號(hào)是字符串的標(biāo)志,在鍵盤(pán)輸入的時(shí)候必須是英文狀態(tài),并且要成對(duì)出現(xiàn)。

在引號(hào)中不僅可以放字母、漢字,還可以放其他字符,如數(shù)字。


盡管是數(shù)字,用引號(hào)包裹后,就不再是整數(shù)了,變成了字符串。這種由數(shù)字組成的字符串可以通過(guò)int函數(shù)和str函數(shù)實(shí)現(xiàn)相互間的類(lèi)型轉(zhuǎn)化。

請(qǐng)注意下面的寫(xiě)法:

出現(xiàn)了SyntaxError(語(yǔ)法錯(cuò)誤)引導(dǎo)的提示,說(shuō)明這里存在錯(cuò)誤,錯(cuò)誤的類(lèi)型是SyntaxError,后面是對(duì)這種錯(cuò)誤的解釋?zhuān)骸癷nvalid syntax”(無(wú)效的語(yǔ)法)。
在Python中,這一點(diǎn)是非常友好的,如果語(yǔ)句存在錯(cuò)誤,就會(huì)將錯(cuò)誤輸出,供程序員參考改正。
print()是Python的一個(gè)內(nèi)置函數(shù),其作用是把參數(shù)中內(nèi)容打印出來(lái),通常顯示在當(dāng)前的交互模式所在的控制臺(tái)。
解決上述錯(cuò)誤的方法之一就是使用雙引號(hào)和單引號(hào)的嵌套。

用雙引號(hào)來(lái)包裹,雙引號(hào)中允許出現(xiàn)單引號(hào)。其實(shí),反過(guò)來(lái),單引號(hào)中也可以包裹雙引號(hào)。
此外,還有一種解決方法,那就是使用“轉(zhuǎn)義符”。所謂轉(zhuǎn)義,就是讓某個(gè)符號(hào)不再表示原來(lái)的含義了。比如n,在字符串中就表示一個(gè)字母,這是原來(lái)的含義。

然而如果按照下面的方式操作之后,意思就變了。

注意觀察這兩句的區(qū)別,如圖3-3-3所示。

圖3-3-3 轉(zhuǎn)義符的作用
第二句中的符號(hào)“\”將本來(lái)是字母n的含義轉(zhuǎn)換,與“\”符號(hào)一同組成了“\n”,其含義是換行,因此就出現(xiàn)了第二句的操作結(jié)果。
同樣,可以這樣來(lái)做,實(shí)現(xiàn)“what's your name?”的正確顯示,盡管依然使用單引號(hào)包裹字符串,但不會(huì)報(bào)錯(cuò)了。

表3-3-1中列出了Python中常用的轉(zhuǎn)義字符及其說(shuō)明,供應(yīng)用時(shí)查閱。
表3-3-1 轉(zhuǎn)義字符及其說(shuō)明

建議讀者在交互模式中測(cè)試上述轉(zhuǎn)移符的顯示效果。例如:

用“\”實(shí)現(xiàn)轉(zhuǎn)義是一個(gè)方便的做法,但是如果在字符串中用到了“\”符號(hào),怎么辦?比如,打印Windows中的路徑。

這個(gè)輸出結(jié)果顯然不是所需要的。如何解決?可以繼續(xù)使用轉(zhuǎn)義符:

此外,還有一種方法:

狀如r"c:\news",由r開(kāi)頭引起的字符串就是“原始字符串”,在里面放任何字符都表示該字符的原始含義。這種方法在Web開(kāi)發(fā)中設(shè)置網(wǎng)站目錄結(jié)構(gòu)的時(shí)候非常有用。
【例題3-3-1】 在交互模式中,用print函數(shù)打印蘇軾的詞《江城子·密州出獵》,要求每句占一行。
代碼示例
>>> print("江城子·密州出獵\n\n老夫聊發(fā)少年狂,\n左牽黃,\n右擎蒼,\n錦帽貂裘,\n千騎卷平岡。\n為報(bào)傾城隨太守,\n親射虎,\n看孫郎。\n\n酒酣胸膽尚開(kāi)張,\n鬢微霜,\n又何妨?\n持節(jié)云中,\n何日遣馮唐?\n會(huì)挽雕弓如滿月,\n西北望,\n射天狼。")
江城子·密州出獵
老夫聊發(fā)少年狂,
左牽黃,
右擎蒼,
錦帽貂裘,
千騎卷平岡。
為報(bào)傾城隨太守,
親射虎,
看孫郎。
酒酣胸膽尚開(kāi)張,
鬢微霜,
又何妨?
持節(jié)云中,
何日遣馮唐?
會(huì)挽雕弓如滿月,
西北望,
射天狼。
3.3.3 字符串基本操作
以熟悉的“hello world”字符串為例,它包括英文字母和一個(gè)空格(字符),還有一個(gè)重要特征要引起注意:這些字母和字符是按照一定順序排列的,不是隨機(jī)排的,更不能隨意更換順序。

盡管a和b兩個(gè)變量引用的字符串對(duì)象(當(dāng)某個(gè)變量引用一個(gè)對(duì)象的時(shí)候,本書(shū)中會(huì)用那個(gè)變量來(lái)指代對(duì)象,如簡(jiǎn)稱(chēng)字符串a(chǎn),事實(shí)上都是指變量a所引用的字符串對(duì)象)只有較小的差異,但a、b是兩個(gè)不同的對(duì)象。
像字符串這樣,其元素必須按照特定順序排列的對(duì)象被稱(chēng)為“序列”。字符串是在本書(shū)中出現(xiàn)的第一種序列,在后續(xù)內(nèi)容中,讀者還能學(xué)習(xí)到其他序列對(duì)象。
字符串這樣的序列存在著一系列共性的操作。
1.“+”:連接序列
對(duì)于數(shù)字,“+”的含義是實(shí)現(xiàn)兩個(gè)數(shù)字相加,得到一個(gè)新的數(shù)字。對(duì)于字符串(序列),“+”的作用效果是將字符串連接起來(lái),并得到了一個(gè)新的字符串。

注意,“+”連接的對(duì)象必須是同種類(lèi)型的,否則報(bào)錯(cuò)。


如果非要實(shí)現(xiàn)字符串和數(shù)字的連接,應(yīng)該如何操作?

可以使用類(lèi)型轉(zhuǎn)化的方式,將“+”兩側(cè)的對(duì)象轉(zhuǎn)化為同種序列類(lèi)型的對(duì)象。
2.“*”:重復(fù)元素
數(shù)值運(yùn)算中的“*”表示的是乘法,對(duì)于字符串(序列),這個(gè)符號(hào)則表示要獲得重復(fù)的元素。

3.len函數(shù):求序列長(zhǎng)度
len函數(shù)是一個(gè)內(nèi)置函數(shù),其作用是得到序列類(lèi)對(duì)象的長(zhǎng)度。
承接前面的操作,測(cè)量字符串r 的長(zhǎng)度。

請(qǐng)讀者認(rèn)真數(shù)一數(shù),會(huì)發(fā)現(xiàn)r中包含10個(gè)英文字母,不要漏掉兩個(gè)單詞中間的空格,它也算一個(gè)字符,所以有11個(gè)字符,即長(zhǎng)度為11。
可以進(jìn)一步看看函數(shù)len返回值的類(lèi)型。

如果查看len函數(shù)的聯(lián)機(jī)幫助文檔,會(huì)發(fā)現(xiàn)這樣的描述。

描述中說(shuō)明len函數(shù)返回的是一個(gè)容器(container)的元素?cái)?shù)。字符串的確像一個(gè)容器,里面按照一定順序裝入了若干字符。
4.in:判斷元素是否存在其中
如前所述,字符串是一個(gè)容器,“in”用于判斷容器中是否存在某個(gè)元素。

返回True,說(shuō)明該字符(串)在容器中,否則返回False(關(guān)于True和False,詳見(jiàn)4.1.3節(jié)的內(nèi)容)。
【例題3-3-2】 連接“Life is short.”和“You need Python.”這兩個(gè)字符串,并且用print函數(shù)在控制臺(tái)上打印出來(lái),顯示為兩行。
代碼示例

3.3.4 索引和切片
作為序列中一員的字符串,每個(gè)字符都是按照特定順序排列的,不能隨意更換位置。因此,可以給每個(gè)字符進(jìn)行編號(hào)。
由此,可以把“序列”理解為“有序排列”。在Python中,給這些編號(hào)取了一個(gè)文雅的名字,叫作“索引”(index。其他編程語(yǔ)言也這么稱(chēng)呼,不是Python獨(dú)有的)。
給字符串中的字符(或序列中的元素)進(jìn)行編號(hào)(即索引)的方法有兩種:一種是從左邊開(kāi)始編號(hào),依次為0、1、2、…,直到最右邊的字符結(jié)束;另一種是從右邊開(kāi)始,依次是-1、-2、-3、…,直到最左邊的字符結(jié)束。
如圖3-3-4所示,對(duì)字符串中的所有字符建立索引。特別注意,兩個(gè)單詞中間的那個(gè)空格也占用了一個(gè)位置,空格是一個(gè)字符。“無(wú)”不完全等于“沒(méi)有”。

圖3-3-4 字符串中的索引
再有,因?yàn)榭梢詮膬蓚€(gè)方向開(kāi)始編號(hào),所以每個(gè)字符可以有兩個(gè)索引。
字符的索引建立好了,自然可以通過(guò)索引找到每個(gè)字符了。這就好比每個(gè)居民都有一個(gè)身份證號(hào)(理論上居民個(gè)人和身份證號(hào)是一對(duì)一的關(guān)系),通過(guò)身份證號(hào)(相當(dāng)于索引)就能找到對(duì)應(yīng)的人。在Python中,實(shí)現(xiàn)這種操作的方式是使用“[]”符號(hào),如下操作:

變量r引用了字符串對(duì)象,后面的“[]”中是字符的索引。操作示例顯示,不論是用從左邊開(kāi)始計(jì)數(shù)的索引還是用從右邊開(kāi)始計(jì)數(shù)的索引,都能得到那個(gè)字符。
如果使用的索引超出了該字符串的索引范圍,則會(huì)報(bào)錯(cuò)。


為了避免這種情況,需要提前知道最后一個(gè)字符的索引才好。一種方式是通過(guò)len函數(shù)得到字符串的字符數(shù)(長(zhǎng)度),即可知道最大索引了。另一種方式是使用下面的方式直接得到最右邊的字符的索引。

index()是字符串對(duì)象的一個(gè)方法(關(guān)于對(duì)象的“方法”,請(qǐng)參考3.1節(jié)的簡(jiǎn)述),能夠得到某字符在字符串中的索引(按照從左開(kāi)始計(jì)數(shù)的索引),且是第一次出現(xiàn)。

通過(guò)索引,不僅可以得到某個(gè)指定字符,還能得到若干字符。操作方式如下:

通過(guò)r[1:8]方式從字符串r 中“得到”了多個(gè)(不是一個(gè))字符——稱(chēng)為“切片”(slice)。如圖3-3-5所示,將索引是1、2、3、4、5、6、7的字符“切”出來(lái)。從結(jié)果中可以看出,結(jié)束索引8所對(duì)應(yīng)的字符沒(méi)有被“切”下來(lái),這是Python中的普遍規(guī)則,簡(jiǎn)單概括為:前包括,后不包括。

圖3-3-5 字符串切片
原字符串被“切”出了一部分,但并沒(méi)有因此而破壞原字符串。

這說(shuō)明“切片”是比照著索引在原字符串中所對(duì)應(yīng)的字符,重新創(chuàng)建了一個(gè)字符串對(duì)象。從最終結(jié)果看,貌似是從原字符串上“切下來(lái)的一部分”。
如果用一個(gè)普遍的表達(dá)式來(lái)說(shuō)明切片操作的方式,可以表示為:

? indexstart:表示開(kāi)始的索引。如果是從第一個(gè)字符開(kāi)始,可以省略。
? indexstop:表示結(jié)束的索引(切片中不含此索引對(duì)應(yīng)的字符)。如果是到最后一個(gè)字符結(jié)束(含最后一個(gè)),可以省略。
? step:表示步長(zhǎng),默認(rèn)為1;可為正整數(shù),也可為負(fù)整數(shù)。


省略indexstart索引,表示切片以字符串的開(kāi)始為開(kāi)始。對(duì)照?qǐng)D3-3-5可知,索引8和-3對(duì)應(yīng)的是同一個(gè)字符(作為結(jié)束字符,不包含在切片中),所以上述兩種操作結(jié)果一樣。
同理,如果省略indexstop,則表示到字符串結(jié)束,即切片中的字符直到原字符串最后一個(gè)字符為止,并包含最后一個(gè)字符。

以上操作中,步長(zhǎng)都省略,即:使用了步長(zhǎng)的默認(rèn)值1。

r[1:]和r[1::1]的操作結(jié)果是一樣的。但是,如果設(shè)置步長(zhǎng)不是1,則會(huì)按照步長(zhǎng)切片。

請(qǐng)讀者通過(guò)操作比較r[:8]和r[0:8],以及r[1:]和r[1:10]的結(jié)果,結(jié)合前面的內(nèi)容給予理解。
在r[1::1]和r[::2]操作中,步長(zhǎng)分別為1和2,都是正整數(shù)。前面介紹步長(zhǎng)的時(shí)候特別提到,它也可以為負(fù)整數(shù)。

r[::-1]中的步長(zhǎng)為負(fù)數(shù),結(jié)果得到了原字符串的反轉(zhuǎn)。
這個(gè)反轉(zhuǎn)是如何得到的呢?先要理解步長(zhǎng)(step)“正負(fù)”含義。當(dāng)步長(zhǎng)為正整數(shù)時(shí),相當(dāng)于“站在”了字符串的左側(cè)“看”字符串中的每個(gè)字符(見(jiàn)圖3-3-6)。先看到的字符所對(duì)應(yīng)的索引就是indexstart,后看到的字符所對(duì)應(yīng)的索引就是indexstop。

圖3-3-6 步長(zhǎng)為正整數(shù)
注意,索引不區(qū)分是從左邊開(kāi)始計(jì)數(shù),還是從右邊開(kāi)始計(jì)數(shù),如下述操作的結(jié)果都一樣。

當(dāng)切片步長(zhǎng)為負(fù)整數(shù)的時(shí)候,與上述不同的是調(diào)整了“看”列表的位置(見(jiàn)圖3-3-7),改為“站在右側(cè)看”,其他原則不變,即:依然是先看到的字符對(duì)應(yīng)的索引是indexstart,后看到的字符對(duì)應(yīng)的索引是indexstop。

圖3-3-7 步長(zhǎng)為負(fù)整數(shù)
以下各項(xiàng)操作同樣等效。

理解了上述切片原則后,再看r[::-1]就不難理解了。步長(zhǎng)為-1,即為“站在右側(cè)看”,從“看到”的第一個(gè)字符開(kāi)始(r[-1]對(duì)應(yīng)的字符),到最后即最左側(cè)的字符(r[0]對(duì)應(yīng)的字符),并包括最后一個(gè)為止。因此得到了一個(gè)相對(duì)于原來(lái)的反轉(zhuǎn)的字符串。
此處以字符串為例介紹了切片的基本方法,這種方法適用于所有序列類(lèi)型的對(duì)象。
【例題3-3-3】 對(duì)字符串“123456789”,通過(guò)切片操作得到如下結(jié)果:
? 得到“2468”。
? 得到“1234”。
? 得到“963”。
? 得到“69”。
? 得到“987654321”。
代碼示例

3.3.5 鍵盤(pán)輸入
計(jì)算機(jī)(“電腦”可能更形象)的智能,一種體現(xiàn)就是可以接收用戶通過(guò)鍵盤(pán)輸入的內(nèi)容。Python提供了內(nèi)置函數(shù)input,用于接收用戶通過(guò)鍵盤(pán)輸入的信息。

從聯(lián)機(jī)幫助文檔中已經(jīng)清晰地看到了input 函數(shù)的使用方法,下面在交互模式中操練此函數(shù)。

如上述操作,通過(guò)鍵盤(pán)輸入“python”后,回車(chē),將所輸入的內(nèi)容作為返回值呈現(xiàn)。
從幫助文檔中可知,input 函數(shù)的返回值是一個(gè)字符串類(lèi)型的對(duì)象,于是使用下述方式,用變量引用此返回值對(duì)象。

不論通過(guò)鍵盤(pán)輸入什么字符,input函數(shù)的返回值都是字符串。

有了以上兩個(gè)準(zhǔn)備,接下來(lái)就可以寫(xiě)一個(gè)能夠“對(duì)話”的小程序了。
【例題3-3-4】 編寫(xiě)一段程序,實(shí)現(xiàn)如下功能:
(1)詢(xún)問(wèn)姓名和年齡。
(2)計(jì)算10年之后的年齡。
(3)打印出所輸入的姓名和當(dāng)前年齡、10年之后的年齡。
代碼示例


在本程序中需要注意的是類(lèi)型轉(zhuǎn)化。①中的變量age引用的是一個(gè)字符串類(lèi)型的對(duì)象,這個(gè)對(duì)象必須轉(zhuǎn)化為整數(shù)類(lèi)型之后才能參與②中的運(yùn)算,所以在②中使用了int(age)。而當(dāng)一個(gè)整數(shù)與字符串通過(guò)“+”連接的時(shí)候,又需要轉(zhuǎn)化為字符串類(lèi)型,③中的str函數(shù)即此意圖。
請(qǐng)讀者自行調(diào)試這個(gè)程序,如果遇到了報(bào)錯(cuò),請(qǐng)認(rèn)真看報(bào)錯(cuò)信息,從中找到修改的方向。
上述代碼示例并非十分完美,只是局限于本書(shū)已經(jīng)講述過(guò)的知識(shí)實(shí)現(xiàn)了一些基本功能。關(guān)于字符串的更多內(nèi)容,還有待于深入學(xué)習(xí)它的更多方法。
3.3.6 字符串的方法
字符串是對(duì)象類(lèi)型,也是對(duì)象,因此它會(huì)有一些方法供開(kāi)發(fā)者使用,而且這些方法已經(jīng)內(nèi)置好了——內(nèi)置對(duì)象,必須如此。

通過(guò)dir(str)看到了字符串對(duì)象的所有屬性和方法,可以粗略地劃分為兩類(lèi):一類(lèi)是名稱(chēng)以雙下滑線開(kāi)始和結(jié)尾的,稱(chēng)為“特殊方法”和“特殊屬性”;另一類(lèi)是用看起來(lái)很普通的名稱(chēng),如capitalize等,籠統(tǒng)稱(chēng)為“方法”和“屬性”。
對(duì)于內(nèi)置對(duì)象的方法而言,因?yàn)檎{(diào)用的時(shí)候類(lèi)似使用函數(shù),所以也有資料稱(chēng)之為某對(duì)象的函數(shù)。本書(shū)按照對(duì)象的方法來(lái)稱(chēng)呼。在后續(xù)學(xué)習(xí)中,我們會(huì)區(qū)分函數(shù)和方法的含義。
字符串有那么多方法,這里不會(huì)一一介紹,僅選幾個(gè),用以示例如何通過(guò)聯(lián)機(jī)幫助文檔學(xué)習(xí)其使用方法。
在3.3.4節(jié)提到過(guò)一個(gè)名為index()的方法,使用它可以得到字符串中某個(gè)字符的索引。


以字符串中的index()方法為例,解讀幫助文檔的含義,理解如何使用它。如圖3-3-8所示,根據(jù)圖中所標(biāo)識(shí)的各項(xiàng)建議,在交互模式中進(jìn)行適當(dāng)練習(xí),從而理解各項(xiàng)含義。


圖3-3-8 分解index方法
沒(méi)有規(guī)定查找的索引范圍,即沒(méi)有給start和end參數(shù)傳值,則默認(rèn)為在整個(gè)字符串的范圍查找,并且返回找到的第一個(gè)子字符串的索引。

指定了開(kāi)始查找的索引,即start=20,于是從這個(gè)位置開(kāi)始向后查找,并且返回在這個(gè)范圍內(nèi)所找到的第一個(gè)子字符串的索引。
更準(zhǔn)確的理解還依賴(lài)于讀者認(rèn)真閱讀幫助文檔中的說(shuō)明。
后續(xù)的內(nèi)容中,本書(shū)不再呈現(xiàn)幫助文檔,但不意味著這種方法不重要,而是相當(dāng)重要,只是受到篇幅的限制,并且查看文檔的方法也不難。
1.“is”開(kāi)頭的方法
仔細(xì)觀察dir(str)的結(jié)果,其中有若干以“is”作為名稱(chēng)開(kāi)始的方法。這些方法無(wú)一例外,都是返回了bool類(lèi)型。這種類(lèi)型對(duì)象會(huì)在4.1.3節(jié)中詳述,中文為“布爾”類(lèi)型,只有True和False兩個(gè)值。例如:

字符串的isdigit()方法是用來(lái)判斷當(dāng)前字符串對(duì)象是否完全由數(shù)字字符(即鍵盤(pán)上的1、2、3、4、5、6、7、8、9、0)組成。如果是,則返回True,否則返回False。
其他若干類(lèi)似的方法,基本操作和結(jié)構(gòu)都與上述示例類(lèi)似,請(qǐng)讀者逐一查看聯(lián)機(jī)文檔的說(shuō)明,并在交互模式中進(jìn)行調(diào)試。
2.分隔和組合
字符串對(duì)象提供了根據(jù)某個(gè)符號(hào)分割字符串內(nèi)容的方法split()。

這是用空格作為分割符,得到了一個(gè)列表(List)類(lèi)型的返回值(詳見(jiàn)3.4節(jié))。
幫助文檔中對(duì)分隔符做了說(shuō)明,請(qǐng)認(rèn)真閱讀。特別注意,如果沒(méi)有指定特定的分隔符,Python會(huì)默認(rèn)空格為分隔符。

注意比較上面三種不同的情況。
除了可以依據(jù)某個(gè)字符對(duì)字符串進(jìn)行劃分,還可以用某個(gè)字符把另一種對(duì)象組合成為一個(gè)字符串,這個(gè)過(guò)程有點(diǎn)類(lèi)似split()方法的逆向過(guò)程,使用的是字符串的join()方法。
如果讀者查看聯(lián)機(jī)幫助文檔,會(huì)看到“S.join(iterable) -> str”(特別建議認(rèn)真閱讀幫助文檔的內(nèi)容),這個(gè)方法的參數(shù)中出現(xiàn)了“iterable”,其含義為“可迭代的”。這是某些對(duì)象所具有的特征,包括字符串在內(nèi)的一些對(duì)象,被稱(chēng)為可迭代對(duì)象(關(guān)于“可迭代的”和“可迭代對(duì)象”詳見(jiàn)6.10節(jié))。通過(guò)字符串的split()方法得到的名為列表的對(duì)象,就是具有“可迭代的”特點(diǎn)的對(duì)象,因此下面演示就使用這個(gè)對(duì)象。

③中使用了字符串"-"的方法join(),參數(shù)是前面得到的列表lst,意圖是要用“-”符號(hào)把列表lst中的元素連接起來(lái),并且返回一個(gè)大字符串。

剛才提到字符串也是“可迭代的”,所以join()方法的參數(shù)也可以用字符串。只不過(guò)字符串的元素是字符,所以,如果用空格——也是字符——的join()方法的話,得到的結(jié)果就是④所返回的那樣,每個(gè)字符之間有了一個(gè)空格。
字符串的方法眾多,本書(shū)僅選幾個(gè)作為示例,在后續(xù)內(nèi)容中也會(huì)不斷用到其他方法。讀者要通過(guò)本例掌握查看文檔的方法。
【例題3-3-5】 有的字符串兩邊有空格,或者一邊有空格,用字符串中的方法,將這些空格去掉。
代碼示例

3.3.7 字符串格式化輸出
在字符串的諸多方法中有一個(gè)名為format的方法,下面就用它來(lái)實(shí)現(xiàn)“格式化輸出”。
要了解這個(gè)方法的使用,還是要查看其文檔,請(qǐng)讀者自行完成。下面列舉幾種使用format()方法進(jìn)行格式化輸出的方式。

在交互模式中,輸入了字符串"I like{0}and{1}",其中用{0}和{1}占據(jù)了兩個(gè)位置,它們就是占位符。format("python","physics")是字符串格式化輸出的方法,傳入了兩個(gè)字符串。第一個(gè)字符串“python”對(duì)應(yīng)占位符{0};第二個(gè)字符串“physics”對(duì)應(yīng)占位符{1},即占位符中的數(shù)字,就是參數(shù)format()方法的參數(shù)列表的順序號(hào)(見(jiàn)圖3-3-9)。

圖3-3-9 format()方法使用解析
為了進(jìn)一步理解占位符中的數(shù)字的含義,可以做如下操作。

既然format()實(shí)現(xiàn)的是“格式化”輸出,就應(yīng)該可以指定某種“格式”,讓輸出的結(jié)果符合指定的樣式。

{0:10}表示該位置有10個(gè)字符,并且放在這個(gè)位置的字符是左對(duì)齊;{1:>15}表示該位置有15個(gè)字符,并且放在這個(gè)位置的字符是右對(duì)齊;{0:^10}和{1:^15}則表示字符串在該位置的對(duì)齊方式是居中。
除了規(guī)定字符串的對(duì)齊方式,還可以限制顯示的字符個(gè)數(shù)。

{0:.2}中的“.2”表示對(duì)于傳入的字符串,截取前兩個(gè)字符。需要注意,在“:”后面和“.”前面沒(méi)有任何數(shù)字,意思是該位置的長(zhǎng)度自動(dòng)適應(yīng)即將放到該位置的字符串。
{1:^15.3}中的“15.3”表示該位置的長(zhǎng)度是15個(gè)字符,但即將放入該位置的字符串應(yīng)該僅有3個(gè)字符,也就是要從傳入的字符串"physics"中截取前3個(gè)字符,即"phy"。
format()中,除了能夠傳入字符串,還可以傳入數(shù)字(包括整數(shù)和浮點(diǎn)數(shù)),而且有各種花樣。

{0:d}表示在該位置放第一個(gè)參數(shù),且為整數(shù);{1:f}表示該位置放第二個(gè)參數(shù),且為浮點(diǎn)數(shù),此處浮點(diǎn)數(shù)的小數(shù)位數(shù)是默認(rèn)的。

用{0:4d}設(shè)置此位置的長(zhǎng)度是4個(gè)字符,并且在其中應(yīng)該放置整數(shù),在默認(rèn)狀態(tài)下,整數(shù)是右對(duì)齊;{1:.1f}表示該位置的浮點(diǎn)數(shù)小數(shù)位數(shù)為1位,并且自動(dòng)采用四舍五入方式對(duì)參數(shù)中小數(shù)進(jìn)行位數(shù)截取操作,默認(rèn)也是右對(duì)齊。

其中,{0:04d}和{1:06.1f}表示在該位置的空位用0填充。
使用字符串的format()方法進(jìn)行格式化輸出,實(shí)現(xiàn)的方式多種多樣,除了上述演示,還可以這樣做:

【例題3-3-6】 字符串有format方法,內(nèi)置函數(shù)中也有format方法。用示例說(shuō)明內(nèi)置函數(shù)format()的使用方法。
代碼示例

- JavaScript+jQuery網(wǎng)頁(yè)特效設(shè)計(jì)任務(wù)驅(qū)動(dòng)教程(第2版)
- DevOps Automation Cookbook
- MATLAB應(yīng)用與實(shí)驗(yàn)教程
- SAS數(shù)據(jù)統(tǒng)計(jì)分析與編程實(shí)踐
- TypeScript項(xiàng)目開(kāi)發(fā)實(shí)戰(zhàn)
- Node學(xué)習(xí)指南(第2版)
- Image Processing with ImageJ
- Java Web從入門(mén)到精通(第3版)
- DB2SQL性能調(diào)優(yōu)秘笈
- Mastering OpenStack
- Koa與Node.js開(kāi)發(fā)實(shí)戰(zhàn)
- Python繪圖指南:分形與數(shù)據(jù)可視化(全彩)
- 編程風(fēng)格:程序設(shè)計(jì)與系統(tǒng)構(gòu)建的藝術(shù)(原書(shū)第2版)
- Python編程:從入門(mén)到實(shí)踐(第2版)
- Scratch 3.0少兒積木式編程(6~10歲)