由于字符串過于重要,請認(rèn)真看完并保證所有代碼都至少敲過一遍。
對于字符串,前面在數(shù)據(jù)類型中已經(jīng)提到過。但是由于字符串類型太過于常用,Python 中提供了非常多的關(guān)于字符串的操作。而我們在實際編碼過程中,又經(jīng)常會與字符串打交道。所以這里字符串單獨列出一節(jié)來講解。
字符串是由一對引號(單雙引號都可以)括起來進行標(biāo)識。字符串的數(shù)據(jù)類型是 str , 同時字符串也是一種序列。
定義一個字符串:
>>> s = 'nemo'
>>> s1 = '中文'
>>> s2 = "Python 極簡教程"
>>> s3 = ''' # 多行字符串,用三對引號(三個單引號或者三個雙引號)
Python 極簡教程
希望大家多提意見
順便點個喜歡
'''
字符串操作
字符串的操作有很多與列表類似,因為字符串和列表同樣都是序列。
1. 字符串相加(拼接)
>>> s = '懶貓'
>>> s1 = 'nemo'
>>> s + s1
'懶貓nemo'
2. 字符串乘法
>>> s = 'nemo'
>>> s * 3
'nemonemonemo'
3. 成員運算
>>> ms = 'n'
>>> s = 'nemo'
>>> ms in s
True
>>> 'x' in s
False
>>> 'x' not in s
True
# 也可以判斷連續(xù)字符串
>>> 'em' in s
True
4. 通過索引取字符
字符串通過索引取字符的方式與列表中的取值相同。字符串中的每個字符相當(dāng)于字符串的每個元素,索引從0開始。
>>> s = 'nemo'
>>> s[1]
'e'
格式化字符串
1. 使用 % 格式化
格式化字符串,本義是在打印的時候可以將打印出來的字符串格式化后輸出(控制臺,也就是打印語句的輸出),這樣字符串看起來更加整潔美觀。
但是實際編碼過程中,很少直接通過控制臺輸出,所以更多的時候,格式化字符串用來將字符串中的部分字符串用參數(shù)代替。
例如,從鍵盤接收兩個輸入,分別是姓名和愛好,然后輸出* x 的愛好是 y *(x 用輸入的姓名代替,y 用輸入的愛好代替)
name = input('請輸入姓名:')
fondness = input('請輸入愛好:')
print('%s 的愛好是 %s !' % (name, fondness))
以上代碼,用 IDLE 新建一個文件,運行效果更好。
'%s 的愛好是 %s !' % (name, fondness)上面的
%s 的愛好是 %s !就是格式化字符串,%為占位符,s表示占位的數(shù)據(jù)格式為字符串。
引號后面的%為固定格式
(name, fondness) 是實際的參數(shù),需要和前面的 % 數(shù)量一致,數(shù)量不一致就會報錯。如果只有一個 % 就不需要括號
# 只有一個參數(shù)的情況
>>> name = 'nemo'
>>> '你的名字是 %s!' % name
'你的名字是 nemo!'
# 還可以先存起來,后面再賦值
>>> s = '你的名字是 %s!'
>>> s % 'nemo'
'你的名字是 nemo!'
其他還有很多格式化的用法,因為實際使用比較少,這里就不再贅述。有興趣的可以查閱相關(guān)資料。
2. 使用 format 函數(shù)
format 函數(shù)是 Python 官方目前主推的格式化用法。但是同樣我們實際很少需要在控制臺上輸出,因此主要還是用它來進行字符串內(nèi)部字符的參數(shù)化。
format 函數(shù)的占位符為 {},可以是空的 {},后面實際賦值的時候按照 {} 出現(xiàn)的順序依次賦值。也可以在 {} 中加上索引,如{0},{1}等,0 代表后面的第一個實際值,1為第二個,依次類推。還可以在 {} 中加上名稱, 如 {name}, {fondness},那么會以該名稱賦值。
示例如下:
# 以三種方式修改上面的例子
#1. 空的 {} 占位
name = input('請輸入姓名:')
fondness = input('請輸入愛好:')
print('{} 的愛好是 {}!'.format(name, fondness)) # 寫法上注意一下 字符串.format()
#2. 加上索引
name = input('請輸入姓名:')
fondness = input('請輸入愛好:')
print('{1} 的愛好是 {0}!'.format(fondness, name)) # 故意更換了一下位置,對比一下
#3. 加上名稱
name = input('請輸入姓名:')
fondness = input('請輸入愛好:')
print('{n} 的愛好是 {f}!'.format(f=fondness, n=name)) # 前面 {} 加了名字,在后面就寫成 名稱=值(變量)
上面的例子,故意調(diào)整了一下順序和名稱,自己動手練練,感受一下。
3. f 字符串
f-string是 Python 3.6 中定義的一種參數(shù)化字符串的方式,主要是讓格式化字符串更加便捷。
在 f-string 中,不要再使用 %-格式化 或者 format 函數(shù)中的復(fù)雜寫法,可以直接在字符串中寫入變量名。f-string 用 {} 標(biāo)識變量,區(qū)別在于 {} 不再是用來占位的,而是直接寫入變量名。
修改上面的格式化例子:
name = input('請輸入姓名:')
fondness = input('請輸入愛好:')
print(f'{name} 的愛好是 {fondness}!') # 字符串前面的 f 大小寫均可
除此之外,還可以在f-string中使用函數(shù)和表達(dá)式:
# 顯示當(dāng)前時間
>>> import time # 引入時間庫
>>> print(f'當(dāng)前時間是 {time.ctime()}!') # time.ctime() 為顯示當(dāng)前時間的函數(shù)
當(dāng)前時間是 Tue Mar 19 23:30:49 2019!
# 直接在字符串中進行運算
>>> x = 10
>>> y = 5
>>> F'x + y = {x+y}'
'x + y = 15'
可謂非常方便實用,而且據(jù)說速度優(yōu)于其他的格式化方式。
r 字符串
字符串中如果出現(xiàn) 反斜杠 \會出現(xiàn)一些不同的意思,比如\n表示換行,\t制表符(Tab)等等,如果你想表示一個 Windows 路徑的時候,比如C:\test\nemo,那么實際打印的時候會變成如下的樣式:
>>> path = 'C:\test\nemo.txt'
>>> print(path)
C: est
emo.txt
如果是操作文件的時候,就會出現(xiàn)各種異常。因此為了避免其中的特殊字符造成字符串不是原來的意思,我們可以使用 r(大小寫都可以)來將字符串中的特殊字符全部定義為普通字符。
>>> path = r'C:\test\nemo' # r 寫在字符串第一個引號前面
>>> print(path)
C:\test\nemo
字符串常用內(nèi)置方法
以下僅列出較為常用的內(nèi)置方法,其余方法請參考其他資料。(寫太多不常用的內(nèi)容,就稱不上極簡教程了)
注意:其中部分極少使用的默認(rèn)參數(shù)也已去掉
下面這些方法非常常用,需要背下來,就算不能背下來,至少要知道有這些方法。
| 方法 | 說明 |
|---|---|
| str.strip() | 刪除字符串前后空格 |
| str.replace(old, new) | 把將字符串中的 old 替換成 new |
| str.join(seq) | 以指定字符串作為分隔符,將 seq 中所有的元素合并為一個新的字符串 |
| str.split(obj) | 以 obj 為分隔符切割字符串,生成一個列表 |
| str.find(obj) | 檢測 obj 是否包含在字符串中 str中,如果 beg 和 end 指定范圍,則檢查是否包含在指定范圍內(nèi),如果是返回開始的索引值,否則返回-1 |
| str.index(obj) | 跟find()方法一樣,只不過如果str不在字符串中會報一個異常 |
| string.startswith(obj) | 檢查字符串是否是以 obj 開頭。是則返回 True,否則返回 False |
| string.endswith(obj) | 檢查字符串是否以 obj 結(jié)束,如果beg 或者 end 指定則檢查指定的范圍內(nèi)是否以 obj 結(jié)束。如果是,返回 True,否則返回 False |
| string.upper() | 轉(zhuǎn)換 string 中的小寫字母為大寫 |
| string.lower() | 轉(zhuǎn)換 string 中所有大寫字符為小寫 |
1. str.strip() 去前后空格
我們在進行登錄的時候,偶爾手抖在賬號前或后輸入了一個空格,也能登錄成功;有些系統(tǒng)又不行。之所以能登錄成功,其實是因為開發(fā)人員做了處理,幫你去掉了不小心在賬號前后輸入的空格。這就是 strip 這個方法的用途。
>>> s = ' nemo ' # 前后有空格
>>> s.strip()
'nemo'
2. str.replace(old, new) 替換
字符串替換,用于將字符串中的某部分內(nèi)容替換成新的字符串。
# 將下面字符串中的'+'加號,替換成','逗號。
>>> s = 'MP3+pdf+doc+txt'
>>> s.replace('+', ',') # 被替換的字符串在前,替換后的字符串在后
'MP3,pdf,doc,txt'
3. str.join(seq) 字符串組合
字符串組合,是將列表中的字符串元素組合成一個完整的字符串。使用指定的字符串來分隔組合好的字符串。
這個方法是比較容易出錯的,組合的字符串在'.'前面,列表是作為參數(shù)放在括號中。
# 比如列表中有多個單詞,想組成一句話
>>> words= ['it', 'was', 'the', 'season', 'of', 'Light']
>>> ' '.join(words) # 用空格分隔,空格要放在前面
'it was the season of Light'
# 小練習(xí) 1
>>> li = ['a', 'b', 'c'] # 組合成 a_b_c
>>> face = ['*', '_', '*'] # 組合成 *_*
注意,列表中必須全部是字符串,如果存在其他數(shù)據(jù)類型則會報錯。
4. str.split(obj) 切割字符串
以傳入的obj 為分隔符切割字符串,生成一個列表。七號和上面的 join 方法是反過來的。
比如:
# 將下面的英文句子拆分為單個的英文的單詞
>>> s = 'this is a pig'
>>> s.split() # 默認(rèn)按空格進行拆分
['this', 'is', 'a', 'pig'] # 拆出后的結(jié)果是一個列表
# csv文件是以逗號分隔的一種文件格式。將下面以逗號分隔的內(nèi)容拆分成一個列表
>>> s = '張三,男,30,170'
>>> s.split(',') # 按逗號拆分,括號中把逗號作為字符串傳入
['張三', '男', '30', '170']
# 小練習(xí) 2
# 1. 從鍵盤接收一組數(shù)字輸入,數(shù)字以逗號分隔。返回這一組數(shù)字中的最大最小值
# 2. 從鍵盤接收一組數(shù)字,數(shù)字以空格分隔。反向后輸出
5. 字符串查找
str.find(obj)
從左邊開始查找整個字符串,返回找到匹配的字符的起始位置索引。如果找不到則返回 -1。
>>> s = 'it was the season of Darkness'
# 找到其中 of 所在的索引
>>> s.find('of') # 找到則返回 of 開始的索引值
18
>>> s.find('nemo') # 找不到返回 -1
-1
str.index(obj)
查找的結(jié)果與 find 方法一樣。不同的是,找不到的時候,會報錯。
>>> s = 'it was the season of Darkness'
# 找到其中 of 所在的索引
>>> s.index('of')
18
>>> s.index('nemo')
ValueError: substring not found # 報子串不存在的錯誤
6. 字符串判斷
用于判斷字符串是否以什么開頭或者以什么結(jié)尾。
str.startswith(obj)
檢查字符串是否是以指定的obj字符串開頭。是則返回 True,否則返回 False
>>> s = 'it was the season of Darkness'
>>> s.startswith('it') # 注意 startswith,start 后面有個 s,starts
True
>>> s.startswith('ness')
False
str.endswith(obj)
檢查字符串是否是以指定的obj字符串結(jié)尾。是則返回 True,否則返回 False
>>> s = 'it was the season of Darkness'
>>> s.endswith('ness') # 注意 endswith,end 后面也有個s
True
>>> s.endswith('it')
False
7. 大小寫轉(zhuǎn)換
string.upper()
把字符串中的小寫字母全部轉(zhuǎn)換成大寫字母。
>>> s = 'nEmO'
>>> s.upper()
'NEMO'
str.lower()
把字符串中的大寫字母全部轉(zhuǎn)換成小寫字母。
>>> s = 'nEmO'
>>> s.lower()
'nemo'
# 小練習(xí) 3
# s = 'NemO'
# s == 'nemo' 改造這個等式,使之返回 True
小練習(xí)答案:
# 小練習(xí) 1 >>> li = ['a', 'b', 'c'] # 組合成 a_b_c >>> '_'.join(li) >>> face = ['*', '_', '*'] # 組合成 *_* >>> ''.join(face) # 小練習(xí) 2 # 1. 從鍵盤接收一組單詞,以逗號分隔。返回這一組單詞中的最大最小值 >>> s = input('請輸入一組單詞,以逗號分隔:') 請輸入一組單詞,以逗號分隔:nemo,leo,nano,aux >>> li = s.split(',') >>> max(li) 'nemo' >>> min(li) 'aux' # 2. 從鍵盤接收一組數(shù)字,數(shù)字以空格分隔。將順序反向后輸出 >>> s = input('請輸入一組數(shù)字,以空格分隔:') 請輸入一組數(shù)字,以空格分隔:31 25 14 8 11 >>> li = s.split() >>> li.reverse() >>> ' '.join(li) '11 8 14 25 31' # 小練習(xí) 3 # s = 'NemO' # s == 'nemo' 改造這個等式,使之返回 True >>> s.lower() == 'nemo' # 這也是實現(xiàn)字符串忽略大小寫的寫法 >>> s == 'nemo'.upper()