天天看點

《從問題到程式:用Python學程式設計和計算》——2.4 字元串

本節書摘來自華章計算機《從問題到程式:用python學程式設計和計算》一書中的第2章,第2.4節,作者 裘宗燕,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

文字處理是計算機的重要應用領域。此外,大多數計算機程式都需要和使用者打交道,需要接受使用者提供的資料或指令,給使用者提供回報,把計算的結果展示給使用者,操作中也可能用到各種文字形式的資訊。python用字元串支援文本的表示和處理。

字元串就是字元的序列,python中的字元串也是一種資料對象,其類型稱為字元串類型,類型的名字是str。

字元串有幾種字面量描述形式,最簡單的字面量是用一對單引号或者一對雙引号括起的一系列字元(兩種括号的作用相同,但要配對)。例如:

cpython解釋器輸出字元串時都采用單引号括起的形式,這也間接說明,無論用單引号還是雙引号寫字元串字面量,結果都一樣。這兩種形式的限制是在一個字元串字面量中間不能換行,是以隻适合描述比較短的字元串。如果在一個字元串沒寫完(沒出現表示結束的第二個引号)時換行,解釋器将報告文法錯syntaxerror: eol while scanning string literal,意為在掃描字元串字面量的過程中遇到了換行(eol,end of line)。

字元串還有另外兩種字面量形式。python允許用一對連續的三個單引号或者一對連續的三個雙引号作為字元串括号。這種形式的字元串,特點是描述中可以換行,換行符号也作為字元串内容。例如,下面是python文檔中的一段話:

注意,這裡的輸入是連續的5行字元,解釋器輸出的是一個字元串,同樣用一對單引号括起。比較輸入和輸出,可以看到輸入中的每個換行,在解釋器輸出的字元串裡變成了兩個字元 n,實際上,這樣兩個字元的序列就表示一個換行字元。

有些字元無法用普通字元形式寫出,上面的換行符就是一例。為了能在字元串裡寫這些字元,python規定了一組特殊描述方式,其形式都是用一個反斜線字元開頭,随後再寫另外的字元。下面是幾個常用特殊字元的寫法及其解釋:

《從問題到程式:用Python學程式設計和計算》——2.4 字元串

這種寫法稱為換意序列,用反斜線符表示後面字元的意義換了。例如,如果想在單引号括起的字元串裡寫一個單引号,直接寫出就表示字元串結束,顯然不行。這裡必須用換意序列,寫兩個字元“'”表示這個單引号。例如 'i don't think so'。其他情況類似。由于有兩種引号,上例也可以簡單寫為 "i don't think so",這裡就不必寫反斜線符了。也就是說,在兩個雙引号括起的字元串裡單引号是普通字元,反之依然。對反斜線符本身,如果單寫就表示做換意,是以規定雙寫。本章語言細節一節列出了更多換意序列。

作為一種重要的資料類型,字元串也有很多操作。這裡簡單介紹幾個最基本的字元串操作,更多操作将在後面介紹,另請檢視python标準庫手冊。

在一個字元串裡包含一系列字元,其中每個字元有一個位置,從0開始順序編号,稱為下标(index)。可以通過編号取得字元串裡對應的字元,例如:

基于下标取字元串裡的單個字元,用方括号裡寫下标的形式描述。顯然,取字元隻能在具體字元串的範圍内進行,超範圍通路是下标越界(index out of range)錯誤。python允許用負整數作為下标提取字元串裡的字元,下标 – 1表示取最後一個字元,其餘類推:

注意,python語言裡并沒有獨立的字元概念,隻有字元串。通過下标取字元,得到的實際上是隻包含一個字元的字元串。

字元串中的字元個數稱為字元串的長度(length),用python内置函數len可以求出字元串的長度,例如:

顯然,對字元串s,其合法下标範圍是0到len(s) – 1。

字元串的另一個重要操作是拼接,可以拼接起兩個或更多個字元串,做出一個長字元串。python中字元串的拼接用加法運算符表示。例如:

實際中需要拼接的通常不是這種直接寫出的字面量,而是程式裡已有的字元串。注意,字元串拼接運算沒有可交換性,交換兩個運算對象,通常将得到另一字元串。

可以從一個字元串出發,做出它的幾個拷貝的拼接,這種操作用乘法運算符描述。操作的另一運算對象應該用一個整數。例如:

兩種順序寫的運算對象的效果完全一樣。

切片是另一種重要字元串操作,其功效是取出已有字元串中的一部分(0個或多個字元),做成一個新字元串。字元串切片的描述方式與取字元類似,也用一對方括号。但括号裡不是寫一個表示整數的表達式,而是寫一個切片描述。切片描述有兩種不同形式。假設s是一個字元串,下面兩種描述取得s的切片:

s[m:n]  得到由字元s[m] 到s[n-1] 構成的字元串。如果m≥n就得到一個空字元串,其中不包含任何字元。

s[m:n:d]  得到由s[m] 到s[n-1],下标的步進值為d選出字元做成的字元串。如果d是正數且m≥n,或者d是負數且n≥m,都得到空字元串。

這裡的m、n、d都應該是值為整數的表達式,m或n的值為-1表示字元串s的最後一個字元,其餘負數類推。切片描述中必須包含冒号,但m、n、d都可以省略。m省略時表示0(從字元串的首字元開始),n省略時表示len(s)(到最後一個字元為止),d省略時表示1。是以,對這兩種使用形式,所有下标都省略時都表示做出整個字元串的拷貝。

注意,這裡的下标範圍描述采用左閉右開的規則,也就是說,總包含第一個下标描述的字元,但不包括第二個下标描述的字元,是一個左閉右開的字元位置區間。

下面是幾個簡單示例:

各種數值類型的對象都可以轉換到字元串,得到它們的字元串表示。在程式輸入輸出時經常需要做這種轉換,有些是自動完成的。先看幾個例子:

最後一步做的是字元串拼接。後一個例子沒有實際意義,隻是為了說明問題。

同樣可以做另一個方向的轉換:如果一個字元串裡的字元都是十進制數字(可以帶正負号),可以從它轉換得到一個整數或者浮點數:

開頭的0自動忽略。此外,如果一個字元串的内容符合python浮點數的要求,就可以從它構造出一個浮點數。例如:

字元串還有很多操作,将在第5章介紹,後面還會看到字元串的很多實際使用。