|
在編寫程序時(shí),你會(huì)經(jīng)常使用字符串。字符串是由單引號(hào)、雙引號(hào)或三引號(hào)圍住的一系列字母。Python 3將字符串定義為“文本序列類型”。你可以使用內(nèi)置的str函數(shù)將其他類型轉(zhuǎn)換為字符串。 在本文中,你將學(xué)習(xí)如何:
讓我們從學(xué)習(xí)創(chuàng)建字符串的不同方法開始吧! 創(chuàng)建字符串這里是創(chuàng)建字符串的一些例子: 當(dāng)你使用三重引號(hào)時(shí),你可以在字符串的開頭和結(jié)尾使用三個(gè)雙引號(hào)或者三個(gè)單引號(hào)。另外,請(qǐng)注意,使用三重引號(hào)可以創(chuàng)建多行字符串。字符串中的任何空白也將包括在內(nèi)。 下面是一個(gè)將整數(shù)轉(zhuǎn)換成字符串的例子: 在Python中,反斜杠可用于創(chuàng)建轉(zhuǎn)義序列。這里有幾個(gè)例子:
你還可以去閱讀Python文檔了解其他的轉(zhuǎn)義序列。 你也可以使用反斜杠來(lái)轉(zhuǎn)義引號(hào): 如果你在上面的代碼中沒(méi)有使用反斜杠,你會(huì)收到一個(gè)SyntaxError: 這個(gè)錯(cuò)誤之所以發(fā)生是因?yàn)樽址畷?huì)以第二個(gè)單引號(hào)結(jié)束。通常最好是將雙引號(hào)和單引號(hào)混在一起來(lái)解決這個(gè)問(wèn)題: 在本例中,你使用雙引號(hào)創(chuàng)建字符串,并在其中放入單引號(hào)。這在處理“don’t”、“can’t”等縮略語(yǔ)時(shí)尤其有用。 現(xiàn)在讓我們繼續(xù)看看可以對(duì)字符串使用什么方法! 字符串方法在Python中,一切皆對(duì)象。當(dāng)你學(xué)習(xí)內(nèi)省的時(shí)候,你將會(huì)在第18章學(xué)到它是多么的有用?,F(xiàn)在,你只需知道字符串有可以調(diào)用的方法(或函數(shù))就可以了。 這里有三個(gè)例子 方法名可以幫助你了解它們的作用。例如,.capitalize將會(huì)把字符串中的第一個(gè)字母變?yōu)榇髮憽?/p> 要獲得可以訪問(wèn)的方法和屬性的完整列表,你可以使用Python的內(nèi)置dir函數(shù): 該列表的前三分之一是特殊的方法,有時(shí)稱為“dunder方法”(也稱為雙下劃線方法)或“魔術(shù)方法”。你現(xiàn)在可以忽略這些,因?yàn)樗鼈兏嗟赜糜谥屑?jí)和高級(jí)用例。上面列表中開頭沒(méi)有雙下劃線的項(xiàng)可能是你最常使用的。 你會(huì)發(fā)現(xiàn).strip和.split方法在解析或操作文本時(shí)特別有用。 你可以使用.strip及其變體,.rstrip和.lstrip,來(lái)去除字符串中的空格,包括制表符和換行符。這在你讀取需要進(jìn)行解析的文本文件時(shí)特別有用。 實(shí)際上,你經(jīng)常會(huì)從字符串中去除行尾字符,然后對(duì)結(jié)果使用.split來(lái)解析出子字符串。 我們來(lái)做一個(gè)小練習(xí),在這里你將學(xué)習(xí)如何解析出一個(gè)字符串中的第二個(gè)單詞。 首先,這里有一個(gè)字符串: 要獲取一個(gè)字符串的各個(gè)部分,你可以調(diào)用.split,如下所示: 結(jié)果是一個(gè)字符串列表。通常你會(huì)把這個(gè)結(jié)果賦值給一個(gè)變量,但這里只是為了演示,你可以跳過(guò)這一部分。 相反,因?yàn)槟悻F(xiàn)在知道結(jié)果是一個(gè)字符串,你可以使用列表切片來(lái)獲得第二個(gè)元素: 記住,在Python中,列表元素是從0開始的,所以當(dāng)你告訴列表你想要元素1時(shí),這個(gè)元素其實(shí)是列表中的第二個(gè)元素。 當(dāng)你在工作中進(jìn)行字符串解析時(shí),我個(gè)人發(fā)現(xiàn)你可以非常有效地使用.strip和.split方法來(lái)獲得你需要的幾乎所有數(shù)據(jù)。你偶爾會(huì)發(fā)現(xiàn)你可能還需要使用正則表達(dá)式(regex),但大多數(shù)情況下這兩個(gè)方法就足夠了。 字符串格式化字符串格式化或字符串替換是你想要將一個(gè)字符串插入到另一個(gè)字符串中。當(dāng)你需要?jiǎng)?chuàng)建一個(gè)模板時(shí),這一點(diǎn)特別有用,比如構(gòu)建一封正式書信模板。同時(shí)對(duì)于調(diào)試輸出、打印到標(biāo)準(zhǔn)輸出等等操作,字符串替換也非常有用。 Python有三種不同的方式來(lái)完成字符串格式化:
本書將重點(diǎn)關(guān)注f-strings,并且也會(huì)不時(shí)地使用.format。但最好是理解這三種方法是如何工作的。 讓我們花點(diǎn)時(shí)間來(lái)學(xué)習(xí)更多關(guān)于字符串格式化的知識(shí)。 使用%s(printf-style)格式化字符串使用%方法是Python最古老的字符串格式化方法。它有時(shí)被稱為“printf-style字符串格式化”。如果你以前使用過(guò)C或C++,那么你可能已經(jīng)熟悉了對(duì)這種類型的字符串替換。為了簡(jiǎn)單起見(jiàn),你將在這里學(xué)習(xí)使用%的基礎(chǔ)知識(shí)。 注意:這種類型的格式化處理起來(lái)可能很古怪,并且會(huì)導(dǎo)致一些常見(jiàn)的錯(cuò)誤,比如不能正確地顯示Python元組和字典。在這種情況下,最好使用其他兩種方法中的一種。 使用%符號(hào)最常見(jiàn)的用法是當(dāng)你使用%s的時(shí)候,這意味著你要使用str將任何Python對(duì)象轉(zhuǎn)換為字符串。 下面是一個(gè)例子: ![]() 在這段代碼中,你獲取變量name,并使用特殊的%s語(yǔ)法將其插入到另一個(gè)字符串中。要使它工作,你需要在字符串外面使用%,后面再跟著你要插入的字符串或變量。 下面是第二個(gè)例子,它展示了你可以把一個(gè)int類型的數(shù)據(jù)傳入一個(gè)字符串,然后讓系統(tǒng)自動(dòng)為你轉(zhuǎn)換: ![]() 當(dāng)你需要轉(zhuǎn)換一個(gè)對(duì)象但不知道它是什么類型時(shí),這類東西特別有用。 你還可以使用多個(gè)變量進(jìn)行字符串格式化。事實(shí)上,有兩種方法可以做到這一點(diǎn)。 這是第一個(gè): ![]() 在本例中,你創(chuàng)建了兩個(gè)變量,并使用%s和%i。%i表示你將傳遞一個(gè)整數(shù)。要傳遞多個(gè)項(xiàng),你可以使用百分號(hào),后面再跟著要插入的項(xiàng)的元組。 你可以用name來(lái)讓這一點(diǎn)更清楚,比如: ![]() 當(dāng)%符號(hào)右側(cè)的參數(shù)是一個(gè)字典(或其他映射類型)時(shí),字符串中的格式必須使用圓括號(hào)將字典中的鍵括起來(lái)。換句話說(shuō),如果你看到%(name)s,那么%右邊的字典必須有一個(gè)name鍵。 如果你沒(méi)有包括所有需要的鍵,你將收到一個(gè)錯(cuò)誤: ![]() 有關(guān)使用printf-style字符串格式化的更多信息,請(qǐng)參閱以下鏈接: https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting現(xiàn)在讓我們繼續(xù)使用.format方法。 使用.format格式化字符串Python字符串支持.format方法已經(jīng)有很長(zhǎng)一段時(shí)間了。雖然本書將重點(diǎn)介紹如何使用f-strings,但是你會(huì)發(fā)現(xiàn).format仍然非常流行。 有關(guān)格式化如何工作的全部細(xì)節(jié),請(qǐng)參閱以下內(nèi)容: 我們來(lái)看幾個(gè)簡(jiǎn)短的例子,看看.format是如何工作的: ![]() 本例使用了位置參數(shù)。Python會(huì)查找{}的兩個(gè)實(shí)例,并相應(yīng)地插入變量。如果你沒(méi)有傳入足夠的參數(shù),你會(huì)收到這樣一個(gè)錯(cuò)誤: ![]() 這個(gè)錯(cuò)誤表明.format調(diào)用中沒(méi)有足夠的項(xiàng)。 你也可以用與前一節(jié)類似的方式來(lái)使用命名參數(shù): ![]() 你可以通過(guò)名稱傳遞參數(shù),而不是將一個(gè)字典傳遞給.format。事實(shí)上,如果你試圖傳遞一個(gè)字典,你會(huì)收到一個(gè)錯(cuò)誤: ![]() 不過(guò),這里有一個(gè)變通方案: ![]() 這看起來(lái)有點(diǎn)奇怪,但是在Python中,當(dāng)你看到像這樣使用雙星號(hào)(**)時(shí),這意味著你正在將命名參數(shù)傳遞給函數(shù)。Python會(huì)為你將字典轉(zhuǎn)換為name=name, age=age。 你還可以使用.format在字符串中多次重復(fù)一個(gè)變量: ![]() 這里,你在字符串中兩次引用了{(lán)name},并且你可以使用.format替換它們。 如果你想,你也可以使用數(shù)字進(jìn)行插值: ![]() 因?yàn)镻ython中的大多數(shù)東西都是從0開始的,所以,在本例中,你最終將age傳遞給了{(lán)1},將名稱傳遞給了{(lán)0}。 使用.format時(shí),一種常見(jiàn)的編碼風(fēng)格是創(chuàng)建一個(gè)格式化的字符串,并將其保存到一個(gè)變量中,以便以后使用: ![]() 這允許你重用greetings,并稍后在你的程序中為name和age傳遞更新后的值。 你也可以指定字符串寬度和對(duì)齊方式: ![]() 默認(rèn)值是左對(duì)齊。冒號(hào)(:)會(huì)告訴Python你準(zhǔn)備應(yīng)用某種格式。在第一個(gè)示例中,你指定字符串為左對(duì)齊,寬度為20個(gè)字符。第二個(gè)例子也是20個(gè)字符寬,但它是右對(duì)齊的。最后,^會(huì)告訴Python將字符串放在20個(gè)字符串的中間。 如果你想像在前面的例子中一樣傳入一個(gè)變量,你可以這樣做: ![]() 注意,name必須放在{}中的:之前。 至此,你應(yīng)該已經(jīng)非常熟悉.format的工作方式了。 讓我們更進(jìn)一步,繼續(xù)來(lái)學(xué)習(xí)f-strings! 使用f-strings格式化字符串格式化的字符串字面量或f-strings是在開頭有一個(gè)“f”的字符串,其中有包含表達(dá)式的花括號(hào),很像你在前一節(jié)中看到的那些。這些表達(dá)式會(huì)告訴f-string要對(duì)插入的字符串執(zhí)行的任何特殊處理,例如對(duì)齊、浮點(diǎn)精度等。 f-string是在Python 3.6中添加的。你可以在這里查看PEP 498來(lái)了解更多關(guān)于它的信息以及它是如何工作的: https://www.python.org/dev/peps/pep-0498/包含在f-strings中的表達(dá)式會(huì)在運(yùn)行時(shí)進(jìn)行計(jì)算。這樣,如果一個(gè)函數(shù)、方法或類包含表達(dá)式,我們就不可能使用f-string作為其文檔字符串。原因是文檔字符串是在函數(shù)定義時(shí)定義的。 讓我們繼續(xù)來(lái)看一個(gè)簡(jiǎn)單的例子: ![]() 在這里,你通過(guò)在字符串開頭的單引號(hào)、雙引號(hào)或三引號(hào)前加上“f”來(lái)創(chuàng)建f-string。然后在字符串內(nèi)部,你使用花括號(hào){}將變量插入到你的字符串中。 然而,你的花括號(hào)必須包含一些東西。如果你使用空的大括號(hào)創(chuàng)建一個(gè)f-string,你會(huì)得到一個(gè)錯(cuò)誤: ![]() 但是,f-string可以做%s和.format都不能做的事情。由于f-strings是在運(yùn)行時(shí)被計(jì)算的,所以,你可以將任何有效的Python表達(dá)式放在其中。 例如,你可以增加age變量: ![]() 或調(diào)用一個(gè)方法或函數(shù): ![]() 你也可以直接在一個(gè)f-string里面訪問(wèn)字典的值: ![]() 但是,反斜杠在f-string表達(dá)式中是不允許的: ![]() 但是你可以在f-string中的表達(dá)式之外使用反斜杠: ![]() 另一件你不能做的事情是在f-string的表達(dá)式中添加注釋: ![]() 在Python 3.8中,f-strings添加了對(duì)=的支持,它將擴(kuò)展表達(dá)式的文本,使其包含表達(dá)式的文本加上等號(hào),然后是求值后的表達(dá)式。這聽(tīng)起來(lái)有點(diǎn)復(fù)雜,我們來(lái)看一個(gè)例子: ![]() 這個(gè)示例演示了表達(dá)式中的文本,username=被添加到輸出中,后面跟著引號(hào)中的username的實(shí)際值。 f-strings是非常強(qiáng)大,非常有用的。如果你明智地使用它們,它們將大大簡(jiǎn)化你的代碼。你一定要試一試。 讓我們看看你還能對(duì)字符串做什么! 字符串連接字符串也允許連接,這是一個(gè)將兩個(gè)字符串連接成一個(gè)字符串的時(shí)髦詞。 要將字符串連接在一起,你可以使用+號(hào): ![]() 哎呀!看起來(lái)字符串以一種奇怪的方式合并了,因?yàn)槟阃浽趂irst_string的末尾添加空格了。你可以這樣改變它: ![]() 合并字符串的另一種方式是使用.join方法。.join方法接受一個(gè)可迭代對(duì)象,比如一個(gè)字符串列表,并將它們連接在一起。 ![]() 這將使字符串一個(gè)挨到一個(gè)進(jìn)行連接。你也可以把一些東西放在你要連接的字符串里面: ![]() 在本例中,它將把第一個(gè)字符串連接到***,然后再加上第二個(gè)字符串。 通常情況下,你可以使用f-string而不是連接或.join,這樣代碼會(huì)更容易理解一些。 字符串切片字符串中切片的工作方式與Python列表中切片的工作方式大致相同。讓我們以字符串“Mike”為例。字母“M”在位置0,字母“e”在位置3。 如果你想獲取字符0-3,你可以使用這個(gè)語(yǔ)法:my_string[0:4] 它的意思是你想讓子字符串從位置0開始,一直到但不包括位置4。 這里有幾個(gè)例子: ![]() 第一個(gè)示例從字符串中獲取前四個(gè)字母并返回它們。如果你愿意,你可以刪除0,因?yàn)樗悄J(rèn)值,并使用[:4]代替,這正是例2所做的。 你也可以使用負(fù)的位置值。因此[-4:]意味著你希望從字符串的末尾開始,并獲得字符串的最后四個(gè)字母。 你應(yīng)該自己嘗試一下切片,看看你還能想出什么其他的切片。 總結(jié)Python字符串很強(qiáng)大,也很有用。它們可以使用單引號(hào)、雙引號(hào)或三引號(hào)進(jìn)行創(chuàng)建。字符串是對(duì)象,所以它們有方法。你還了解了字符串連接、字符串切片和三種不同的字符串格式化方法。 字符串格式化的最新樣式是f-string。它也是目前最強(qiáng)大的格式化字符串的首選方法。 英文原文:https://www.blog./2020/04/07/python-101-working-with-strings/ |
|
|