在本系列的第一篇文章 探索 Python(1): Python 的內建數值型別 中,我介紹了 Python 簡單的內建數值資料型別。如果您曾經使用過其他程式語言,那麼對這些資料型別可能不會陌生。雖然在那篇文章中沒有提及,但是 Python 和許多其他程式語言(諸如 C 或 Java™ 程式語言)之間的一個顯著區別是不存在內建字元資料型別。因為處理基於文字的資料是很常見的,所以,您可能想知道 Python 如何處理基於字元的資料。簡單來說,Python 通過包括一個不變的基於集合的類來提供一個優秀的解決方案,這個基於集合的類是專門為有效地處理字元序列而設計的。
字串
在 Python 中建立字串物件非常容易。只要將所需的文字放入一對引號中,就完成了一個新字串的建立(參見清單 1)。如果稍加思考的話,您可能會感到有些困惑。畢竟,有兩類可以使用的引號:單引號 (‘) 和雙引號 (“)。幸運的是,Python 再一次使這種問題迎刃而解。您可以使用任意一類引號來表示 Python 中的字串,只要引號一致就行。如果字串是以單引號開始,那麼必須以單引號結束,反之亦然。如果不遵循這一規則,則會出現 SyntaxError
異常。
清單 1. 在 Python 中建立字串
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
>>> sr="Discover Python" >>> type(sr) <type 'str'> >>> sr='Discover Python' >>> type(sr) <type 'str'> >>> sr="Discover Python: It's Wonderful!" >>> sr='Discover Python" File "<stdin>", line 1 sr='Discover Python" ^ SyntaxError: EOL while scanning single-quoted string >>> sr="Discover Python: \ ... It's Wonderful!" >>> print sr Discover Python: It's Wonderful! |
從清單 1 中可以看出,除了字串用適當的引號括起來之外,另外還有兩個重要方面。第一,在建立字串時,您可以混合使用單引號和雙引號,只要字串在開始位置和結束位置使用同一型別的引號。這種靈活性允許 Python 容易地保留常規的文字資料,這些常規的文字資料可能需要使用單引號來表示簡寫的動詞形式或所屬關係,以及使用雙引號來表示引述文字。
第二,如果字串用一行表示太長,您可以使用 Python 連續字元:反斜線 ($$ 來對字串進行折行。從內部機制看,在建立字串時換行符會被忽略,在列印字串時可以看出這一點。您可以結合使用這兩個功能,來建立包含較長段落的字串,如清單 2 所示。
清單 2. 建立長字串
1 2 3 4 5 6 7 8 |
>>> passage = 'When using the Python programming language, one must proceed \ ... with caution. This is because Python is so easy to use and can be so \ ... much fun. Failure to follow this warning may lead to shouts of \ ... "WooHoo" or "Yowza".' >>> print passage When using the Python programming language, one must proceed with caution. This is because Python is so easy to use, and can be so much fun. Failure to follow this warning may lead to shouts of "WooHoo" or "Yowza". |
編者注:上面的示例已折行處理,這樣使頁面佈局更合理。事實上,它本來顯示為一個較長的行。
注意,當列印 passage
字串時,所有格式將被刪除,只保留一個非常 長的字串。通常,您可以使用控制符來表示字串中的簡單格式。例如,要表示一個新行開始,您可以使用換行控制符 (\n);要表示插入一個製表符(預設空格數),可以使用製表符控制符 (\t),如清單 3 所示。
清單 3. 在字串中使用控制符
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
>>> passage='\tWhen using the Python programming language, one must proceed\n\ ... \twith caution. This is because Python is so easy to use, and\n\ ... \tcan be so much fun. Failure to follow this warning may lead\n\ ... \tto shouts of "WooHoo" or "Yowza".' >>> print passage When using the Python programming language, one must proceed with caution. This is because Python is so easy to use, and can be so much fun. Failure to follow this warning may lead to shouts of "WooHoo" or "Yowza". >>> passage=r'\tWhen using the Python programming language, one must proceed\n\ ... \twith caution. This is because Python is so easy to use, and\n\ ... \tcan be so much fun. Failure to follow this warning may lead\n\ ... \tto shouts of "WooHoo" or "Yowza".' >>> print passage \tWhen using the Python programming language, one must proceed\n\ \twith caution. This is because Python is so easy to use, and\n\ \tcan be so much fun. Failure to follow this warning may lead\n\ \tto shouts of "WooHoo" or "Yowza". |
清單 3 中的第一段按照您預期的方式使用了控制符。該段已具備良好的格式,閱讀非常方便。第二個示例雖然也進行了格式化處理,但它引用的是所謂的原始字串,即沒有應用控制符的字串。您始終可以認出原始字串,因為該字串的起始引號的前面有一個 r
字元,它是 raw的縮寫。
我不瞭解您講的有什麼可取之處,雖然這種方法可行,但建立一個段落字串似乎非常因難。當然一定有更好的方法。與往常一樣,Python 提供了一種非常簡單的方法用於建立長字串,該方法可保留建立字串時所使用的格式。這種方法是使用三個雙引號(或三個單引號)來開始和結束長字串。在該字串中,您可以使用任意多的單引號和雙引號(參見清單 4)。
清單 4. 使用三個引號的字串
1 2 3 4 5 6 7 8 9 10 11 12 |
>>> passage = """ ... When using the Python programming language, one must proceed ... with caution. This is because Python is so easy to use, and ... can be so much fun. Failure to follow this warning may lead ... to shouts of "WooHoo" or "Yowza". ... """ >>> print passage When using the Python programming language, one must proceed with caution. This is because Python is so easy to use, and can be so much fun. Failure to follow this warning may lead to shouts of "WooHoo" or "Yowza". |
將字串作為一個物件
如果閱讀了本系列前兩篇文章中的任何一篇文章,那麼在您的腦海中會立即浮現出這樣一句話:在 Python 中,所有事物都是物件。到目前為止,我還沒有涉及到關於 Python 中的字串的物件特性的問題,但是,與往常一樣,Python 中的字串就是物件。事實上,字串物件是 str
類的一個例項。正如您在 探索 Python(2)中看到的,Python 直譯器包括一個內建幫助工具(如清單 5 所示),它可以提供關於 str
類的資訊。
清單 5. 獲取關於字串的幫助資訊
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
>>> help(str) Help on class str in module __builtin__: class str(basestring) | str(object) -> string | | Return a nice string representation of the object. | If the argument is a string, the return value is the same object. | | Method resolution order: | str | basestring | object | | Methods defined here: | | __add__(...) | x.__add__(y) <==> x+y | ... |
使用單引號、雙引號和三引號語法建立的字串仍然是字串物件。但是您也可以使用 str
類建構函式顯式地建立字串物件,如清單 6 所示。該建構函式可以接受簡單的內建數值型別或字元資料作為引數。兩種方法都可以將輸入的內容更改為新的字串物件。
清單 6. 建立字串
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
>>> str("Discover python") 'Discover python' >>> str(12345) '12345' >>> str(123.45) '123.45' >>> "Wow," + " that " + "was awesome." 'Wow, that was awesome.' >>> "Wow,"" that ""was Awesome" 'Wow, that was Awesome' >>> "Wow! "*5 'Wow! Wow! Wow! Wow! Wow! ' >>> sr = str("Hello ") >>> id(sr) 5560608 >>> sr += "World" >>> sr 'Hello World' >>> id(sr) 3708752 |
清單 6 中的例子也展示了關於 Python 字串的幾個其他重要方面。第一,通過將其他字串新增在一起,可以建立新的字串,具體方法可以使用 +
運算子,或者乾脆使用適當的引號將字串連在一起。第二,如果需要重複短字串來建立長字串,可以使用 *
運算子,將字串重複一定的次數。我在本文開頭說過,在 Python 中,字串是不變的字元序列, 上例中的最後幾行說明了這一點,我首先建立一個字串,然後通過新增其他字串對它進行修改。從對 id
方法兩次呼叫的輸出中可以看出,建立的新字串物件中儲存的是向原字串中新增文字的結果。
str
類包含大量的用於操作字串的有用方法。這裡不做一一介紹,您可以使用幫助直譯器獲得有關資訊。現在讓我們瞭解一下四個有用的函式,並演示其他 str
類方法的工具。清單 7 演示了 upper
、lower
、split
和 join
方法。
清單 7. 字串方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
>>> sr = "Discover Python!" >>> sr.upper() 'DISCOVER PYTHON!' >>> sr.lower() 'discover python!' >>> sr = "This is a test!" >>> sr.split() ['This', 'is', 'a', 'test!'] >>> sr = '0:1:2:3:4:5:6:7:8:9' >>> sr.split(':') ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] >>> sr=":" >>> tp = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') >>> sr.join(tp) '0:1:2:3:4:5:6:7:8:9' |
前兩個方法 upper
和 lower
很容易理解。它們只是分別將字串都轉換成大寫字母或小寫字母。split
方法很有用,因為它可以將一個字串分成幾個較小的字串序列,方法是將令牌字元(或給定字元序列中的任何字元)用作斷開位置的指示器。所以,第一個 split
方法示例使用預設的令牌將字串“This is a test”拆分開,此令牌可以是任何空白字元(這個序列包括空格、製表符和換行符)。第二個 split
方法演示如何使用不同的令牌字元(本例中使用的是冒號)將一個字串分成一系列字串。最後的一個例子顯示如何使用 join
方法,該方法的作用與split
方法相反, 可以使多個短字串序列形成一個長字串。在本例中,使用冒號將 tuple
包含的由單個字元構成的字串序列連線在一起。
將字串用作字元的容器
在本文的開頭部分,我著重強調了 Python 中的字串是不變的字元序列。本系列的第 2 部分 探索 Python(2): 探索 Python 型別的層次結構 —— 瞭解物件和容器 介紹了 tuple
,它也是一個不變的序列。tuple 通過以下方式支援訪問序列中的元素:使用索引符號,使用片段分離序列中的元素,以及使用特定的片段或將不同的片段新增在一起來建立新的元組。根據這一情況,您可能想知道是否可以將同一技巧應用於 Python 字串。如清單 8 所示,答案顯然是“可以”。
清單 8. 字串方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
>>> sr="0123456789" >>> sr[0] '0' >>> sr[1] + sr[0] '10' >>> sr[4:8] # Give me elements four through seven, inclusive '4567' >>> sr[:-1] # Give me all elements but the last one '012345678' >>> sr[1:12] # Slice more than you can chew, no problem '123456789' >>> sr[:-20] # Go before the start? '' >>> sr[12:] # Go past the end? '' >>> sr[0] + sr[1:5] + sr[5:9] + sr[9] '0123456789' >>> sr[10] Traceback (most recent call last): File "<stdin>", line 1, in ? IndexError: string index out of range >>> len(sr) # Sequences have common methods, like get my length 10 |
在 Python 中,將字串作為字元序列進行處理是非常簡單的。您可以獲得單個元素,將不同的元素新增在一起,切出幾個元素,甚至將不同的片段新增在一起。進行切片的一個非常有用的特性是,在開始之前或結束之後進行較多切片不會丟擲異常,只是相應地以預設方式開始或結束該序列。相反,如果您試圖使用允許範圍之外的索引來訪問單個元素,則會得到一個異常。這種行為說明了為什麼 len
方法是如此重要。
字串:功能強大的工具
在本文中,我介紹了 Python 字串,它是一種不變的字元序列。在 Python 中,您可以使用多個方法很容易地建立字串,其中包括使用單引號、雙引號或更靈活的方式,即使用一組三個引號。假設 Python 中的每個事物都是一個物件,您可以使用底層的 str
類方法來獲得附加功能或直接使用字串的序列功能。