2.4. 字串

字串(string)是一連串寫在引號之間的 Unicode 字元。單引號與雙引號是等效的——選擇能讓你避免跳脫文字內部引號的那種風格:

name    = "OpenMV Cam"
company = 'OpenMV, LLC'
message = "She said \"hi\""        # both styles can be used
same    = 'She said "hi"'

三引號字串("""..."""'''...''')可橫跨多行,並原樣保留其中的換行字元:

banner = """boot ok
firmware v1.28
"""
print(banner)

輸出:

boot ok
firmware v1.28

2.4.1. 跳脫序列

在一般字串內,\ 用來引入一個特殊字元:

  • \n —— 換行

  • \t —— 定位字元(tab)

  • \\ —— 一個實際的反斜線

  • \' / \" —— 一個實際的引號(用於否則會結束字串的情況)

  • \xHH —— 十六進位碼為 HH 的字元

  • \uHHHH —— Unicode 碼位 HHHH

當字串包含許多反斜線時,在字面值前加上 r 使其成為 原始(raw)字串。此時反斜線會被視為實際字元——\n 維持兩個字元的長度,而不會被取代為換行:

win_path = r"C:\Users\OpenMV\camera.py"
literal  = r"\n is two characters, not a newline"

2.4.2. 串接與重複

兩個字串以 + 連接;字串以 * 重複:

greeting = "Hello, " + name + "!"
line     = "-" * 40              # 40-character separator

在迴圈中反覆使用 + 會在每次迭代時配置一個全新的字串。若要從許多片段組建較大的字串,請使用 str.join()

2.4.3. 長度、索引與切片

len() 會回傳字串中的字元數。以 [] 索引會回傳指定位置上的單一字元字串;負索引則從尾端往回計數:

>>> s = "OpenMV"
>>> len(s)
6
>>> s[0]
'O'
>>> s[-1]
'V'

切片(slice)s[start:stop] 會回傳從位置 start 起、但不包含 stop 的子字串。任一端皆可省略,分別表示「開頭」或「結尾」,而可選的第三個值 s[start:stop:step] 則讓你略過字元。

字串「OpenMV」在每個字元之間標有位置標記, 說明切片如何選取兩個位置之間的 字元。

切片位置位於字元 之間s[2:5] 會選取位置 2、3 與 4 上的字元。

>>> s = "OpenMV"
>>> s[2:5]
'enM'
>>> s[:3]
'Ope'
>>> s[3:]
'nMV'
>>> s[::-1]
'VMnepO'                     # whole string, reversed

超出範圍的切片會默默地回傳實際存在的部分——s[100:200] 會是空字串 "",而不是錯誤。另一方面,索引超出範圍則會引發 IndexError

2.4.4. 不可變性

字串無法就地修改。看起來像是在變更字串的操作,實際上會回傳一個新字串,而原字串保持不變:

>>> name = "OpenMV"
>>> name.upper()
'OPENMV'
>>> name
'OpenMV'                     # unchanged

若要「變更」字串,請將名稱重新繫結到新值:name = name.upper()