Python程序設(shè)計(jì)基礎(chǔ)第四章 字符串_第1頁(yè)
Python程序設(shè)計(jì)基礎(chǔ)第四章 字符串_第2頁(yè)
Python程序設(shè)計(jì)基礎(chǔ)第四章 字符串_第3頁(yè)
Python程序設(shè)計(jì)基礎(chǔ)第四章 字符串_第4頁(yè)
Python程序設(shè)計(jì)基礎(chǔ)第四章 字符串_第5頁(yè)
已閱讀5頁(yè),還剩39頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

匯報(bào)人:WPSPython程序設(shè)計(jì)基礎(chǔ)第四章字符串目錄01認(rèn)識(shí)字符串02字符串的格式化03字符串的切片04字符串的常用方法目錄05Python生態(tài)系統(tǒng)之xml庫(kù)06小試牛刀07拓展實(shí)踐08本章小結(jié)掌握字符串的定義。掌握轉(zhuǎn)義符號(hào)的使用方法。掌握字符串的格式化方法。理解并掌握字符串的切片操作方法。掌握字符串的常用方法。理解網(wǎng)絡(luò)爬蟲(chóng)的原理。字符串是非常常見(jiàn)的一種數(shù)據(jù)類型,程序中經(jīng)常會(huì)有對(duì)字符串進(jìn)行各種處理的需求,因此

Python

提供了字符串類型,可以對(duì)字符串進(jìn)行各種處理操作。本章將詳細(xì)介紹字符串的知識(shí),其中部分內(nèi)容可為第

5章的學(xué)習(xí)做好鋪墊。學(xué)習(xí)目標(biāo)PART14.1認(rèn)識(shí)字符串現(xiàn)實(shí)生活中的很多數(shù)據(jù)都是字符串,如姓名、住址、身份證號(hào)、學(xué)號(hào)等,其中一些雖然完全由

阿拉伯?dāng)?shù)字構(gòu)成,但不是數(shù)值而是字符串。因此編程語(yǔ)言中都會(huì)有字符串這一數(shù)據(jù)類型,有的語(yǔ)言

還會(huì)進(jìn)一步區(qū)分字符和字符串,但

Python沒(méi)有區(qū)分字符和字符串,而是將單個(gè)字符看成長(zhǎng)度為

1

字符串。Python使用英文狀態(tài)下的引號(hào)來(lái)標(biāo)記字符串,前幾章的代碼中已經(jīng)多次出現(xiàn)字符串的例子。

這里要進(jìn)一步說(shuō)明的是,標(biāo)記字符串的引號(hào)可以是單引號(hào)、雙引號(hào)、三引號(hào),引號(hào)要左右呼應(yīng),如代碼

4.1所示。上述代碼分別使用了單引號(hào)、雙引號(hào)和單三引號(hào)、雙三引號(hào)標(biāo)記了

4

個(gè)字符串。三引號(hào)的優(yōu)點(diǎn)

是在字符串中可以直接換行,print()函數(shù)會(huì)原樣輸出該字符串,包括換行效果。單引號(hào)和雙引號(hào)不具備這個(gè)功能。讀者可嘗試將第一個(gè)print()函數(shù)中的字符串直接換行,代碼運(yùn)行會(huì)報(bào)錯(cuò)。4.1.1字符串簡(jiǎn)介print('古詩(shī)十九首

·庭中有奇樹(shù)')print("【漢】")print('''庭中有奇樹(shù),綠葉發(fā)華滋。攀條折其榮,將以遺所思。''')print("""馨香盈懷袖,路遠(yuǎn)莫致之。此物何足貴,但感別經(jīng)時(shí)。""")Python

使用引號(hào)標(biāo)記字符串,但引號(hào)本身不屬于字符串內(nèi)容。這樣,引號(hào)自身就是一個(gè)特殊的

存在,從而產(chǎn)生一個(gè)問(wèn)題,如何表達(dá)字符串正文內(nèi)容中的引號(hào)呢?有兩種途徑來(lái)實(shí)現(xiàn)這一點(diǎn):一是

使用和待輸出的引號(hào)不同的引號(hào)來(lái)標(biāo)記字符串,二是使用轉(zhuǎn)義字符。下面的代碼

4.2分別演示了這兩種方法,注意觀察其中的各種引號(hào)。對(duì)于第一個(gè)print()函數(shù),字符串中要輸出的引號(hào)是中文引號(hào),Python不會(huì)把它當(dāng)成字符串標(biāo)記,中文引號(hào)與其他漢字沒(méi)有區(qū)別,因此不用管它。第二個(gè)print()函數(shù)要輸出的字符串中含有英文的雙引號(hào),如果不做處理,Python會(huì)把它當(dāng)作字符串標(biāo)記符號(hào)從而引起字符串混亂。第二個(gè)print()函數(shù)采取的方法是對(duì)字符串的標(biāo)記使用單引號(hào),與要輸出的雙引號(hào)區(qū)別開(kāi)??上攵绻敵鲇⑽牡膯我?hào),則使用雙引號(hào)標(biāo)記字符串即可。這就是第三個(gè)print()函數(shù)的做法。第四個(gè)print()函數(shù)則使用了轉(zhuǎn)義字符“\”。這里的“\”被稱為轉(zhuǎn)義字符,它可以將跟在其后的字符轉(zhuǎn)變含義。4.1.2轉(zhuǎn)義字符他說(shuō),“我要學(xué)好

Python”他說(shuō),"我要學(xué)好Python"I'ma

student.I'ma

student.print("他說(shuō),“我要學(xué)好Python”")print('他說(shuō),"我要學(xué)好

Python"')print("I'mastudent.")print('I\'mastudent.')代碼

4.2

的運(yùn)行結(jié)果如下。常見(jiàn)的轉(zhuǎn)義字符如表

4.1所示。表

4.1常見(jiàn)的轉(zhuǎn)義字符通過(guò)觀察表

4.1

可以發(fā)現(xiàn),如果跟在“\”后面的是一個(gè)特殊含義字符,就將其轉(zhuǎn)換為沒(méi)有特殊

含義的字符,如“\\”表示斜杠本身(這也是第

1章京劇臉譜案例中路徑分隔符要寫(xiě)成兩個(gè)斜杠的原因);

如果跟在“\”后面的是某個(gè)普通字符,則將其轉(zhuǎn)換為有特殊含義的字符,如“\n”表示換行,

這也是print()函數(shù)

end參數(shù)的默認(rèn)值?;貋?lái)再看代碼

4.2

中的最后一個(gè)輸出,字符串中的“\'”意味著什么呢?由于單引號(hào)是有特殊含

義的字符,它不代表自己,是

Python

的字符串標(biāo)記符號(hào)。當(dāng)單引號(hào)跟在“\”后面時(shí),會(huì)被當(dāng)作沒(méi)

有特殊含義的符號(hào),也就是單引號(hào)自身。4.1.2轉(zhuǎn)義字符轉(zhuǎn)義字符含義\\\\"雙引號(hào)\n換行\(zhòng)t制表符知曉了轉(zhuǎn)義字符的含義后,代碼

4.1

中的古詩(shī)也可以用代碼

4.3

的形式輸出。這段代碼中全部字符串均用單引號(hào)標(biāo)記,古詩(shī)的正文字符串中使用了“\n”表示換行,因此最后的運(yùn)行結(jié)果是一聯(lián)詩(shī)

占據(jù)一行。另外第二個(gè)print()函數(shù)輸出的字符串中使用了“\t”表示制表符,因此運(yùn)行結(jié)果中“【漢】”會(huì)靠右一些。代碼

4.3

使用轉(zhuǎn)義字符4.1.2轉(zhuǎn)義字符print('古詩(shī)十九首

·庭中有奇樹(shù)')print('\t【漢】')print('庭中有奇樹(shù),綠葉發(fā)華滋。\n攀條折其榮,將以遺所思。')print('馨香盈懷袖,路遠(yuǎn)莫致之。\n此物何足貴,但感別經(jīng)時(shí)。')代碼4.3的運(yùn)行結(jié)果如下。古詩(shī)十九首

·庭中有奇樹(shù)【漢】庭中有奇樹(shù),綠葉發(fā)華滋。攀條折其榮,將以遺所思。馨香盈懷袖,路遠(yuǎn)莫致之。此物何足貴,但感別經(jīng)時(shí)。加法運(yùn)算符和乘法運(yùn)算符也可以用在字符串上。加法運(yùn)算符對(duì)于字符串而言表示多個(gè)字符串首

尾銜接得到一個(gè)更長(zhǎng)的字符串,這一點(diǎn)在前

3

章的代碼中已多次出現(xiàn)。乘法運(yùn)算符對(duì)于字符串而言

表示重復(fù),這倒也是乘法的本意。2×3

的含義是

2+2+2。因此一個(gè)字符串乘以整數(shù),如乘以3,表

3個(gè)該字符串相加,即

3個(gè)該字符串首尾銜接。代碼

4.4

的第二個(gè)print()函數(shù)輸出的是“多實(shí)踐!

多實(shí)踐!多實(shí)踐!”。但乘法運(yùn)算符不能用在兩個(gè)字符串之間。代碼

4.4

字符串與乘法運(yùn)算符4.1.3字符串的運(yùn)算符print("重要的事情說(shuō)三遍:")print("多實(shí)踐!

"*

3)另外,還有成員運(yùn)算符

in和

notin可用來(lái)判斷一個(gè)字符串是否在另一個(gè)字符串中,這在代碼

2.16、代碼

3.1、代碼

3.4、代碼

3.5及代碼

3.19等例子中多次出現(xiàn)。字符在計(jì)算機(jī)中是用二進(jìn)制表示的,當(dāng)然二進(jìn)制可以換算為十進(jìn)制,因此每一個(gè)字符都對(duì)應(yīng)著

一個(gè)十進(jìn)制數(shù),這個(gè)數(shù)值即為該字符的編碼。Python

有兩個(gè)內(nèi)置函數(shù)可以完成字符串與對(duì)應(yīng)編碼之

間的轉(zhuǎn)換,分別是

chr()函數(shù)(可將數(shù)值編碼轉(zhuǎn)為對(duì)應(yīng)的字符)和

ord()函數(shù)(可將字符轉(zhuǎn)為對(duì)應(yīng)的數(shù)

值編碼),如代碼

4.5所示。代碼

4.5

字符串與編碼之間的轉(zhuǎn)換4.1.4字符的編碼print(chr(97))#輸出結(jié)果為'a'print(ord("a"))#輸出結(jié)果為

97print(chr(98))#輸出結(jié)果為'b'print(ord("b"))#輸出結(jié)果為

98print(chr(65))#輸出結(jié)果為'A'print(ord("A"))#輸出結(jié)果為

65print(chr(66))#輸出結(jié)果為'B'print(ord("B"))#輸出結(jié)果為

66print(ord("漢"))

#輸出結(jié)果為

27721print(chr(27721))#輸出結(jié)果為漢PART24.2字符串的格式化之所以將

format()稱為方法而不是函數(shù),是按照面向?qū)ο缶幊塘?xí)慣來(lái)稱呼的。在

Python

中,所

有的字符串都是同一類對(duì)象,任何一個(gè)具體的字符串都具有這類對(duì)象共有的一些特征,這些特征包

括屬性和方法。前面介紹

turtle庫(kù)時(shí)提到,使用

Turtle類生成的每一個(gè)具體的小海龜都有前進(jìn)、后退、

左轉(zhuǎn)、右轉(zhuǎn)等能力,這些能力是通過(guò)調(diào)用小海龜對(duì)象相應(yīng)的

forward()、backward()、left()、right()等方法來(lái)體現(xiàn)的。同一類對(duì)象擁有的方法表明了這類對(duì)象的能力。字符串這類對(duì)象同樣擁有一系列的方法,本章4.4

節(jié)會(huì)集中介紹其中一些常用的方法,而本節(jié)的主角則是能完成字符串格式化定制的format()方法。什么是字符串的格式化呢?通過(guò)一個(gè)例子即可一目了然。下面的代碼

4.6

是對(duì)第

3

章代碼

3.25

的修改。循環(huán)體的前半部分仍然使用

random庫(kù)的

choice()函數(shù)抽取學(xué)生和大師,但在構(gòu)造輸出字符

串時(shí),采用了字符串的

format()方法。4.2.1字符串的format()方法代碼

4.6使用

format()方法格式化字符串代碼將第

3

章的寫(xiě)法轉(zhuǎn)換為注釋,然后提供了

3個(gè)新的寫(xiě)法。先來(lái)看共同之處,3個(gè)寫(xiě)法均先用引號(hào)構(gòu)造好待輸出的字符串,并使用花括號(hào)標(biāo)記出內(nèi)容待定位置,這些位置會(huì)由變量的值來(lái)填充。

如何指明哪些變量來(lái)填充呢?這里就是format()方法登場(chǎng)的時(shí)機(jī)了。通過(guò)“點(diǎn)語(yǔ)法”呼喚字符串的format()方法,在方法的括號(hào)內(nèi)指明用來(lái)填充待定位置的變量即可。4.2.1字符串的format()方法importrandomfor

iin

range(3):lucky_guy=random.choice("abcdefghijklmnopqrstuvwxyz")master=random.choice("老孔墨孟莊荀孫")#第

3章的寫(xiě)法#msg="請(qǐng)"+

lucky_guy

+

"向"

+master

+

"子提問(wèn)。"#寫(xiě)法

1:為每個(gè)待定位置命名msg="請(qǐng){s}向{m}子提問(wèn)。".format(s=lucky_guy,m=master)#寫(xiě)法

2:為每個(gè)待定位置編號(hào)#msg="請(qǐng){0}向{1}子提問(wèn)。".format(lucky_guy,master)#寫(xiě)法

3:大師向?qū)W生提問(wèn)#msg="請(qǐng){1}向{0}子提問(wèn)。".format(lucky_guy,master)print(msg)使用花括號(hào)不僅可以在字符串中標(biāo)記內(nèi)容待定的位置,還可以使用一套符號(hào)對(duì)將來(lái)出現(xiàn)在該位

置的內(nèi)容的寬度、對(duì)齊方式、小數(shù)保留幾位等格式進(jìn)行定制。具體字符串格式符從左至右可使用的

符號(hào)如下。引導(dǎo)符:填充符→<

左對(duì)齊、^

居中對(duì)齊、>

右對(duì)齊→總寬度→千位分隔符→小數(shù)位數(shù)→s字

符串、d十進(jìn)制整數(shù)、f

浮點(diǎn)數(shù)。不是每個(gè)花括號(hào)標(biāo)記的待定位置都需要使用這么多項(xiàng),根據(jù)需要選擇即可。代碼4.7

演示了格

式符的使用細(xì)節(jié)。4.2.1字符串的format()方法代碼

4.7

字符串格式符示例4.2.1字符串的format()方法title=

"中國(guó)的古人與圓周率π"msg="{:=^20s}".format(title)print(msg)msg="秦之前的古人進(jìn)行了探索性研究,認(rèn)為圓周率的值為{:>2d}".format(3)print(msg)msg="東漢張衡在其所寫(xiě)的天文學(xué)著作《靈憲》中記錄"\"圓周率的值為

736/232,約為{:.7f}".format(736/232)print(msg)msg="三國(guó)時(shí)期王蕃給出圓周率的近似值為

142/45,約為{:.7f}".format(142/45)print(msg)print("魏晉時(shí)期劉徽計(jì)算得出圓周率的值約為

3.141592104")print("南北朝時(shí)期祖沖之計(jì)算得出圓周率在

3.1415926

3.1415927

之間")print("祖沖之建議做簡(jiǎn)單運(yùn)算時(shí)使用

22/7,做復(fù)雜運(yùn)算時(shí)使用

355/113")msg="這兩個(gè)值分別約為{0:.7f}和{1:.7f}".format(22/7,355/113)print(msg)代碼

4.7

的運(yùn)行結(jié)果如下。=====中國(guó)的古人與圓周率π=====秦之前的古人進(jìn)行了探索性研究,認(rèn)為圓周率的值為3東漢張衡在其所寫(xiě)的天文學(xué)著作《靈憲》中記錄圓周率的值為

736/232,約為

3.1724138三國(guó)時(shí)期王蕃給出圓周率的近似值為

142/45,約為

3.1555556魏晉時(shí)期劉徽計(jì)算得出圓周率的值約為

3.141592104南北朝時(shí)期祖沖之計(jì)算得出圓周率在

3.1415926

3.1415927

之間祖沖之建議做簡(jiǎn)單運(yùn)算時(shí)使用

22/7,做復(fù)雜運(yùn)算時(shí)使用

355/113這兩個(gè)值分別約為

3.1428571

3.1415929仔細(xì)觀察運(yùn)行結(jié)果,即不難理解代碼花括號(hào)內(nèi)的格式符含義。以輸出這段文字標(biāo)題的格式符{:=^20s}為例,首先以英文冒號(hào)即引導(dǎo)符開(kāi)始,表示要開(kāi)始描述格式細(xì)節(jié)要求了。之后是用來(lái)補(bǔ)足到

總寬度的字符=,然后是對(duì)齊方式^,表示居中對(duì)齊。再之后是總寬度

20個(gè)字符,最后是數(shù)據(jù)類型

s

,

表示要填充這個(gè)花括號(hào)位置的數(shù)據(jù)是字符串。如果填充的內(nèi)容不足

20個(gè)字符寬度,則要用=補(bǔ)足寬

度。如果是右對(duì)齊,則補(bǔ)足字符出現(xiàn)在左邊;如果是左對(duì)齊,則補(bǔ)足字符出現(xiàn)在右邊;居中對(duì)齊則

補(bǔ)足字符在兩邊。最后的輸出結(jié)果為“=====中國(guó)的古人與圓周率π=====”。再來(lái)看代碼最后輸出祖沖之建議使用的兩個(gè)分?jǐn)?shù)的近似值的格式符。這個(gè)字符串使用兩個(gè)花括

號(hào)標(biāo)記了兩個(gè)待定位置,因此給兩個(gè)位置編號(hào)為

0和

1,之后仍然以冒號(hào)引導(dǎo)符開(kāi)始,其后的“.7f

表示填充該位置的數(shù)據(jù)是小數(shù),而且保留

7位小數(shù)。格式化字符串的另一種方法是使用格式化字符串字面值。格式化字符串字面值也被簡(jiǎn)稱為

f-string,是帶有“f”或“F”前綴的字符串字面值。代碼

4.8

中第二個(gè)

print()輸出的字符串引號(hào)前有一個(gè)“f”,需要替換到花括號(hào)內(nèi)的變量直接寫(xiě)

在了花括號(hào)內(nèi)部,如果有進(jìn)一步的格式要求,則可以在冒號(hào)引導(dǎo)符后指明,使用的符號(hào)和format()

方法是一致的。這種方式與

format()方法一脈相承,但更加簡(jiǎn)潔。代碼

4.8

使用

f-string格式化字符串4.2.2格式化字符串字面值low_precision=22/7high_precision=355/113print("祖沖之建議做簡(jiǎn)單運(yùn)算時(shí)使用

22/7,做復(fù)雜運(yùn)算時(shí)使用

355/113")print(f"這兩個(gè)值分別約為{low_precision:.7f}和{high_precision:.7f}")最后一種字符串格式化的方法來(lái)自

Python2.x時(shí)代,但在

Python3.x

中仍然可以使用。這種格式

化方式也要在字符串中標(biāo)記出待定位置,但使用的是“%”,這里的“%”和模運(yùn)算沒(méi)有關(guān)系。代碼

4.9演示了這種方式。代碼

4.9

Python2.x的格式化方法代碼中構(gòu)造好的字符串使用“%”標(biāo)記了兩個(gè)待填充位置,其中“%s”表示將來(lái)要替換該位置

的數(shù)據(jù)是字符串,而“%.5f”表示將來(lái)占據(jù)該位置的是浮點(diǎn)數(shù),并且保留

5

位小數(shù)。填充待定位置

的變量如何指定呢?在字符串后面由“%”引導(dǎo),如果有多個(gè)變量,則要用圓括號(hào)括起來(lái)。在有多

個(gè)變量的情況下,變量與待填充位置仍然按位置一一對(duì)應(yīng)。代碼4.9的運(yùn)行結(jié)果如下。4.2.3Python2.x的格式化方法importmathmsg=

"%sis

%.5f"

%

("e",math.e)print(msg)e

is

2.71828PART34.3字符串的切片字符串是由字符構(gòu)成的序列,使用

for語(yǔ)句可對(duì)字符串進(jìn)行遍歷。實(shí)際上字符串中的每個(gè)字符都

有一個(gè)編號(hào)位置,字符串左起第一個(gè)字符編號(hào)為

0,第二個(gè)字符編號(hào)為

1,以此類推。通過(guò)編號(hào)位置

即索引,可以訪問(wèn)字符串中的每一個(gè)字符。代碼

4.10演示了兩種遍歷字符串的方法。方法

1更簡(jiǎn)潔,循環(huán)變量

char每次循環(huán)代表字符串中

的一個(gè)字符,明確體現(xiàn)了字符串是字符的序列的概念。方法

2在遍歷字符串時(shí)雖然較方法

1顯得煩

瑣一些,但它演示了通過(guò)索引位置訪問(wèn)字符的方法。4.3.1字符串msg="少壯不努力,老大徒傷悲!"#方法

1forchar

inmsg:print(char,end="-")print()#方法

2:fori

in

range(len(msg)):print(msg[i],end="=")少-壯-不-努-力-,-老-大-徒-傷-悲-!-少=壯=不=努=力=,=老=大=徒=傷=悲=!=代碼4.10的運(yùn)行結(jié)果如下。代碼

4.10

遍歷字符串使用一個(gè)索引位置可以訪問(wèn)字符串中對(duì)應(yīng)的一個(gè)字符,如果使用兩個(gè)索引位置,一個(gè)標(biāo)記開(kāi)始

位置,一個(gè)標(biāo)記結(jié)束位置,則可以訪問(wèn)字符串的一個(gè)片段。這就是字符串的切片操作,其本質(zhì)是復(fù)

制原字符串的一個(gè)片段,片段包含起點(diǎn)字符,但不包含終點(diǎn)字符。這與

range()函數(shù)有點(diǎn)類似,而且

切片操作同樣支持步長(zhǎng)的概念。總結(jié)下來(lái),字符串切片的基本語(yǔ)法是

a_str[起點(diǎn):終點(diǎn):步長(zhǎng)],代碼

4.11

對(duì)各種情形做了演示,共計(jì)

12個(gè)例子。代碼的注釋給出了每個(gè)例子的輸出結(jié)果,雖然各例子的結(jié)果

不一樣,但都是原字符串的一個(gè)或長(zhǎng)或短的片段。片段的起點(diǎn)、終點(diǎn)均在方括號(hào)內(nèi)有交代。代碼

4.11

字符串的切片示例研讀這段代碼時(shí)要注意,切片包含起點(diǎn),不包含終點(diǎn);字符索引編號(hào)從

0

開(kāi)始;原字符串中包

括逗號(hào)和感嘆號(hào)。第

1和第

2個(gè)例子不難理解。4.3.2字符串的切片示例print(my_str[0:5])#1:少壯不努力print(my_str[2:5])#2:不努力print(my_str[:5])#3:少壯不努力print(my_str[2:])#4:不努力,老大徒傷悲!print(my_str[2:11])#5:不努力,老大徒傷悲print(my_str[2:-1])#6:不努力,老大徒傷悲print(my_str[2:12])#7:不努力,老大徒傷悲!print(my_str[12:22])#8:空,但不報(bào)錯(cuò)print(my_str[2:5:2])#9:不力print(my_str[-6:-3])#10:老大徒print(my_str[-3:-6:-1])#11:傷徒大print(my_str[-3:-6:-2])#12:傷大my_str="少壯不努力,老大徒傷悲!"第

3個(gè)例子括號(hào)內(nèi)沒(méi)有寫(xiě)起點(diǎn),這種情形是從第一

個(gè)字符開(kāi)始;第

4個(gè)例子沒(méi)有寫(xiě)終點(diǎn)位置,此時(shí)片段直到字符串的結(jié)尾,包含最后一個(gè)字符在內(nèi)。

但若是在方括號(hào)內(nèi)明確指明了終點(diǎn)位置,如第

5和第

6個(gè)例子,此時(shí)根據(jù)規(guī)則片段是不包括最后一

個(gè)字符的。因此這兩個(gè)例子得到的片段均沒(méi)有感嘆號(hào),另外第

6個(gè)例子中的-1表示倒數(shù)第一個(gè)字符。

在第

7個(gè)例子中明確指明了終點(diǎn)位置,但顯然

12超過(guò)了原字符串最后一個(gè)字符的索引編號(hào),此時(shí)切

片操作并不報(bào)錯(cuò),可以正常進(jìn)行。這樣就能理解第

8個(gè)例子為什么得到的切片為空字符串,因?yàn)槠?/p>

起點(diǎn)位置都超過(guò)了原字符串的最后一個(gè)字符。前面所有的例子步長(zhǎng)均為

1,因此無(wú)須明確指出。接下來(lái)第

9個(gè)例子演示了步長(zhǎng)不為

1

時(shí)的情形。這個(gè)例子的起點(diǎn)為索引為

2

的字符,即“不”字,終點(diǎn)為索引為

5

的字符即逗號(hào),步長(zhǎng)為

2。

意思是從左向右“一步兩個(gè)臺(tái)階”,因此“不”字之后,要跳過(guò)“努”字,取“力”字,所以最后

的片段為“不力”。4.3.2字符串的切片示例第

10個(gè)例子演示的是索引位置為負(fù)數(shù)的情形。起點(diǎn)、終點(diǎn)為負(fù)數(shù)表示從字符串的右側(cè)數(shù)第幾個(gè)

字符,注意從右側(cè)倒著數(shù)時(shí)直接從-1開(kāi)始,表示倒數(shù)第一個(gè)字符,沒(méi)有-0這種寫(xiě)法,這一點(diǎn)不同于

從左側(cè)開(kāi)始。因此第

10個(gè)例子即為從倒數(shù)第

6個(gè)字符至倒數(shù)第

3個(gè)字符構(gòu)成的片段,當(dāng)然仍然不含

倒數(shù)第

3個(gè)字符。如何理解最后兩個(gè)例子中步長(zhǎng)也是負(fù)數(shù)的含義呢?通俗地講,步長(zhǎng)的正負(fù)決定著是上樓還是下

樓,步長(zhǎng)的絕對(duì)值大小決定一步幾個(gè)臺(tái)階。對(duì)于橫著寫(xiě)的字符串而言,從左向右為上樓,從右向左

為下樓。因此步長(zhǎng)為正,意味著片段是從左向右取的;步長(zhǎng)為負(fù),片段是從右向左取的。第

10個(gè)例

子中雖然起點(diǎn)、終點(diǎn)均為負(fù)數(shù),但步長(zhǎng)為默認(rèn)值

1,是正數(shù),所以片段要從左向右提取,起點(diǎn)為-6,

終點(diǎn)為-3。而第

11個(gè)例子則不同,其步長(zhǎng)為-1,所以片段是從右向左提取的,起點(diǎn)為-3,終點(diǎn)為-6。

得到的片段為“傷徒大”,字是從右向左排的。第

12個(gè)例子的道理是一樣的,只是步長(zhǎng)值為-2,因

此要從右向左“一步兩個(gè)臺(tái)階”。4.3.2字符串的切片示例切片這個(gè)詞容易引起誤會(huì),給人的感覺(jué)像是將一個(gè)字符串切成片段。其實(shí)不是的,切片操作是

從原字符串中復(fù)制一個(gè)片段,原字符串是毫發(fā)無(wú)損的。在前面的代碼

4.11

中對(duì)原始字符串進(jìn)行了

12

個(gè)切片操作,得到了

12個(gè)原字符串的片段字符串,但原字符串

my_str并沒(méi)有發(fā)生變化。事實(shí)上,Python

中的字符串是不可修改的。切片操作只是按照起點(diǎn)、終點(diǎn)、步長(zhǎng)的要求得到一

個(gè)新的字符串,因此切片操作會(huì)返回一個(gè)新字符串。下面的代碼

4.12

明確地演示了

Python

中字符串

是不可修改的。代碼構(gòu)造了一個(gè)字符串后發(fā)現(xiàn)第二個(gè)字寫(xiě)錯(cuò)了,于是希望通過(guò)索引位置直接修改第

二個(gè)字符,但程序會(huì)報(bào)告錯(cuò)誤信息“TypeError:'str'objectdoesnotsupportitemassignment”,大概意思是字符串對(duì)象是不支持元素的修改操作的。代碼

4.12

字符串是不可修改的不過(guò)要注意的是,雖然“少狀不努力”這個(gè)字符串無(wú)法修改,但

msg變量保存哪個(gè)字符串是隨

時(shí)可以修改的。因此可以構(gòu)造一個(gè)新的符合要求的字符串賦值給

msg變量,而原來(lái)錯(cuò)誤的字符串就

會(huì)成為內(nèi)存垃圾,會(huì)在某個(gè)時(shí)刻被

Python

回收。4.3.3字符串是不可修改的msg=

"少狀不努力"msg[1]=

"壯"#報(bào)錯(cuò)PART44.4字符串的常用方法判斷一個(gè)字符串是否在另一字符串中出現(xiàn),使用成員操作符

in

即可。但如果需要知道子串在字符串中出現(xiàn)的位置,則需要使用字符串的

find()方法,其語(yǔ)法如下。其中,sub

表示要找的目標(biāo)子串,這個(gè)參數(shù)是必需的。而

start

end

可限定查找范圍,如果省

略不寫(xiě),則默認(rèn)查找整個(gè)字符串

str

,因此這兩個(gè)參數(shù)是可選的。事實(shí)上在上述語(yǔ)法中,出現(xiàn)在方括

號(hào)內(nèi)的參數(shù)均為可選。find()方法的返回值為

sub在指定片段內(nèi)第一次出現(xiàn)的位置,如果沒(méi)有找到則

返回-1。只看描述是不容易理解的,下面看具體的例子。代碼

4.13

以王國(guó)維先生《人間詞話》的一句名

言為原始字符串,調(diào)用

find()方法找尋“其”字、“呼”字出現(xiàn)的位置,返回值見(jiàn)代碼注釋。代碼

4.13

字符串的

find()方法第一個(gè)

find()在整個(gè)

my_str字符串范圍內(nèi)查找“其”字,但因?yàn)?/p>

find()只返回第一次出現(xiàn)的位置,

所以結(jié)果為

2。而第二個(gè)

find()方法需要在索引為

4

的字符開(kāi)始查找目標(biāo),故返回的是第二個(gè)“其”

字的索引位置

12。最后一個(gè)因?yàn)椴闊o(wú)此字,所以返回-1。4.4.1find()方法str.find(sub[,start[,end]])print(my_str.find("其"))print(my_str.find("其",4))

print(my_str.find("呼"))my_str="入乎其內(nèi),故有生氣。出乎其外,故有高致。"#返回值為

2

#返回值為

12

#返回值為-1字符串的

index()方法與

find()方法很類似,主要的區(qū)別在于如果沒(méi)有找到目標(biāo),則

index()方法

會(huì)拋出錯(cuò)誤而不是返回-1,如代碼

4.14所示。代碼

4.14

字符串的

index()方法這段代碼與代碼

4.13相比,只是將

find()換成了

index(),尋找“其”字的結(jié)果與方法

find()一致,

但尋找“呼”字時(shí)會(huì)報(bào)錯(cuò)。4.4.2index()方法print(my_str.index("其"))#返回值為

2print(my_str.index("其",4))#返回值為

12print(my_str.index("呼"))#報(bào)錯(cuò)ValueError:substringnotfoundmy_str="入乎其內(nèi),故有生氣。出乎其外,故有高致。"如果不是關(guān)心目標(biāo)子串在原字符串中出現(xiàn)的位置,而是關(guān)注子串在原字符串中出現(xiàn)的次數(shù),則

可使用

count()方法,其語(yǔ)法如下??梢?jiàn)

count()方法的語(yǔ)法與

find()方法很類似,各參數(shù)的含義也相同。不同的是

count()方法返回

目標(biāo)子串在

start與

end參數(shù)指定的片段內(nèi)出現(xiàn)的次數(shù),而且多次出現(xiàn)的位置不能有重疊。例如,代碼

4.15

中,原始字符串是一副對(duì)聯(lián),其中上聯(lián)連續(xù)出現(xiàn)了

4個(gè)“解”字。如果允許有

重疊,則“解解”出現(xiàn)了

3次,但實(shí)際運(yùn)行結(jié)果為

2,這就是不能重疊的含義。代碼

4.15

字符串的

count()方法4.4.3count()方法my_str="一盞清茶解解解解元之渴五言絕詩(shī)施施施施主之才"print(my_str.count("解解"))

#運(yùn)行結(jié)果2,不是

3str.count(sub[,start[,end]])字處理軟件有一個(gè)常用的功能稱為查找替換,即將文章中的某些字符替換為指定的其他字符。replace()方法的功能與此類似,只是在對(duì)字符串完成查找替換操作后返回新的字符串。其語(yǔ)法如下。由此可見(jiàn),replace()方法將原字符串

str

中出現(xiàn)的

old

子串替換為

new,得到一個(gè)新的字符串返

回。如果指定了

count參數(shù),則

count可限定替換發(fā)生的次數(shù),只有前

count個(gè)

old子串會(huì)被替換。代碼

4.16有一段中國(guó)國(guó)家博物館的簡(jiǎn)介,但是簡(jiǎn)介中使用了簡(jiǎn)稱“國(guó)博”,現(xiàn)在要將“國(guó)博”

二字替換為“中國(guó)國(guó)家博物館”,使用repalce()方法即可。代碼

4.16

字符串的

replace()方法4.4.4replace()方法txt="國(guó)博位于天安門(mén)廣場(chǎng)東側(cè),其前身可追溯至

1912

年成立的"\"國(guó)立歷史博物館籌備處,2003

年根據(jù)中央決定,"\"中國(guó)歷史博物館和中國(guó)革命博物館合并組建成為國(guó)博。"\"2007

年國(guó)博啟動(dòng)改擴(kuò)建工程,新館建筑保留了原有老建筑西、"\"北、南建筑立面。新館總用地面積

7萬(wàn)平方米,建筑高度

42.5米,"\"地上

5層,地下

2層,展廳

48個(gè),建筑面積近

20萬(wàn)平方米,"\"是世界上單體建筑面積最大的博物館。國(guó)博現(xiàn)有藏品數(shù)量

140萬(wàn)余件,"\"涵蓋古代文物、近現(xiàn)代文物、圖書(shū)古籍善本、藝術(shù)品等多種門(mén)類。"text=txt.replace("國(guó)博","中國(guó)國(guó)家博物館")print(text)str.replace(old,new[,count])字符串的

split()方法可按照指定的分隔符將原字符串拆解為多個(gè)字符串,拆解后的多個(gè)字符串保

存在一個(gè)列表中,因此

split()方法的返回值是一個(gè)列表。而join()方法恰恰與

split()方法相反,它可以

將多個(gè)字符串連接成一個(gè)長(zhǎng)字符串。下面的代碼

4.17先利用

split()方法將

msg字符串以“-”為分隔符拆分為

5個(gè)字符串。這

5個(gè)字

符串被放到一個(gè)列表中,如代碼的注釋所示。注意,

此時(shí)已沒(méi)有原字符串中“-”字符的身影了,作

為分隔符的字符是不會(huì)出現(xiàn)在拆分后的結(jié)果中的。之后代碼又利用join()方法將列表中的幾個(gè)字符串

用“!”連接成一個(gè)長(zhǎng)字符串,最后輸出的結(jié)果即為“我!愛(ài)!你!中!國(guó)!”。代碼

4.17

字符串的

split()與join()方法以上講解了幾個(gè)很常用的字符串方法,其實(shí)方法還有很多,如將英文字符串變成大寫(xiě)的upper()

方法,將英文字符串變成小寫(xiě)的

lower()方法,判斷字符串是否以特定字符串開(kāi)頭的方法

startswith(),

是否以特定字符串結(jié)尾的方法

endswith(),去掉字符串兩端的空白的方法

strip()等,眾多方法不可能

在此全部介紹。但只要抓住每個(gè)方法的輸入與返回值兩個(gè)要點(diǎn),學(xué)會(huì)閱讀官方文檔,所有的字符串

難點(diǎn)都可迎刃而解。4.4.5split()與join()方法msg=

"我-愛(ài)-你-中-國(guó)!"str_list=msg.split("-")print(str_list)#["我","愛(ài)","你","中","國(guó)!"]msg=

"!".join(str_list)print(msg)#我!愛(ài)!你!中!國(guó)!PART54.5Python生態(tài)系統(tǒng)之xml庫(kù)XML是

eXtensibleMarkupLanguage

的縮寫(xiě),意為可擴(kuò)展標(biāo)記語(yǔ)言,因此

XML也是標(biāo)記語(yǔ)言。

這里的

markup或者說(shuō)標(biāo)簽是一些特定的記號(hào)。中學(xué)時(shí)老師給學(xué)生批改作文會(huì)使用一些特定的記號(hào),

學(xué)生看到這些記號(hào)就知道該刪去哪些字,在何處添加一些字,哪些字詞需要顛倒位置等。這些表達(dá)

老師修改意圖的記號(hào)其實(shí)就是

markup,只不過(guò)它們需要老師用筆畫(huà)在紙上,而XML

markup是寫(xiě)

在<>中的。與

HTML不同,XML

的標(biāo)簽沒(méi)有預(yù)定義,需要使用者自行約定。XML

的目的并不是要展示數(shù)

據(jù),而是為了更好地傳遞數(shù)據(jù)。標(biāo)簽存在的目的是讓數(shù)據(jù)的意義更容易被理解,因此往往都具有自我描述性。通過(guò)一個(gè)具體的例子能更好地理解標(biāo)簽對(duì)數(shù)據(jù)的描述價(jià)值。下面的代碼

4.18用

XML語(yǔ)言記錄

古代詩(shī)人信息,包括詩(shī)人的姓名、朝代、稱號(hào)、代表詩(shī)作及好友等。寫(xiě)在“<>”中的是

markup,它

們不是數(shù)據(jù),是用來(lái)標(biāo)記數(shù)據(jù)含義的。真正的數(shù)據(jù)寫(xiě)在“<>”之外。原始數(shù)據(jù)有了這些

markup的

描述,數(shù)據(jù)的含義就會(huì)更清晰。需要再次強(qiáng)調(diào)的是,XML

并沒(méi)有一套固定的標(biāo)記符號(hào),例子中的

<data>、<poet>、<friend>等是使用者自己定義的。只要交流數(shù)據(jù)的雙方都認(rèn)可這些記號(hào),就可以很方便地使用XML交換數(shù)據(jù)。4.5.1XML的概念代碼

4.18

XML示例4.5.1XML的概念</poet><poetname="王維"><dynasty>唐</dynasty><title>詩(shī)佛</title><poems><poem>山居秋暝</poem><poem>相思</poem><poem>送元二使安西</poem></poems><friends><friendname="孟浩然"young_or_old="older"/>

</friends><?xmlversion="1.0"?><data><poetname="李白"><dynasty>唐</dynasty>

<title>詩(shī)仙</title><poems><poem>將進(jìn)酒</poem><poem>望廬山瀑布</poem>

<poem>早發(fā)白帝城</poem></poems><friends><friendname="孟浩然"young_or_old="older"/><friendname="賀知章"young_or_old="older"/><friendname="杜甫"young_or_old="younger"/></friends></poet></data>通過(guò)這個(gè)例子可知,所謂XML其實(shí)就是通過(guò)一套標(biāo)簽以文本形式保存數(shù)據(jù)。因?yàn)閄ML文件是

文本文件,所以無(wú)須特殊軟件即可對(duì)其進(jìn)行處理,而且其體積小巧,傳輸方便,可在各種系統(tǒng)平臺(tái)

中使用,應(yīng)用場(chǎng)景極其廣泛。以

XML

格式提供的數(shù)據(jù)展現(xiàn)出明顯的樹(shù)狀結(jié)構(gòu),解析結(jié)構(gòu)如此明晰的文本數(shù)據(jù)是有固定模式

的,Python生態(tài)系統(tǒng)中自然會(huì)有完成相應(yīng)工作的工具包,而

xml庫(kù)是其中之一。這個(gè)庫(kù)包含幾個(gè)模

塊,其中

xml.etree.ElementTree是一個(gè)簡(jiǎn)單而輕量級(jí)的

XML解析器,用來(lái)解析

XML格式的數(shù)據(jù)非常方便。代碼

4.19

以古代詩(shī)人的數(shù)據(jù)為例演示了解析XML數(shù)據(jù)的細(xì)節(jié)。

在導(dǎo)入

xml.etree.ElementTree

模塊時(shí),為了方便給它起了別名

ET,這樣后面的代碼就可以使用

ET代表

xml.etree.ElementTree,會(huì)方便很多。代碼中的

XML數(shù)據(jù)以字符串形式保存在

xml_str變量中,而

fromstring()函數(shù)則可以根據(jù)字符串解析

XML

數(shù)據(jù),并得到樹(shù)形結(jié)構(gòu)的根,從根出發(fā)可以很方便地對(duì)XML數(shù)據(jù)的各分支細(xì)節(jié)進(jìn)行提取。

4.5.2解析XML數(shù)據(jù)單擊此處添加文本importxml.etree.ElementTreeasETxml_str="""<?xmlversion="1.0"?>

<data><poetname="李白"><dynasty>唐</dynasty>

<title>詩(shī)仙</title><poems><poem>將進(jìn)酒</poem><poem>望廬山瀑布</poem>

<poem>早發(fā)白帝城</poem></poems><friends><friendname="孟浩然"young_or_old="older"/><friendname="賀知章"young_or_old="older"/><friendname="杜甫"young_or_old="younger"/></friends></poet><poetname="王維"><dynasty>唐</dynasty><title>詩(shī)佛</title><poems><poem>山居秋暝</poem>

<poem>相思</poem><poem>送元二使安西</poem></poems><friends><friendname="孟浩然"young_or_old="older"/></friends></poet></data>"""root=ET.fromstring(xml_str)forpoet

inroot:print(f"標(biāo)簽名:{poet.tag}\t屬性:{poet.attrib}")for

item

inpoet:print(f"\t標(biāo)簽名:{item.tag}")ifitem.tag==

"friends":for

friendin

item:print(f"\t\t標(biāo)簽名:{friend.tag}\t屬性:{friend.attrib}")這里讀者可能有一個(gè)疑問(wèn),xml_str是

XML格式的數(shù)據(jù),本身就已經(jīng)呈現(xiàn)樹(shù)形結(jié)構(gòu),那為什么

還要使用fromstring()函數(shù)進(jìn)行解析呢?其實(shí)XML

數(shù)據(jù)呈現(xiàn)樹(shù)形結(jié)構(gòu)是人類的感知,在機(jī)器看來(lái)

xml_str只是一個(gè)由很多字符構(gòu)成的字符串序列,并沒(méi)有什么樹(shù)形結(jié)構(gòu)。因此才需要使用

fromstring()

函數(shù)根據(jù)

xml_str字符串構(gòu)造樹(shù)形結(jié)構(gòu)并獲取根節(jié)點(diǎn),這樣就可以按照樹(shù)形結(jié)構(gòu)的線索訪問(wèn)數(shù)據(jù)了。

可以使用

for

語(yǔ)句遍歷變量

root保存的根節(jié)點(diǎn)下的每一個(gè)分支,對(duì)于每個(gè)分支又可以遍歷其下的枝

杈。對(duì)每個(gè)標(biāo)簽輸出它的標(biāo)簽名稱

tag和其屬性

attrib。代碼

4.19使用

fromstring()函數(shù)解析

XML數(shù)據(jù)代碼

4.19

的運(yùn)行結(jié)果如下。上述例子中的XML數(shù)據(jù)以字符串的形式直接嵌在代碼中,但很多時(shí)候

XML數(shù)據(jù)是以文件的形

式提供的,因此需要從外部文件中讀取數(shù)據(jù)并解析,這可以使用

xml庫(kù)的

parse()函數(shù)來(lái)實(shí)現(xiàn)。代碼

4.20演示了parse()函數(shù)的使用,注意其與

fromstring()函數(shù)的區(qū)別。4.5.2解析XML數(shù)據(jù)標(biāo)簽名:poet

屬性:{'name':

'李白'}標(biāo)簽名:dynasty標(biāo)簽名:title標(biāo)簽名:poems標(biāo)簽名:friends標(biāo)簽名:friend屬性:{'name':

'孟浩然','young_or_old':

'older'}標(biāo)簽名:friend屬性:{'name':

'賀知章','young_or_old':

'older'}標(biāo)簽名:friend屬性:{'name':

'杜甫','young_or_old':

'younger'}

標(biāo)簽名:poet

屬性:{'name':

'王維'}標(biāo)簽名:dynasty標(biāo)簽名:title標(biāo)簽名:poems標(biāo)簽名:friends標(biāo)簽名:friend屬性:{'name':

'孟浩然','young_or_old':

'older'}代碼

4.20使用

parse()函數(shù)解析

XML數(shù)據(jù)4.5.2解析XML數(shù)據(jù)importxml.etree.ElementTreeasETtree=ET.parse("代碼

4.18-xml示例_古代詩(shī)人.xml")#生成樹(shù)形結(jié)構(gòu)root=tree.getroot()#獲取樹(shù)根節(jié)點(diǎn)forpoet

inroot:#獲取當(dāng)前詩(shī)人信息name=poet.attrib["name"]dynas

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論