使用者:Xyy23330121/Python/字符串
本早在第一章就接觸過了字符串,在本章,我們將進一步學習對字符串的一些操作。
創建字符串
編輯我們之前提到過,字符串是前後以單引號'
或雙引號"
括住的文本內容。比如以下的方式:
a = "示例字符串A"
print(a) #输出:示例字符串A
b = '示例字符串B'
print(b) #输出:示例字符串B
c = ''
print(c) #不包含字符的空字符串,输出仅仅是一个空行。
我們接下來介紹一些其它方法。
多行字符串
編輯用連續的三個單引號,或連續的三個雙引號括起來的字符串為多行字符串。我們看以下示例:
if True:
a = '''多行
字符
串'''
b = """多
行字符串"""
print(a)
print(b)
輸出:
多行
字符
串
多
行字符串
語句組對縮進比較嚴格,但多行字符串不同。多行字符串不需要縮進,它會把行首的空格和行尾的換行符都作為字符保存在字符串裡面。
用作注釋
編輯Python 可以把字符串直接作為語句,從而可以作為注釋。多行字符串因此也常用於多行注釋,比如:
'''
注释
注释
'''
"""
注释
注释
"""
長字符串的美觀寫法
編輯一個字符串可以包含很多字符,當字符串過長時,整段代碼都會很難閱讀。編輯器一般是不會進行自動換行的,因此,長字符串在編輯器中顯示的效果會像這樣:
這對於在編輯器中修改字符串內容、尤其是字符串末尾內容造成了非常大的不方便。Python 提供了多種方法來解決這個問題。
利用括號
編輯Python 會將相鄰的兩個字符串自動拼接。比如:
a = "1" "2" #等同于:a = "12"
利用這個特性,以及我們之前討論語句組和縮進時提到過的、括號的作用。可以做到:
if True:
print("哼 哼 哼啊啊啊啊啊啊啊啊啊啊啊啊啊"
"啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊"#注释
"啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊"
"啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊"
"啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊"
"啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊"
"啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊"
"啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊")
另一個忽略換行符的方法
編輯當一行代碼過長時,我們可以在行尾添加反斜槓\
來忽略換行符。和括號相同,此時下一行代碼和上一行的代碼會被視為是在同一行。
if True:
a = "1"\
"2" #等同于:a = "12"
b = 1\
+ 2 #等同于:b=1 + 2
一定要注意,反斜槓必須在行尾最末端——連空格都不能有,因此需要添加反斜槓的行是無法添加注釋的。這和括號的方法是不一樣的。比如,以下代碼會報錯:
b = 1\#在这里添加注释的话,就会报错。
+ 2
由於視覺上很難查出反斜槓後面有沒有空格,在防止出錯以及添加注釋的方面,括號是更好用的方式。
利用函數生成字符串
編輯和前面學到過的int
對象和int
函數相似。也可以用str
函數生成字符串對象。str
函數生成的字符串在一般情況下和print
函數輸出的內容一模一樣。
print(str(1))
print(1)
str
函數支持將幾乎任何類型轉化為字符串。其用法和int
函數是完全類似的。不再贅述。
轉義字符
編輯轉義字符 | 含義 |
---|---|
\ |
(用在行末)取消接下來的回車。 |
\\ |
倒斜槓(\) |
\' |
單引號(') |
\" |
雙引號(") |
\a |
響鈴(BEL) |
\b |
退格(BS) |
\f |
換頁(FF) |
\n |
換行(LF) |
\r |
回車(CR) |
\t |
橫向制表符(TAB) |
\v |
縱向制表符(VT) |
\ooo |
八進制數ooo 所表示的字符
|
\xhh |
二位十六進制數hh 所表示的字符
|
\N{name} |
Unicode 數據庫中,名為name 的字符,name 可以為別名。有些別名不被支持。
|
\uxxxx |
四位十六進制數xxxx 所表示的字符
|
\Uxxxxxxxx |
八位十六進制數xxxxxxxx 表示的字符
|
在創建字符串時,有的字符不方便被直接放在字符串里。比如,如果我們希望字符串中的文本是"Let's go!", he said.
,如果把它直接放在引號裡面,它就會變成:
'"Let's go!", he said.'
""Let's go!", he said."
很顯然這是會報錯的。為了應對這些字符,我們有轉義字符。所有轉義字符的列表見右表。
參照右邊的列表,為了輸入引號,我們把上面的內容改寫為:
'"Let\'s go!", he said.'
"\"Let's go!\", he said."
此時就不會報錯。
我們將在下面討論幾個特殊的轉義字符。
(用在行末)取消接下來的回車
編輯由於多行字符串首行依舊需要縮進,上面示例的多行字符串並不容易閱讀。但是如果用:
if True:
b = """
多
行字符串"""
又會在字符串開頭留下一個換行符。對此,Python 提供了一個解決方法:
if True:
b = """\
多
行字符串"""
我們可以用這種轉義方法「消滅」掉多行字符串中的換行符,以保證代碼美觀易讀。
這種方法也可以用於單行字符串:
if True:
b = "单行\
字符串"
也是合法的。與之前的討論相同,此時,在行尾使用了\
的行,不能在後面添加注釋。
Unicode 字符
編輯轉義字符列表中,比如 \ooo
等,都是按 Unicode 碼表中的字符碼位來表示的。比如,我們查到 U+0026 是 &
字符。我們就可以用以下幾種方式輸出 &
字符:
print('\046') #三位八进制数字,046对应的就是十六进制的26
print('\x26') #二位十六进制数字
print('\u0026') #四位十六进制数字
print('\U00000026') #八位十六进制数字
關於 Unicode 碼表,可以查閱維基百科的Unicode碼表頁面。
除上述方法與 Unicode 有關以外, \N{name}
也和 Unicode 有關。依舊用上面的 &
字符。我們在 Unicode 標準中查到該字符的名稱是 AMPERSAND ,於是以下方式也可以輸出 &
字符:
print('\N{AMPERSAND}')
字符串和運算符
編輯字符串支持兩種運算:字符串之間的加法和字符串與整數的乘法。我們看以下示例:
print('AB' * 3) #ABABAB
print('AB' + 'BA') #ABBA
print('A' * 3 + "b") #AAAb
字符串之間的加法會返回兩個字符串按順序拼接後的字符串。而字符串和整數n
的乘法會將字符串自身重複 n 次。
字符串和索引
編輯我們可以通過「索引」來提取字符串中的一部分。比如:
string = "python"
print(string[0]) #输出:p
print(string[-1]) #输出:n
print(string[1:3]) #输出:yt
print(string[:3]) #输出:pyt
print(string[5:]) #输出:n
整數索引
編輯如果以整數為索引,Python 會輸出字符串中對應索引位置的單一字符組成的字符串。以上面字符串為例,以下表格可能會對整數索引有所幫助:
順序 | 0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|---|
字符串 | p | y | t | h | o | n |
逆序 | -6 | -5 | -4 | -3 | -2 | -1 |
根據上表,"python"[2]
和"python"[-4]
的結果都是't'
。
任何超出字符串長度的下標都會報錯,比如"python"[6]
會報錯:
IndexError: string index out of range
slice索引
編輯格式類似 start:end
的索引會返回從 start
到 end
範圍內的字符組成的子字符串。以下拓展後的表格可能會對此類索引有所幫助:
順序 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|---|
字符串 | p | y | t | h | o | n | |
逆序 | -6 | -5 | -4 | -3 | -2 | -1 |
若以 -5: 4
為索引,就會輸出從索引為 -5 開始,到索引為 4 為止的子字符串 "yth"
(不包含索引為 4 的 "o"
)。
與整數索引不同,這裡 start
和 end
可以是任意整數,比如:
- 若以
-7: 13
為索引,就會輸出完整的字符串"python"
。 - 若以
2: -6
為索引,就會輸出空字符串""
。
同時,可以不輸入 start
或 end
,比如:
- 若以
2:
為索引,就會從索引為 2 開始,一直到結尾的子字符串"thon"
。 - 若以
:-4
為索引,就會輸出從字符串的開頭開始,一直到索引為 -4 的子字符串"py"
。 - 若以
:
為索引,就會輸出完整的字符串"python"
。
slice 索引還支持以start:end:step
的格式輸入第三個非 0 整數step
。比如:
- 若以
1:6:2
為索引,就會輸出由索引為 1、3、5 的字符構成的字符串"yhn"
。 - 若以
6:1:-2
為索引,由於索引為 6 的字符不存在,向下找最接近的字符,即索引為 5 的n
。輸出由索引為 5、3 的字符構成的字符串"nh"
。
加入 step
之後,start
或 end
依舊可以省略。若 step > 0
,且不輸入 start
,則相當於使用 start = 0
。若 step < 0
且不輸入 start
,則相當於使用 start = -1
。
step
也是可以省略的,比如設置索引為 ::
。此時,默認step = 1
。
原始字符串
編輯原始字符串是另一種創建字符串的方法。用這種方法創建的字符串,其中的內容都不會被轉義。使用原始字符串的方法,是在字符串的引號前加入r
或者R
,比如:
print(r'C:\Users\Public')
print(r"C:\Users\Public")
print(R'''C:\Users\Public''')
print(r"""C:\Users\Public""")
運行的結果為:
C:\Users\Public
C:\Users\Public
C:\Users\Public
C:\Users\Public
可以看出,其中所有的反斜槓\
都沒有參與轉義。這種方法有一個限制:原始字符串不能以奇數個\
字符結束。為此,我們有一些繞過它的方法:[1]
print('C:\\this\\will\\work\\') #不使用原始字符串
print(r'C:\this\will\work' '\\') #相邻字符串自动拼接
如果讀者讀了本章上面列出來的文檔,會發現除了 r
之外,還有 u
、f
、rf
(等同於 fr
)和 b
、br
(等同於 rb
)幾種字符可以用作前綴。關於b
用作前綴的情況,參見之後的選學章節。關於 f
、rf
用作前綴的情況,參見格式化字符串章節。
u
用作前綴的情況來自於 Python 2.x 版本。之所以支持 u
用作前綴,只是為了方便將代碼從 Python 2.x 升級到 Python 3,讀者不必學習這些過時代碼。