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