
字符串詳講.png
1.什么是字符串(str)
- 字符串是python內(nèi)置的一種容器型數(shù)字類型,不可變、有序 ;
不可變:指的是內(nèi)容的值和順序不可變
有序:一旦字符串確定,字符串中字符的位置就固定(每個字符串是第幾個字符是確定的) - 將單引號或雙引號作為容器,里面可以根據(jù)情況放多個字符
2.字符串中的內(nèi)容 -- 字符
- python中只有字符的概念,沒有字符對應(yīng)的數(shù)據(jù)類型,比如:沒有char(123)
- 字符串中字符串的基本單元是字符,又叫字符串的元素
a. 基本字符
數(shù)字、字母、常用符號、中文、日語、韓語等
'12'
'ash'
'-='
b. 轉(zhuǎn)義字符
通過轉(zhuǎn)義符號\后面跟不同的符號來表示特殊功能或特殊意義的字符
# \n -- 換行
# \' -- 表示一個單引號
# \" -- 表示一個雙引號
# \\ -- 表示一個反斜杠
# \t -- 字表符(跳到下一個tab的位置)
str1 = '\ta\'bc\\n12\"3'
print(str1)
阻止轉(zhuǎn)義:在字符串的最前面加r/R,可以阻止字符串中的轉(zhuǎn)義字符轉(zhuǎn)義(一般用于正則表達(dá)式)
str2 = r'\tabc\n123x\'\"z'
print(str2)
c.編碼字符
\u 后面跟4位的十六進(jìn)制數(shù),來表示一個字符,這個4位的十六進(jìn)制數(shù)對應(yīng)的值是字符串的編碼值
\u4位十六進(jìn)制數(shù)(編碼值)
str3 = 'abc+\u9fa5'
print(str3) #abc+龥
3.字符編碼
- python中的字符采用的是unicode編碼
- 計(jì)算機(jī)存儲數(shù)據(jù)只能存數(shù)字,而且存的是數(shù)字的補(bǔ)碼(是以一種二進(jìn)制的格式進(jìn)行存儲的)
print(bin(100),0b1100100) #bin(數(shù)字) -是獲取指定數(shù)字對應(yīng)的二進(jìn)制
print(oct(100),0o144) #oct(數(shù)字) -是獲取指定數(shù)字對應(yīng)的八進(jìn)制
print(hex(100),0x64) #hex(數(shù)字) - 獲取指定的數(shù)字對應(yīng)的十六進(jìn)制
print(0b1100100 * 10)
- 編碼:每個字符在計(jì)算機(jī)中存儲的時候都會對應(yīng)一個固定且唯一的數(shù)字,這個數(shù)字就是這個字符的編碼,每一個字符和數(shù)字的意義對應(yīng)關(guān)系就是編碼表,
常見的編碼表:ASCII、unicode;
ASCII碼表中只對數(shù)字字符、字母字符、英文符號進(jìn)行編碼
unicode編碼表是對ASCII碼表的擴(kuò)充,能夠?qū)κ澜缟纤蟹栠M(jìn)行編碼 - chr(編碼值) --獲取編碼值對應(yīng)的字符 4e00-9fa5(漢字范圍)
- ord(字符) -- 獲取字符對應(yīng)的編碼值,注意:字符值就是長度為1的字符串
print(chr(100))
print(chr(0x64))
print(ord('巫'),ord('苗'))
# 打印所有漢字
num = 0
for code in range(0x4e00,0x9fa5):
print(chr(code),end = ' ')
num = num + 1
if num % 20 == 0:
print()
print()
print(num)
str3 = '\u4fff\u5faa\u00c8'
print(str3)
print('a' > 'Z')
4.獲取字符 - 取字符串的內(nèi)容
4.1 獲取單個字符
- 語法:字符串[下標(biāo)] - 根據(jù)下標(biāo)獲取字符串中對應(yīng)的字符
- 說明
字符串 - 可以是字符串值,也可以是字符串變量,可以是字符串的表達(dá)式
[ ] : - 固定寫法
下標(biāo): - 又叫索引,一旦字符串確定,那么字符串中的每個字符都會對應(yīng)一個下標(biāo),表示這個字符在字符串中的位置
下標(biāo)的范圍是0開始到字符串的長度減1
0表示第一個字符,1表示第二個,以此類推。(通用)
下標(biāo)范圍還可以是 -1~ -字符串長度減1,-1表示倒數(shù)第一個 - 注意:轉(zhuǎn)義字符代表一個字符;獲取單個字符的時候下標(biāo)不能越界
str1= 'python' # 'p' : 0/-6
print(str1[0],str1[-6],str1[-2])
str2 = 'py\nthon'
print(str2[4])
# print(str1[100]) # IndexError: string index out of range
4.2 獲取部分字符(字符串切片)
a.語法:字符串[開始下標(biāo):結(jié)束下標(biāo):步長] -從開始下標(biāo)開始,獲取到結(jié)束下標(biāo)前為止,每次下標(biāo)值增加步長
b.要求
- 字符串 - 可以是字符串值,也可以是字符串變量,結(jié)果是字符串的表達(dá)式
- [] - 固定寫法
- : - 固定寫法
- 開始下標(biāo)、結(jié)束下標(biāo)
下標(biāo)值,開始下標(biāo)對應(yīng)的字符可以取到,結(jié)束下標(biāo)對應(yīng)的字符一定取不到
步長是整數(shù),可以是正的,也可以是負(fù)的
c.注意:
- 下標(biāo)可以越界;
- 如果步長為正,(從前往后獲?。?,開始下標(biāo)對應(yīng)的字符要在結(jié)束下標(biāo)對應(yīng)的字符前,才能獲取到值
- 如果步長為負(fù),(從后往前獲?。_始下標(biāo)對應(yīng)的字符要在結(jié)束下標(biāo)對應(yīng)字符的后面,才能獲取到值
str4 = 'abcdef123456'
print(str4[0:4:1])
print(str4[-2:-3:-1])
print(str4[0:100:1]) # 下標(biāo)可以越界 'abcdef123456'
print('hello python'[1:-2:3]) # eoy -2 寫成9 也行 有個空格,所以沒有取到t
- 步長為正就是從前往后去,為負(fù)就是從后往前取
- 切片的語法中可以對步長,開始下標(biāo)和結(jié)束下標(biāo)進(jìn)行省略:
省略步長(步長默認(rèn)為1)
字符串[開始下標(biāo):結(jié)束下標(biāo)] == 字符串[開始下標(biāo):結(jié)束下標(biāo):1]
省略下標(biāo)
字符串[:結(jié)束下標(biāo):結(jié)束] -如果步長為正,從字符串開頭往后??;如果步長為負(fù),從字符串最后一個字符往前取
字符串[開始下標(biāo):步長] -如果步長為正,取到最后一個字符為止,如果步長為負(fù),取到第一個字符為止
str4 = 'abcdef123456'
print(str4[:3:1]) # abc
print(str4[:3:-1]) # 654321fe
print(str4[2:]) # cdef123456
print(str4[2::-1]) # cba
print(str4[::-1]) # 654321fedcba
練習(xí):1234 -> 4321
num = 1234
num = int(str(num)[::-1]) # 先轉(zhuǎn)換為字符串類型,再切片,然后轉(zhuǎn)換為int類型
print(num)
4.3 遍歷字符串 - 一個一個的取出所有的字符
"""
方法一:直接遍歷
for 變量 in 字符串:
循環(huán)體
方法二:通過遍歷下標(biāo),來遍歷字符串
for 下標(biāo) in range(字符串長度):
字符串[變量]
"""
for char in 'maggie':
print(char)
str3 = 'when I was young'
len()
# len(字符串) - 獲取字符串長度,返回一個數(shù)字
for i in range(len(str3)):
print(i,str3[i])
5.字符串相關(guān)運(yùn)算
a.數(shù)學(xué)運(yùn)算:字符串支持加法運(yùn)算和乘法運(yùn)算
加法運(yùn)算
- 語法:b.字符串1 + 字符串2 -將兩個字符串拼接在一起,產(chǎn)生一個新的字符串
new_str = 'abc' + '123'
print(new_str)
new_str += '你好!' # new_str = new+str + '你好!'
- 注意:加法兩邊都必須是數(shù)字,或都是字符串,不能混合相加
# new_str = 'abc' + 123
print(new_str+'=====')
乘法運(yùn)算
- 語法:字符串 * 正整數(shù) ; 正整數(shù) * 字符串 - 指定的字符串重復(fù)指定次數(shù),產(chǎn)生一個新的字符串
print('abc' * 3)
print('*' * 10)
b.比較運(yùn)算:字符串支持所有的比較運(yùn)算符
字符串1 == 字符串2,字符串1!== 字符串2 - 判斷兩個字符串是否相等
print('abc' == 'abc')
print('abc' == 'acb')
print('abc' != 'abc')
字符串比較大?。鹤寖蓚€字符串中相同位置的字符一一比較(從前往后),找到第一對兒不相等的字符判斷編碼值的大小
print('abc'>'abz') # false
應(yīng)用:
char = 9
# 判斷一個字符是否是字母:'a'<=char<='z' or 'A'<=char<='Z'
# 判斷一個字符是否是數(shù)字:'0'<=char<='9'
# 判斷一個字符是否是中文:
# '\u4e00'<=char<='0x9fa5'
# 0x4e00<=ord(char)<=0x9fa5
練習(xí):輸入一個任意字符串,統(tǒng)計(jì)輸入的內(nèi)容中字母的個數(shù)
new_str = input('輸入一個字符串:')
count = 0
for i in new_str:
if 'a'<=i<='z' or 'A'<=i<='Z':
count +=1
print('字母有 %d個'% count)
c. in 和 not in 操作
- 字符串1 in 字符串2 - 判斷字符串1是否在字符串2中(判斷字符串2中是否包含字符串1)
- 字符串1 not in 字符串2 - 判斷字符串1是否不在字符串2中(判斷字符串2中是否不包含字符串1)
print('abc' in 'abc123') # True
print('abc' in 'a12bc') # False
print('abc' not in 'a12bc') # True
d.常用內(nèi)置函數(shù)
- len(字符串) - 求字符串長度
- str(數(shù)據(jù)) - 將其他數(shù)據(jù)轉(zhuǎn)換成字符,所有的數(shù)據(jù)都能轉(zhuǎn)換為字符串,轉(zhuǎn)換時直接在數(shù)據(jù)外面加引號
print(int('123')) #只有去掉引號后,本身就是一個整數(shù)的字符串才能轉(zhuǎn)換成整型
print(float('12.4')) # 只有去掉引號后,本身就是一個數(shù)字的字符串才能轉(zhuǎn)換成浮點(diǎn)型
print(bool('abc')) # 除了空串會轉(zhuǎn)換為False,其他的都是True
練習(xí):判斷str2是否為空串
str2 = ''
if str2:
print('不是空串')
e.字符串的對象方法:字符串.方法()
字符串.capitalize() - 將字符串首字母大寫
str4 = 'hello'
new_str = str4.capitalize()
print(new_str) # Hello
字符串.center(width,fillchar)
產(chǎn)生一個長度為width的新字符串,新字符串中,原字符串居中顯示,剩余的部分用fillchar填充
str4 = 'hello'
new_str = str4.center(11,'*')
print(new_str) # ***hello***
字符串.ljust(width,fillchar)
new_str = str4.ljust(11,'=')
print(new_str)
字符串.rjust(width,fillchar)
num = 1 # 001
num = 10 # 010
student_id = str(num).rjust(3,'0')
print(student_id)
字符串.zfill(width) -產(chǎn)生一個寬度是width的字符串,原字符串在右邊,前用0填充
student_id = str(num).zfill(4)
print(student_id)
字符串1.count(字符串2)
統(tǒng)計(jì)字符串2在字符串1中出現(xiàn)的次數(shù)
str1= 'and you? how are you!'
print(str1.count('a')) # 2
練習(xí):打印字符串中出現(xiàn)最多的字符和對應(yīng)的次數(shù)
'how are you?oh~' 打印o 3次
str4 = 'how are you?oh~'
max_count = 0 # 保存當(dāng)前最大次數(shù)
max_char ='' # 保存當(dāng)前最大次數(shù)對應(yīng)的字符
for i in str4:
# 獲取每個字符出現(xiàn)的次數(shù)
count = str1.count(i)
# 如果獲取的字符的次數(shù),比最大的次數(shù)還打,說明這次次數(shù)才是最新的最大次數(shù),對應(yīng)的字符就是最新的最大次數(shù)的字符
if count > max_count:
max_count = count
max_char = i
print('%s出現(xiàn)%d次' %(max_char,max_count))
字符串1.find(字符串2)
在字符串1中查找字符串2第一次出現(xiàn)的位置,如果找不到返回-1
格式2:字符串1.find(字符串2,開始下標(biāo),結(jié)束下標(biāo)) - 在字符串1中開始下標(biāo)到解讀下標(biāo)的范圍內(nèi)查到字符串2第一次出現(xiàn)的位置(不包含結(jié)束下標(biāo))
print(str1.find('you')) # 4
print(str1.find('you2')) # -1
print(str1.find('you',-8,-1)) # 17
練習(xí):在字符串'and you? how are you! you'中,找到所有’you‘出現(xiàn)的下標(biāo)
打印 4,17,22
# 思路:先找出you第一次出現(xiàn)的位置,然后 再從第一次出現(xiàn)位置之后開始找第二個
str1 = 'and you? how are you! you'
str2 = 'you'
start_index = 0
while True:
index = str1.find(str2,start_index) # 從第0開始找
if index == -1: # 如果沒有找到find返回值是-1
break
else:
print(index,end=',')
# 更新下標(biāo)
start_index = index + len(str2)
print()
index的功能和find一樣,只是如果字符串2不存在的時候會報(bào)錯
print(str1.index('you')) # 4
# print(str1.index('you2')) # substring not found
字符串1.isdigit() - 判斷字符串1中是否只有數(shù)字字符串
print('12'.isdigit())
字符串1.isnumeric() - 判斷字符串1中是否只有數(shù)字字符串(可以檢查中文數(shù)字)
print('壹仟'.isnumeric())
字符串1.join(序列) - 將序列中的元素用字符串1連接在一起,產(chǎn)生一個新的字符串,結(jié)果是字符串
print('*'.join('abc'))
print('+'.join(['abc','vv','hhhh']))
練習(xí):自己實(shí)現(xiàn)join的功能,給字符串1和字符串2,用字符串1將字符串2中的所有字符連接起來
例如:str1 = ’aaa‘,str2='123',輸出:'1aaa2aaa3'
# 思路:循環(huán)123 每循環(huán)一次 空串就加上str1
# 方法一
str1 = 'aaa'
str2 = '123'
str3 = ''
for i in str2:
str3 += i + str1
print(str3[:-len(str1)])
# 方法二
# 思路:如果 i 小于str長度-1,就不加aaa只需要加i對應(yīng)的字符,
str3 = ''
for i in range(len(str2)):
if i == len(str2) -1:
str3 += str2[i]
else:
str3 += str2[i]+str1
print(str3)
"""
i = (0,1,2)
i = 0, i !=3-1 false str3 = str2[0] + str1 str3 = 1+aaa
i = 1, i !=3-1 false str3 = str2[1] + str1 str3 = 1+aaa+2+aaa
i = 2, i == 3-1 true str3 = str2[2] str3 = 1+aaa+2+aaa+3
"""
max(序列),min(序列) - 求序列元素的最大值和最小值
print(max('adsfefwefz'))
print(min('adsfefwefz'))
print(max([123,2,3,-10]))
練習(xí): str1='ab12cd34ed56',str2 = '+' ——> '1+2+3+4+5+6'
str1 = 'ab12cd34ed56'
str2 = '+'
str3 = ''
new_str = ''
for i in str1:
if '0'<=i<='9':
str3 += i
for index in str3:
new_str += index + str2
print(new_str[:-len(str2)])
字符串1.split(字符串2) - 在字符串1把2作為切點(diǎn)
6.格式字符串: 在字符串中通過格式占位符來表示字符串中變化的部分
語法:包含格式占位符的字符 % (給格式占位符賦值的數(shù)據(jù)列表)
說明:
格式占位符:
%s:表示變化的字符串 %d:變化的整數(shù)
%f:變化的浮點(diǎn)數(shù)(%.Nf:N可以約束小數(shù)點(diǎn)后面的小數(shù)位數(shù))
%c:表示字符(可以將整數(shù)轉(zhuǎn)為字符)
%x\X:
練習(xí):
name = input('姓名:')
age = int(input('年齡:'))
salary = float(input('薪水:'))
print('%s今年%d歲,月薪:%.2f,等級:%c' %(name,age,salary,65))
message = name + '今年' + str(age) + '歲'
print(message)
練習(xí):輸入學(xué)生姓名、年齡和性別,以'XX今年,性別:X'
name = input('姓名:')
age = int(input('年齡:'))
gender = input('性別:')
print('%s今年%d歲,性別:%s' %(name,age,gender))