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