Python 簡易手冊
單元 33 - 字串
字串 (string) 就是文字資料, Python 中字串的字面常數 (literal) 就是單引號或雙引號圍起來的內容,單引號開頭的字串不能以雙引號結尾,反之亦然,但是雙引號字串中可以使用單引號,同樣單引號字串中可以使用雙引號。
Python 還有一種三引號字串,比較常用在定義文件字串 (documentation string) ,單元 4 - 文件字串詳細介紹如何定義文件字串。
由於字串是不可變的 (immutable) 序列 (sequence) ,不可變的序列支援以下操作
操作 | 說明 |
---|---|
x in s | 判斷 x 是否是 s 的元素 |
x not in s | 判斷 x 是否不是 s 的元素 |
s + t | 回傳合併 s 與 t 的新序列 |
s * n n * s | 回傳將 s 複製 n 倍的新序列 |
s[i] | 取得 s 中索引值為 i 的元素 |
s[i:j] | 取得 s 中索引值為 i 到 j - 1 的子序列 |
s[i:j:k] | 取得 s 中索引值為 i 到 j - 1 間隔 k 的子序列 |
len(s) | 回傳 s 中的元素總量 |
min(s) | 回傳 s 中的最小值 |
max(s) | 回傳 s 中的最大值 |
str(object='') | 將 object 轉換成字串 |
str(object=b'', encoding='utf-8', errors='strict') | 將 bytes 或 bytearray 轉換成字串 |
s.index(x[, i[, j]]) | 回傳 s 中 x 的索引值,或是 x 在 i 到 j 之間的索引值 |
s.count(x) | 回傳 x 在 s 中的數量 |
如果兩個字串相鄰會直接連接,字串中結尾加上反斜線 (backslash) 可以跨行,例如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # 字串自動連接 a = "There is " "no spoon." print(a) # 跨行最後加上 \ b = 'There ' 'is\ no spoon.' print(b) # 判斷 a 與 b 是否相等 print(a == b) # 檔名: string_demo.py # 說明: 《Python簡易手冊》的範例 # 網址: http://kaiching.org # 作者: Kaiching Chang # 時間: 2024 年 3 月 |
習慣上如果要連接字串會用算術運算子中的加號,單元 12 - 算術運算子介紹這種用法。
設定變數 a 的字串為兩個相鄰字串
1 2 3 | # 字串自動連接 a = "There is " "no spoon." print(a) |
設定變數 b 除了兩個字串連接外,在第二個字串最後加上反斜線,讓這個字串跨到下一行
5 6 7 8 | # 跨行最後加上 \ b = 'There ' 'is\ no spoon.' print(b) |
Python 中程式碼可以在最後加上反斜線跨行,倒是註解 (comment) 中的反斜線依然是註解內容,所以註解不能用這種方式跨行。
最後用比較運算子 (comparison operator) 判斷變數 a 與 b 是否一樣,執行結果如下
> python string_demo.py |
There is no spoon. There is no spoon. True |
> |
單元 13 - 比較運算子介紹比較運算子。
以上兩個字串 a 與 b 雖然寫法不同,但是內容一樣。
字串中可以加入跳脫字元 (escape character) ,跳脫字元是反斜線加上指定符號,所有的跳脫字元跳脫序列 (escape sequence) ,主要是特殊符號,包括特殊字元、空白符號還包括 Unicode 字元,下例在字串中加入新行符號
1 2 3 4 5 6 7 8 9 10 11 | # 加入斷行符號 s = "There\n is\n no\n spoon." # 印出變數 s print(s) # 檔名: string_demo2.py # 說明: 《Python簡易手冊》的範例 # 網址: http://kaiching.org # 作者: Kaiching Chang # 時間: 2024 年 3 月 |
新行符號為反斜線 \ 加上英文小寫字母 n ,代表印出的時候這裡會斷行,執行結果如下
> python string_demo2.py |
There is no spoon. |
> |
字串中可以用以下的跳脫字元
種類 | 說明 |
---|---|
\\ | 反斜線 \ |
\' | 單引號 ' |
\" | 雙引號 " |
\a | ASCII 鈴聲 |
\b | ASCII 倒退鍵 |
\f | ASCII 換頁符號 |
\n | ASCII 新行符號 |
\r | ASCII 輸入鍵符號 |
\t | ASCII Tab 鍵符號 |
\v | ASCII 垂直 Tab 鍵符號 |
\ooo | 八進位的 Unicode 字元 |
\xhh | 十六進位的 Unicode 字元 |
至於字串的型態名稱為 str ,內建函數 (built-in function) str() 可以轉換引數 (argument) 為字串形式, len() 會回傳字串的長度,也就是字串的字元總數,舉例如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # 轉換成字串 print(type(str(11))) print(type(str(22.33))) print(type(str(10 + 11j))) # 計算字串中的字元個數 print(len("Hello")) print(len("Good")) print(len("Actually")) # 檔名: string_demo3.py # 說明: 《Python簡易手冊》的範例 # 網址: http://kaiching.org # 作者: Kaiching Chang # 時間: 2024 年 3 月 |
第 2 到 4 行分別轉換整數、浮點數及複數為字串,再用 type() 印出型態名稱,第 7 到 9 行分別計算三個字串的長度,此例執行結果如下
> python string_demo3.py |
<class 'str'> <class 'str'> <class 'str'> 5 4 8 |
> |
字串變數可以用索引值取得子字串,舉例如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # 建立字串變數 s = "There is no spoon." # 印出子字串 print(s[2]) print(s[6:8]) print(s[12:]) print(s[-6]) print(s[-6:-1]) # 檔名: string_demo4.py # 說明: 《Python簡易手冊》的範例 # 網址: http://kaiching.org # 作者: Kaiching Chang # 時間: 2024 年 3 月 |
索引值從 0 開始,所以第 5 行是取得字串變數 s 的第 3 個字元 e
5 | print(s[2]) |
索引值可以用冒號取得範圍,第 6 行表示取得索引值從 6 開始,到 8 - 1 的子字串,這會是單字 is
6 | print(s[6:8]) |
如果冒號後不加索引值,表示到字串結尾,例如第 7 行表示從索引值 12 到最後,這會是 spoon.
7 | print(s[12:]) |
索引值也可以是負數,負數就是字串結尾開始算,例如第 8 行索引值 -6 就是倒數第 6 個字元,這會是 s
8 | print(s[-6]) |
第 9 行則是負數索引值的範圍,注意一樣是由要取得子字串的索引值開始,最後則是最後一個要取得字元的索引值結束
9 | print(s[-6:-1]) |
此例執行結果如下
> python string_demo4.py |
e is spoon. s spoon |
> |
如果要讓跳脫字元沒有作用,這需要定義 r 前綴字串,舉例如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # 設定 raw 字串 s1 = r"\\\\" s2 = "\\\\" s3 = r"\n\b" # 印出字串 print(s1) print(s2) print(s3) # 檔名: string_demo12.py # 說明: 《Python簡易手冊》的範例 # 網址: http://kaiching.org # 作者: Kaiching Chang # 時間: 2024 年 3 月 |
由於字串中 \\ 表示單一個 \ ,如果是在 r 字串中就一樣是 \\ ,其他跳脫字元亦同,此例執行結果如下
> python string_demo12.py |
\\\\ \\ \n\b |
> |
參考資料
- https://docs.python.org/3/library/stdtypes.html#text-sequence-type-str
- https://docs.python.org/3/reference/lexical_analysis.html#literals
- https://docs.python.org/3/tutorial/introduction.html#text