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] 則讓你略過字元。
切片位置位於字元 之間。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()。