字符串類型存儲的數據是字符串,字符串是一個由字符構成的序列。Python字符串是不可變的
不支持動態修改。本節將對字符串進行簡單介紹,包括字符串的定義方式、格式化、索引、切片
拼接、重復和成員歸屬等。
1.字符串的定義方式
1.1單行字符串
"hello"
'hello'
雙引號定義的字符串可以含有單引號,但是不能直接含有雙引號。同理,單引號定義的字符串
也不能直接含有單引號。這是因為Python解釋器會匹配先出現的一對引號,導致后面的內容無法處
理。錯誤做法示例如下。
'let's go'
此時代碼塊會出現錯誤高亮提示,運行時程序發生異常,異常類型為SyntaxError,表示語法錯
誤,異常信息如下。
File "/root/Python_03/main.py", line 1'let's go'^
SyntaxError: invalid syntax
要解決這個問題,可以對字符串中的單引號、雙引號等特殊字符進行轉義處理,即在特殊字符
前面加上轉義字符"\"。此時解釋器不再將特殊字符視為字符串的語法標志,而是將其與轉義字符視
為一個整體。具體示例如下。
'let\'s go'
常用轉義字符表
轉義字符 | 說明 | 轉義字符 | 說明 |
---|---|---|---|
\(在行尾時) | 續行符 | \t | 橫向制表符 |
\\ | 反斜杠符 | \b | 退格 |
\' | 單引號 | \r | 回車 |
\" | 雙引號 | \f | 換頁 |
\n | 回車換行 | \a | 響鈴 |
如果需要忽略字符串中的轉義字符,則可以在字符串的前面添加r或者R。例如,要打印某個文
件的路徑“C:\Windows\tracing”,其中“t”構成了一個轉義字符,導致字符串輸出格式不符合預期,
此時在字符串前加r或R即可忽略轉義字符的原有作用。
在字符串前使用r或R。
print('C:\Windowstracing') #轉義字符起作用
print(r'C:\Windows\tracing') #在字符串前加r
運行結果如下。
C:\Windows racing
C:\Windows\tracing
編程建議:字符串的定義可以選擇單引號或雙引號,建議在編程中統一使用其中一種。一般情況下,雙引號在面對縮寫和所有格時更加友好,例如,“Lets”或“Im”,無須變換引號形式或使用轉義字符。如果字符串包含引號,應當優先使用另一種形式的引號來包含字符串,而非使用轉義字符。
1.2多行字符串
多行字符串由一對三引號包含,可以是三單引號也可以是三雙引號。三引號中包含的所有字符
都屬于字符串內容,包括空格、換行等。三引號中可以包含單引號、雙引號,無須轉義,所有字
均以原始形態打印出來,所見即所得。
打印圣誕樹。
print("""
"這是一個圣誕樹"*********
************""")
運行結果如下
"這是一個圣誕樹"*********
************
2.字符串格式化
字符串格式化是指預先制定一個帶有空位的模板,然后根據需要對空位進行填充。例如,預先制定一個模板“一年的_學期我學習了_門課程”,然后在下面線的位置填充內容,可以用以下代碼實現。
print("{}年的{}學期我學習了{}門課程".format(2022,"上",20))
輸出結果如下。
2022年上學期我學習了20門課程
2.1 format()方法的基本用法
應關系替換到這些空位上。如果“(}”中沒有序號,則按照出現的順序進行替換.
?2.2 format()方法的格式處理
format()方法的模板字符串的空位中不僅可以填寫參數序號,還可以有其他的格式處理形式,此
時空位的樣式如下。
(參數序號:格式處理內容}
格式處理內容要按照以下順序使用。
(1)填充:填充單個字符,不指定時用空格填充。
(2)對齊:“<”為左對齊,“>”為右對齊,“^”為居中對齊。
(3)符號:“+”表示在正數前加正號,負數前加負號;“-”表示正數不變,負數加負號;空格表示正數加空格,負數加負號。
(4)寬度:指定空位所占寬度。
(5)分隔符:用逗號“,”分隔數字的千位,適用于整數和浮點數。
(6)精度:用“.precision”指定浮點數的精度或字符串輸出的最大長度,如“.5”
(7)類型:用于指定類型,如表所示。
類型 | 說明 |
---|---|
a | 對字符串類型格式化 |
b | 將整數輸出為對應的二進制數 |
c | 將整數輸出為對應的Unicodc字符 |
d | 將整數輸出為對應的十進制數 |
o | 將整數輸出為對應的八進制數 |
x或X | 將整數輸出為對應的小寫或大寫的十六進制數 |
e或E | 將浮點數輸出為e或E的指數形式 |
f | 將浮點數標準輸出 |
% | 輸出浮點數的百分比形式 |
格式化輸出學生信息。
name ="張三"
studentId="202201"
#用-占位,寬度為10,姓名和學號居中
print("我叫{0:-^10},學號為(1:-^10}".format(name,studentId))
運行結果如下。
我叫----張三----,學號為--202201--
3.f字符串
Python 3.6提供了一種新的格式化字符串的方法——f-strings,即f字符串。f字符串的格式化處理與format()方法類似,但語法比其簡潔。Python 3.6及以后的版本推薦使用f字符串進行字符串的格式化。f字符串用花括號“{}”表示被替換的字段。
f字符串的使用。
name ="張三"
studentId="202201"
print(f"我叫(name),學號為(studentId}")
運行結果如下。
我叫張三,學號為202201
4.字符串的索引與切片
字符串是一個不可變的字符序列,每個字符都有其編號,也稱為索引。Python的索引從0開始遞增,字符串的第1個字符的索引為0,第2個字符的索引為1,以此類推;索引也可以是負數,字符串的最后1個字符的索引為-1,倒數第2個字符的索引為-2,如圖所示。、
s | t | u | d | y | h | a | r | d | |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
-10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 |
根據索引可以獲取字符串中的字符,例如,獲取“study hard”中的字符“h”,可以通過以下代碼實現。
word = "study hard"
word [6]
word [-4]
Python提供了len()函數計算字符串的長度,語法格式如下。
len(string)
其中string為要進行長度計算的字符串。
計算字符串“study hard”的長度。
length = len("study hard")
print(length)
運行結果如下。
10
len()函數在計算字符串長度時,不區分字母、漢字、數字、標點和特殊字符等,例如,字符串“學習Python使我快樂!#¥”,用len0)函數計算其長度,“學”“p”“!”“#”等各占一位,字符串長度為15。
字符串切片是指從字符串中截取部分字符組成新的字符串,且不會使原字符串產生變化,其語
法格式如下。
sname[start :end :step]
參數說明
參數 | 說明 |
---|---|
sname | 字符串名稱 |
start | 切片開始的位置(包括此位置),不指定時默認為0 |
end | 切片結束的位置(不包括此位置),不指定時默認為序列的長度 |
step | 切片的步長,不傳值時默認為1,最后的冒號也可以省略 |
字符串的切片。
sname ="學習Python使我快樂" #共12個字符
print("sname[:]:",sname[:]) #取到字符串所有字符
print("sname[3:8]:",sname[3:8]) #默認步長為1
print("sname[:8]:"sname[:8]) #默認從索引0開始,步長為1
print("sname[3:]: ",sname[3:]) #默認到字符串末尾,步長為1
print("sname[3:8:2]:",sname[3:8:2]) #設置步長為2
print("snamel:-4]:"sname[:-4]) #索引0到-4,不含-4
print("sname[-8:-3:2]:",sname[-8:-3:2]) #索引-8到-3,不含-3,步長為2
print("sname[8:3:-2]:"sname[8:3:-2]) #索引8到3,不含3,步長為-2
運行結果如下。
sname[:]:學習Python使我快樂
sname[3:8l:ython
sname[:8]:學習Python
sname[3:]:ython使我快樂
sname[3:8:2]:yhn
sname[:-4]:學習Python
sname[-8:-3:2]:to使
sname[8:3:-2]:使ot
5.字符串的拼接與重復
5.1.字符串拼接
使用“+”可以實現字符串拼接,將多個字符串連接起來并產生一個字符串對象。
name ="張三”
action ="吃了早飯"
print(name + action)
運行結果如下。
張三吃了早飯
這種機制只能用于字符串類型之間的拼接,否則就會發生異常。
例如.字符串類型與整型的拼接。
str1 ="我今天吃了"
num = 3
str2="碗飯"
print(strl +num + str2)
此時程序異常,異常類型為TypeError,表示類型錯誤,異常信息如下,
Traceback (most recent call last):File "c:\1000phone\test.py",line 4,in <module>print(strl +num + str2)
TypeError: can only concatenate str(not "int") to str
可以用str()函數和repr()函數解決此類問題。str(0函數和repr()函數是將對象轉換為字符串類型的
種機制:str()函數會將對象轉換為合理形式的字符串,以便用戶理解;而repr()函數會創建一個字
串,用合法的Python表達式來表示對象,以供Python解釋器讀取。
str()函數及repr()函數的使用。
action ="Hi,1000phone"
print("str()函數處理后:"+str(action))
print("repr()函數處理后:"+repr(action))
strl="我今天吃了"
num =3
str2="碗飯"
print("用str()函數實現字符串拼接:"+str1+str(num)+ str2)
運行結果如下。
str()函數處理后:Hi,1000phone
repr()函數處理后:'Hi,1000phone'
用str()函數實現字符串拼接:我今天吃了3碗飯
針對字符串,Python語言提供了幾個基本操作符
操作符 | 描述 |
---|---|
x + y | 連接兩個字符串 x 與 y |
x * n 或 n * x | 復制 n 次字符串 x |
x in s | 如果 x 是 s 的子串,返回 True ,否則返回 False |
5.2.重復字符串
使用“*”可以將字符串重復多次。
print("study"* 5)
運行結果如下。
studystudystudystudystudy
6.字符串的成員歸屬
字符串的成員歸屬需要用到成員運算符,成員運算符能夠判斷指定序列是否包含某個值。Python
的成員運算符包括in和not in,詳細說明如下。
(1)in:如果在指定序列中找到值,返回True,否則返回False。
(2)not in:如果在指定序列中沒有找到值,返回True,否則返回False.
査找字符串是否含有某字符。
sentence ="i want to eat meat"
print("e在sentence中:","e" in sentence)
print("e不在sentence中:","e" not in sentence)
運行結果如下。
e在sentence中:True
e不在sentence中: False
實例解析:愷撒密碼
?
1.愷撒密碼-加密
ptxt = input("請輸入明文文本: ")
for p in ptxt:if "a" <= p <= "z":print(chr(ord("a")+(ord(p)-ord("a")+3)%26), end='')
elif "A" <= p <= "Z":print(chr(ord("A")+(ord(p)-ord("A")+3)%26), end='')
else:print(p, end='')
運行結果如下。
請輸入明文文本: This is an excellent Python book.
Wklv lv dq hafhoohqw Sbwkrq errn.
2.愷撒密碼-加密
etxt = input("請輸入加密后文本: ")
for p in etxt:if "a" <= p <= "z":print(chr(ord("a")+(ord(p)-ord("a")-3)%26), end='')
elif "A" <= p <= "Z":print(chr(ord("A")+(ord(p)-ord("A")-3)%26), end='')
else:print(p, end='')
運行結果如下。
請輸入加密后文本: Wklv lv dq hafhoohqw Sbwkrq errn.
This is an excellent Python book.