Python 極簡教程(八)字符串 str

由于字符串過于重要,請認(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()      

下一篇 元組

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容