Hi, 大家好。我是茶桁。
前幾節(jié)課中我們學(xué)習(xí)了函數(shù),那么這節(jié)課開始腺怯,我們花幾節(jié)課返過頭來詳細(xì)的學(xué)習(xí)一下Python內(nèi)的數(shù)據(jù)類型呛占。第一節(jié)課,讓我們先從字符串開始:
- 回顧字符串的定義方式
- 了解轉(zhuǎn)義字符
- 字符串格式化的方法
- 字符串相關(guān)函數(shù)
字符串的定義方式
- 單引號(hào)定義字符串
‘ ’
- 雙引號(hào)定義字符串
“ ”
- 三引號(hào)定義字符串
‘’‘內(nèi)容’‘’
或者“”“內(nèi)容”“”
- 字符串定義時(shí)鉴未,引號(hào)可以互相嵌套
轉(zhuǎn)義字符
一個(gè)普通的字符出現(xiàn)在轉(zhuǎn)義符
\
的后面時(shí)级及,實(shí)現(xiàn)了另外一種意義其骄。
-
\
轉(zhuǎn)義符亏镰,續(xù)行符。
作為轉(zhuǎn)義符時(shí)拯爽,在\
后面出現(xiàn)的字符可能會(huì)實(shí)現(xiàn)另外一種意義索抓。
作為續(xù)行符時(shí),在行尾使用了\
后毯炮,可以換行繼續(xù)書寫內(nèi)容逼肯。
str = '123'\
'456'
print(str)
---
123456
打印結(jié)果看,并未換行桃煎,說明續(xù)行符起作用了篮幢。
-
\n
代表一個(gè)換行符
str = "歲月是一把殺豬刀, \n但是它拿長(zhǎng)得丑的人一點(diǎn)辦法都沒有为迈。"
print(str)
---
歲月是一把殺豬刀三椿,
但是它拿長(zhǎng)得丑的人一點(diǎn)辦法都沒有。
-
\r
代表光標(biāo)位置(從\r
出現(xiàn)的位置開始作為光標(biāo)的起點(diǎn))
str = "歲月是一把殺豬刀葫辐, \r但是它拿長(zhǎng)得丑的人一點(diǎn)辦法都沒有赋续。"
print(str)
---
但是它拿長(zhǎng)得丑的人一點(diǎn)辦法都沒有。
-
\t
代表一個(gè)水平制表符(table 縮進(jìn))
str = "歲月是一把殺豬刀\t但是它拿長(zhǎng)得丑的人一點(diǎn)辦法都沒有另患。"
print(str)
---
歲月是一把殺豬刀 但是它拿長(zhǎng)得丑的人一點(diǎn)辦法都沒有纽乱。
-
\b
代表一個(gè)退格符
str = "歲月是一把殺豬刀\b但是它拿長(zhǎng)得丑的人一點(diǎn)辦法都沒有。"
print(str)
---
歲月是一把殺豬但是它拿長(zhǎng)得丑的人一點(diǎn)辦法都沒有昆箕。
注意看鸦列,并不是毫無改變的打印出來了,整句話中\b
前面的刀
這個(gè)字被退格了鹏倘。
-
\\
反轉(zhuǎn)義\
薯嗤,輸出了\
,取消\
的轉(zhuǎn)義效果
str = "歲月是一把殺豬刀\\n但是它拿長(zhǎng)得丑的人一點(diǎn)辦法都沒有纤泵。"
print(str)
---
歲月是一把殺豬刀\n但是它拿長(zhǎng)得丑的人一點(diǎn)辦法都沒有骆姐。
第二個(gè)\
被前面的\
轉(zhuǎn)義了镜粤,所以n
就不會(huì)再被轉(zhuǎn)義,也就沒有換行玻褪。
-
r
肉渴, 如果我們想把轉(zhuǎn)義字符也作為普通字符輸出,那我們可以在字符串的最前面加上r
str = r"歲月是一把殺豬刀\n但是它拿長(zhǎng)得丑的人一點(diǎn)辦法都沒有带射。"
print(str)
---
歲月是一把殺豬刀\n但是它拿長(zhǎng)得丑的人一點(diǎn)辦法都沒有同规。
字符串內(nèi)的轉(zhuǎn)移字符\n
被打印了出來。
字符串相關(guān)的操作
- 字符串
+
操作, 將參與運(yùn)算的字符串相加后組成一個(gè)新的字符串窟社。
str="君不見券勺,黃河之水天上來,奔流到海不復(fù)回灿里。"
str2 = "君不見关炼,高堂明鏡悲白發(fā),朝如青絲暮成雪匣吊。"
res = '將進(jìn)酒\n'+ str + '\n' + str2
print(res)
---
將進(jìn)酒
君不見儒拂,黃河之水天上來,奔流到海不復(fù)回缀去。
君不見侣灶,高堂明鏡悲白發(fā),朝如青絲暮成雪缕碎。
- 字符串
*
操作褥影,str*n
就是 將當(dāng)前字符串重復(fù)n
遍
str = '重要的話說三遍\n' * 3
print(str)
---
重要的話說三遍
重要的話說三遍
重要的話說三遍
- 字符串
[]
切片操作
字符串的索引操作,字符串中只能使用[]
下標(biāo)訪問咏雌,不能修改凡怎。
str[start:stop:step]
功能,獲取str的特定下標(biāo)或者對(duì)str進(jìn)行切片操作
參數(shù):
start: 可選赊抖,開始值统倒,默認(rèn)為0
stop: 可選,結(jié)束值氛雪,默認(rèn)為len(str)
step:可選房匆,步進(jìn)值,默認(rèn)為1
因?yàn)樗袇?shù)都是可選項(xiàng)报亩,所以其實(shí)我們可以什么參數(shù)都不給浴鸿,直接使用默認(rèn)值:
str = '凡詩(shī)之所謂風(fēng)者,多出于里巷歌謠之作弦追,所謂男女相與詠歌岳链,各言其情者也。'
print(str)
# 等同于
print(str[::])
---
凡詩(shī)之所謂風(fēng)者劲件,多出于里巷歌謠之作掸哑,所謂男女相與詠歌约急,各言其情者也。
凡詩(shī)之所謂風(fēng)者苗分,多出于里巷歌謠之作厌蔽,所謂男女相與詠歌,各言其情者也俭嘁。
當(dāng)我們寫一個(gè)值躺枕,那就是獲取指定下標(biāo)的元素:
print(str[6])
---
者
但是當(dāng)我們只寫一個(gè)值服猪,并且后面跟上符號(hào)::
, 那含義就是從start
開始供填,向后取完:
print(str[6::])
---
者,多出于里巷歌謠之作罢猪,所謂男女相與詠歌近她,各言其情者也。
從這我們可以看出來膳帕,當(dāng)我們只寫一個(gè)單獨(dú)的值而沒有加::
的時(shí)候粘捎,含義就是從start
開始,但是并不向后繼續(xù)取值危彩,而有了::
就是繼續(xù)向后取值攒磨。其實(shí),只寫一個(gè):
也是一樣的汤徽,因?yàn)橹灰老蚝笕≈担?code>step默認(rèn)值就是為1
:
print(str[6:])
---
者娩缰,多出于里巷歌謠之作,所謂男女相與詠歌谒府,各言其情者也拼坎。
那如果我們?cè)谶@個(gè)基礎(chǔ)上加上一個(gè)值,那就是從start
開始直到stop
之前完疫。和range()
一樣泰鸡,取不到stop
。
print(str[2:6])
---
之所謂風(fēng)
然后再多加一個(gè)值壳鹤,和range()
一樣盛龄,就是往后數(shù)step
個(gè)數(shù)再取值:
print(str[2:15:2])
---
之謂者多于巷謠
其實(shí),這里比較饒的并不是如何取值芳誓,二是::
這兩個(gè)符號(hào)余舶。當(dāng)我們將上面講的這些內(nèi)容了解通透后,就可以玩轉(zhuǎn)字符串的切片了兆沙。
那對(duì)應(yīng)的欧芽,如果我們想將字符串完全取值,但是是隔一個(gè)取一個(gè)葛圃,那我們就可以使用start
和stop
的默認(rèn)值千扔,而只定義step
print(str[::2])
---
凡之謂者多于巷謠作所男相詠憎妙,言情也
那如果我們想讓整個(gè)字符串倒過來呢?
print(str[::-1])
---
曲楚。也者情其言各厘唾,歌詠與相女男謂所,作之謠歌巷里于出多龙誊,者風(fēng)謂所之詩(shī)凡
字符串的格式化方法
常用的字符串的格式化方法就是format()
先讓我們看看最普通的方式:
s = '茶桁'
str = '乘舟將欲行抚垃,忽聞岸上踏歌聲。'
我定義了這兩個(gè)字符串趟大,現(xiàn)在我想將兩段字符串合在一起變成一句“茶桁乘舟將欲行鹤树,忽聞岸上踏歌聲。”(嗯逊朽,權(quán)吾乃青蓮居士罕伯。)
很多小伙伴是不是覺得太簡(jiǎn)單了,我們之前學(xué)了+
號(hào)叽讳,直接拼接不就好了追他。自然也是可以的,只是我們現(xiàn)在要用更普遍和便捷的方式來完成:
s = '茶桁'
str = '{}乘舟將欲行岛蚤,忽聞岸上踏歌聲邑狸。'.format(s)
print(str)
---
茶桁乘舟將欲行,忽聞岸上踏歌聲涤妒。
假如說单雾,我們現(xiàn)在只有詩(shī)詞的大半句,其中少了踏歌行這三個(gè)字届腐,那我們又該如何铁坎?那我們就往format
中傳入兩個(gè)參數(shù),后面那個(gè)參數(shù)自定義出這三個(gè)字符就可以了:
s = '茶桁'
str = '{}乘舟將欲行犁苏,忽聞岸上{}硬萍。'.format(s, "踏歌行")
print(str)
---
茶桁乘舟將欲行,忽聞岸上踏歌行围详。
看到這里朴乖,我們是不是認(rèn)為字符串使用format
就只能順序傳值?第一個(gè)答案填入第一個(gè)空助赞,第二個(gè)答案填入第二個(gè)空... 其實(shí)不只是如此买羞,字符串后使用format
,其中的{}
還可以接受索引傳參:
s = '茶桁'
str = '{1}乘舟將欲行雹食,忽聞岸上{0}畜普。'.format("踏歌行", s)
print(str)
---
茶桁乘舟將欲行,忽聞岸上踏歌行群叶。
通過索引傳參的適用范圍畢竟還是有限吃挑,我們很容易一不小心就會(huì)把參數(shù)順序搞亂钝荡。那還有沒有其他辦法呢?
我們還可以通過關(guān)鍵字傳參:
str = '{s2}乘舟將欲行舶衬,忽聞岸上{s1}埠通。'.format(s1 = "踏歌行", s2 = "茶桁")
print(str)
---
茶桁乘舟將欲行,忽聞岸上踏歌行逛犹。
那假如說我們得到的是一個(gè)列表數(shù)據(jù)端辱,是否需要先轉(zhuǎn)換數(shù)據(jù)?其實(shí)也沒必要虽画,format
支持對(duì)容器型數(shù)據(jù)的傳參數(shù):
str = '豪放派:{0[0]}舞蔽,婉約派:{0[1]},流氓派:{0[3]},蛋黃派:{0[2]}'.format(['李白','辛棄疾','達(dá)利園','茶桁'])
print(str)
---
豪放派:李白狸捕,婉約派:辛棄疾喷鸽,流氓派:茶桁,蛋黃派:達(dá)利園
那么如果是字典類型的呢众雷?那就更簡(jiǎn)單了灸拍,我們之前提到的關(guān)鍵字傳參,不就正好對(duì)應(yīng)字典嗎砾省?
dict = {'a':'茶桁', 'b':'蛋黃派'}
str = '{a}乘舟將欲行鸡岗,忽聞岸上'.format(**dict)
print(str)
---
茶桁乘舟將欲行编兄,忽聞岸上蛋黃派
嗯轩性,不錯(cuò)。似乎我們創(chuàng)建了一句新的詩(shī)句狠鸳。
其實(shí)揣苏,format
還有其他的用法,就是直接用關(guān)鍵字f
件舵, 比如:
str = f'{dict["a"]}乘舟將欲行卸察,忽聞岸上{dict["b"]}'
print(str)
---
茶桁乘舟將欲行,忽聞岸上蛋黃派
f
是在3.7版本中新增的格式化方法铅祸,在使用的過程中坑质,要注意字符串符號(hào)“”
和‘’
的嵌套關(guān)系。
在基本使用之外临梗,我們還有一些風(fēng)騷的特殊用法涡扼,比如,我們可以用format
直接限定小數(shù)的位數(shù):
str = '圓周率是多少:{:.5f}'.format(3.1415926)
print(str)
---
圓周率是多少:3.14159
字符串相關(guān)函數(shù)
在Python中盟庞,字符串應(yīng)該是最常見的數(shù)據(jù)類型吃沪,對(duì)應(yīng)字符串的函數(shù)也有不少。大家可以去看看官方的文檔
英文字符與字符檢測(cè)相關(guān)函數(shù)
我們可以返回字符串的副本什猖,并且將首字母大寫票彪,其余小寫:
str = 'I am a data product manager'
str.capitalize()
---
'I am a data product manager'
因?yàn)槲以谑褂肑upyter Notebook萎津,所以即便我么有使用
可以把字符串中的一個(gè)單詞的首字母大寫:
str.title()
---
'I Am A Data Product Manager'
可以全部改為大寫:
str.upper()
---
'I AM A DATA PRODUCT MANAGER'
把字符串全部改為小寫
str.lower()
---
'i am a data product manager'
字符串中的大小寫字符轉(zhuǎn)換,大寫轉(zhuǎn)小寫垮耳,小寫轉(zhuǎn)大寫:
str.swapcase()
---
'i AM A DATA PRODUCT MANAGER'
檢測(cè)字符是否包含在字符串內(nèi):
print('o' in 'love')
---
True
檢測(cè)字符串是否為全部大寫字母組成
str.isupper()
---
False
檢測(cè)字符串是否為全部小寫字母組成
str.islower()
---
False
檢測(cè)字符串是否符合標(biāo)題title
的要求
str.istitle()
---
False
檢測(cè)字符串是否由數(shù)字和字母組成颈渊,如果字符串中包含來非數(shù)字字母的其它字符,則返回False
str.isalnum()
---
False
檢測(cè)字符串是否全部由字符(包含英文字符和中文)組成
str.isalpha()
---
False
檢測(cè)字符串是否由純數(shù)字字符組成
'123'.isdigit()
---
True
檢測(cè)當(dāng)前字符串是否為 空格 字符組成 ' ’
' '.isspace()
---
True
檢測(cè)字符串是否以指定的字符開始的终佛,也可以指定開始和結(jié)束的位置
str.startswith('I')
---
True
str.startswith('a', 5)
---
True
檢測(cè)字符串是否以 指定的字符 結(jié)束的俊嗽,也可以指定開始和結(jié)束的位置
print(str.endswith('a'))
print(str.endswith('a', 5, 11))
print(str.endswith('a', 1, 6))
---
False
True
True
字符串的查找和操作相關(guān)函數(shù)(? 重點(diǎn))
前面鋪墊了那么多之后,接下來這部分铃彰,才是這一節(jié)的重點(diǎn)绍豁。
讓我們先從查找來看:
str.find(sub[, start[, end]])
find
會(huì)返回一個(gè)子字符串,找到字符中符合條件的第一個(gè)字符出現(xiàn)的索引位置牙捉,未找到則返回-1
str = "I am a data product manager."
print(str.find('am'))
---
2
讓我們用切片的方式反過來找一下看看:
res = str.find('am')
str[res:res+2]
---
'am'
我們從之前可以知道res
取值為2
竹揍,現(xiàn)在等于是str[2:4]
, 正好是am
所在的位置邪铲。
find
中有start
和end
芬位,是支持切片查找的:
print(str.find('am', 0, 4))
print(str.find('am', 4, 10))
---
2
-1
可以看到,在從4開始找到10的時(shí)候找不到am
, find
有一個(gè)功能相同带到,但是方向不同的方法rfind()
, 和find
的不同點(diǎn)只是昧碉,rfind
是從后往前找的。
str.index(sub[, start[, end]])
類似于find()
揽惹, 但在找不到子字符串的時(shí)候會(huì)引發(fā)ValueError
str.index('python')
---
ValueError: substring not found
str.count(sub[, start[, end]])
這個(gè)函數(shù)會(huì)在字符串中去查找sub
在其中[start, end]
范圍內(nèi)非重疊出現(xiàn)的次數(shù)被饿。
print(str.count('a'))
print(str.count('a', 5, 12))
---
6
3
接下來讓我們看看字符串操作相關(guān)的函數(shù):
str.split(sep=None, maxsplit=-1)
這個(gè)方法可以按照指定的分隔符(sep
),把字符串分隔成列表搪搏。
str = 'user_admin_id_123'
str.split('_')
---
['user', 'admin', 'id', '123']
整個(gè)方法里的maxsplit
是進(jìn)行多少次拆分狭握,比如1
為一次拆分,也就是會(huì)返回2個(gè)元素慕嚷。默認(rèn)值為-1
哥牍,意思是不限制拆分次數(shù)。
str.split('_', 1)
---
['user', 'admin_id_123']
str.rsplit(sep=None, maxsplit=-1)
和split
方法相似喝检,只是方向不同嗅辣。這個(gè)是從后向前獲取。
str.rsplit('_')
---
['user', 'admin', 'id', '123']
這段代碼可以看到功能上是完全一樣的挠说,如果我們把maxsplit
加進(jìn)去澡谭,就能看到方向上的不同:
str.rsplit('_', 1)
---
['user_admin_id', '123']
這樣就能清晰看到,rsplit
是從后面開始拆分的。
str.join(iterable)
join
的功能和split
可以看成是相反的蛙奖,是使用指定的字符串潘酗,把一個(gè)容器中的元素連接成一整個(gè)字符串
str = ['user', 'admin', 'id', '123']
'_'.join(str)
---
'user_admin_id_123'
str.strip([chars])
去除字符串左右兩側(cè)的指定字符, chars
參數(shù)為置頂要溢出字符的字符串,默認(rèn)移除空白符雁仲。
str = ' chaheng '
str.strip(' ')
---
'chaheng'
這個(gè)函數(shù)有兩個(gè)伴生函數(shù)仔夺,一個(gè)是rstrip
, 從方法名應(yīng)該能猜的出來攒砖,這是去掉字符串右側(cè)的指定字符缸兔,另一個(gè)是lstrip
, 這是去除左側(cè)的指定字符吹艇。
str.rstrip(' ')
str.lstrip(' ')
---
' chaheng'
'chaheng '
len()
函數(shù)可以獲取當(dāng)前字符串的長(zhǎng)度
len(str)
---
9
str.replace(old, new[, count])
可以替換對(duì)應(yīng)的字符串惰蜜,將old
都替稱為new
。count
則是替換次數(shù)受神。比如一個(gè)字符串內(nèi)出現(xiàn)了十次old
抛猖, 我``count給的5, 則只替換前5次出現(xiàn)的
old`字符串。
str = 'abcabcabcabcabcabc'
str.replace('a', 'e')
str.replace('a', 'e', 2)
---
'ebcebcebcebcebcebc'
'ebcebcabcabcabcabc'
可以注意一下兩次打印的區(qū)別鼻听。
這次就不留練習(xí)題了财著,字符串的查詢和操作函數(shù)屬于重中之重,大家最好是多去練習(xí)幾遍精算,將其中的方法記會(huì)杯熟瓢宦。
好,今天就到這里灰羽。咱們下節(jié)課再見。