一、字符串和字符
1.什么是字符串(str)
字符串是容器型數(shù)據(jù)類型, 將''/""/''''''/""""""作為容器標(biāo)志职抡,容器中的元素全是字符
不可變的(不支持增刪改)葬燎、有序(支持下標(biāo)操作)
str1 = 'hello\n123'
str2 = "你好"
str3 = '''thanks
123
456'''
str4 = """謝謝"""
print(type(str1), type(str2), type(str3), type(str4))
print(str1)
print(str3)
2.字符串中的元素 - 字符
python中只有字符的概念,沒(méi)有對(duì)應(yīng)的數(shù)據(jù)類型缚甩。引號(hào)中只有一個(gè)元素的字符串可以看成一個(gè)字符
字符串又叫字符集
1)字符串中的字符 - 原則上任何可以通過(guò)鍵盤輸入或者從其他地方賦值粘貼的所有的符號(hào)都可以作為字符
'和健身房'萨蚕、'shuASSS'、'2378'蹄胰、'+-===岳遥!@&*#@'、'?'
a.普通字符: 在字符串中能夠代表符號(hào)本身的字符(沒(méi)有特殊意義和特殊功能的符號(hào))
b.轉(zhuǎn)義字符: 在字符串中有特殊意義和特殊功能的符號(hào)的組合裕寨,一般是以\開(kāi)頭的
\n - 換行
\' - 表示'本身
\" - 表示"本身
\t - 表示一個(gè)縮進(jìn)(tab鍵)
\\ - 表示一個(gè)\
注意: 所有的轉(zhuǎn)義字符的長(zhǎng)度都是1
c.編碼字符
\u四位的16進(jìn)制數(shù) - 編碼字符(獲取4位16進(jìn)制數(shù)作為編碼值對(duì)應(yīng)的字符)
2)阻止轉(zhuǎn)義: 在字符串的最前面加r/R可以讓當(dāng)前字符串中所有的轉(zhuǎn)義字符失效(所有的符號(hào)在字符串中都表示這個(gè)符號(hào)本身)
str1 = 'abc\n123'
print(str1)
str2 = 'abc\'1\"23'
print(str2)
str3 = '\tabc'
print(str3)
str4 = 'abc\\n123'
print(str4)
str5 = 'abc\u4eff'
print(str5)
str6 = R'\tabc\n\'123'
print(str6)
3.字符編碼
計(jì)算機(jī)不能直接存儲(chǔ)字符(符號(hào))浩蓉,只能存儲(chǔ)數(shù)字;
為了能夠存儲(chǔ)字符,把每一個(gè)字符關(guān)聯(lián)了一個(gè)固定的數(shù)字(這個(gè)固定的數(shù)字就是對(duì)應(yīng)的字符的編碼)
字符和數(shù)字和一一對(duì)應(yīng)關(guān)系就是編碼表:ASCII碼表,Unicode編碼表(python)
1) ASCII碼表 - 在計(jì)算機(jī)中采用一個(gè)字節(jié)保存一個(gè)字符(總共128個(gè)字符)宾袜, 字符包含了所有的字母捻艳、數(shù)字和美國(guó)常用符號(hào)
0 ~ 9: 編碼值從48開(kāi)始依次增加
大寫字母的編碼值 < 小寫字母的編碼值
大寫字母和小寫字母不是緊挨著的
2) Unicode編碼表是ASCII碼表的擴(kuò)展, 包含了世界上所有的國(guó)家、所有的語(yǔ)言對(duì)應(yīng)的符號(hào)(總共有65536個(gè)符號(hào))
ASCII碼: 0 ~ 127
中文編碼值范圍: 0x4e00 ~ 0x9fa5
(1)編碼字符: \u4位16進(jìn)制編碼值
str1 = 'abc\u50ff'
print(str1)
(2)chr(編碼值) - 獲取編碼值對(duì)應(yīng)的字符
print(chr(97))
num = 0
for x in range(0x4e00, 0x9fa5+1):
print(chr(x), end=' ')
num += 1
if num % 30 == 0:
print()
print()
for x in range(0x0F00, 0x0FFF+1):
print(chr(x), end=' ')
print()
for x in range(0x2400, 0x243F+1):
print(chr(x), end=' ')
print()
(3)ord(字符) - 獲取指定字符對(duì)應(yīng)的編碼值
print(hex(ord('李')))
print(hex(ord('四')))
二庆猫、字符串操作
1.查 - 獲取字符 (和列表獲取元素的方式一樣)
1)獲取單個(gè)字符: 字符串[下標(biāo)]
2)切片: 字符串[開(kāi)始下標(biāo):結(jié)束下標(biāo):步長(zhǎng)]
3)遍歷: 直接變量元素认轨、通過(guò)下標(biāo)遍歷
注意: 一個(gè)空格是一個(gè)字符; 按tab鍵是4個(gè)空格,對(duì)應(yīng)4個(gè)字符; \t對(duì)應(yīng)一個(gè)字符
獲取單個(gè)字符
str1 = '\thello Python!'
print(str1[-2]) # n
print(str1[2]) # e
# print(str1[100]) # IndexError: string index out of range
切片
print(str1[2:]) # ello Python!
print(str1[1:-1:2]) # hloPto
print(str1[:3:-1]) # !nohtyP ol
遍歷
for x in str1:
print('x:', x)
"""
for 下標(biāo),元素 in enumerate(序列):
循環(huán)體
"""
for index, item in enumerate(str1):
print(index, item)
2. 相關(guān)操作
1)運(yùn)算符:
a. +, *
str1 = 'abc'
str2 = '123'
print(str1 + " " + str2) # abc 123
print(str1 * 3) # abcabcabc
b. ==, !=
print('abc' == 'abc') # True
print('abc' == 'acb') # False
>, <, >=, <=
字符串1 > 字符串2
字符串比較大小比較的是字符串編碼值的大小
"""
判斷字符是否是小寫字母: 'a'<= char <= 'z'
判斷字符是否是大寫字母: 'A'<= char <= 'Z'
判斷字符是否是字母: 'A' <= char <= 'Z' or 'a'<= char <= 'z'
判斷字符是否是中文: '\u4e00' <= char <= '\u9fa5'
判斷字符是否是數(shù)字: '0' <= char <= '9'
"""
print('abcdef' > 'bc') # False
print('Z' < 'a') # True
print('abaaaa' < 'aczzzzzz') # True
char = input('請(qǐng)輸入一個(gè)字符:')
if '\u4e00' <= char <= '\u9fa5':
print(char, '是中文')
else:
print(char, '不是中文')
練習(xí): 輸入一個(gè)字符串月培,判斷這個(gè)字符串是否是中文字符串(全是中文)
value = input('請(qǐng)輸入:')
for char in value:
if not '\u4e00' <= char <= '\u9fa5':
print('非中文字符串')
break
else:
print('是中文字符串')
2) in / not in
字符串1 in 字符串2 -> 判斷字符串2中是否包含字符串1
str3 = 'abc 123'
print('b' in str3) # True 10 in [10, 20, 30]
print('abc' in str3) # True [10, 20] in [10, 20, 30] -> False
print('ac' in str3) # False
3)相關(guān)函數(shù): len, str, sorted, reversed
a.len(字符串)
print(len('\tabc\n123\u4eee')) # 9
print(len(' abc123')) # 7
print(len(' ')) # ' ' -> 1; '' -> 0
b.str(數(shù)據(jù)) - 所有數(shù)據(jù)都可以轉(zhuǎn)換成字符串; 直接將數(shù)據(jù)的打印值加引號(hào)
a = 100
str(a) # '100'
str(True) # 'True'
list1 = [10, 20, 30]
str4 = str(list1) # '[10, 20, 30]'
print(len(str4), str4[0]) # 12 [
c.sorted(字符串)
str5 = 'pythonH12QWz'
list2 = sorted(str5)
print(list2) # ['1', '2', 'H', 'Q', 'W', 'h', 'n', 'o', 'p', 't', 'y', 'z']
print(''.join(list2)) # 12HQWhnoptyz
三嘁字、格式化字符串
1.格式占位符
"""
a.語(yǔ)法: 包含格式占位符的字符串 % (值1, 值2, 值3,...)
b.說(shuō)明:
格式占位符 - 格式占位符有哪些是固定,使用的時(shí)候和字符串中變化的數(shù)據(jù)的類型相關(guān)
%s - 字符串(任何類型都可以使用%s占位)
%d - 整數(shù);
%-Nd - 整數(shù); N約束數(shù)字最后的長(zhǎng)度杉畜,如果不夠后面補(bǔ)空格
%Nd - 整數(shù); N約束數(shù)字最后的長(zhǎng)度纪蜒,如果不夠前面補(bǔ)空格
%f - 浮點(diǎn)數(shù);小數(shù)點(diǎn)后面保留6位小數(shù)
%.Nf - 浮點(diǎn)數(shù), N約束小數(shù)點(diǎn)N后的小數(shù)位數(shù)(會(huì)四舍五入)
%c - 字符
% - 固定寫法
() - 固定寫法;如果值的個(gè)數(shù)是1可以省略
值 - 任何有結(jié)果的表達(dá)式; 值的個(gè)數(shù)和類型和前面占位符的個(gè)數(shù)以及類型保持一致
"""
# name = input('請(qǐng)輸入姓名:')
name = '張三'
# age = int(input('請(qǐng)輸入年齡:'))
age = 20
# 你好此叠,我是xxx纯续,今年x歲
# 方法一:
print('你好,我是'+name+',今年'+str(age)+'歲')
print('你好猬错,我是%s窗看,今年%4d歲, 工資:%.2f, %s, %f, %c, %c' % (name, age, 3.1495926, 2.348, 1.25, 'Z', 97))
2.format
一個(gè)帶有{}的字符串.format(值1, 值2, 值3,...)
用法1: 讓空的{}個(gè)數(shù)和format中值的個(gè)數(shù)保持
print('我是{}, 今年{}歲'.format('余婷', 18))
用法2: {N} - N從0開(kāi)始依次增加,分別表示format中第0個(gè)值倦炒,第1個(gè)值,...
print('我是{0},年是:{1}, 今年{1}歲'.format('余婷', 18))
print('數(shù)據(jù)1:{1}, 數(shù)據(jù)2:{0}, 數(shù)據(jù)3:{1}'.format(10, 20)) # 數(shù)據(jù)1:20, 數(shù)據(jù)2:10, 數(shù)據(jù)3:20
用法3: [key]
'{key1}, {key2}'.format(key1=值1, key2=值2) -> '值1, 值2'
print('我是{name},年齡是:{age}, 今年{age}歲'.format(age=20, name='張三'))
用法4: 用列表元素給占位符賦值(了解)
list1 = [10, 20, 30, 40]
print('{0[1]},{0[0]},{0[3]}'.format(list1))
print('{1[0]}, {1[1]}, {1[1]}, {0}'.format('張三', list1))
print('{list[1]},{list[2]},{list[3]}'.format(name='張三', list=list1))
用法5: 用字典的值給占位符賦值(了解)
student = {'name': '小明', 'age': 20, 'id': '001', 'score': 100}
print('{name}今年{age}歲显沈,學(xué)號(hào):{id}, 考了{(lán)score}'.format(**student))
# format(**student) --> format(name='小明', age=20, id='001', score=100)
其他的寫法:
約束小數(shù)位數(shù)
print('圓周率:{:.2f}'.format(3.1415926)) # 約束小數(shù)位數(shù)
約束整數(shù)寬度
print('整數(shù):{:0>4d}。'.format(25)) # 整數(shù):0025
print('整數(shù):{:0<4d}析校。'.format(25)) # 整數(shù):2500。
print('整數(shù):{:+>4d}铜涉。'.format(25)) # 整數(shù):++25智玻。
分隔
print('大的整數(shù):{:,}'.format(100000000)) # 大的整數(shù):100,000,000
百分比
print('百分比:{:.2%}'.format(0.25)) # 百分比:25.00%
四、字符串相關(guān)方法
1.字符串.capitalize() - 將字符串的首字母變成大寫字母
str1 = 'python'
new_str1 = str1.capitalize()
print(new_str1)
# 97 - 65 == 32; 98-66 == 32
char = 'j'
print(chr(ord(char)-32))
2.center/ljust/rjust/zfill
"""
字符串.center(寬度, 填充字符) # xabcx
字符串.ljust(寬度, 填充字符) # abcxx
字符串.rjust(寬度, 填充字符) # xxabc
字符串.zfill(寬度) == 字符串.rjust(寬度, '0')
"""
print('abc'.center(7, '+')) # ++abc++
print('abc'.ljust(7, '+')) # abc++++
print('abc'.rjust(7, '+')) # ++++abc
print('abc'.zfill(7)) # 0000abc
# 001芙代, 004吊奢, 009, 023纹烹, 045页滚, 102
num = 21
print(str(num).zfill(3))
3.
字符串1.count(字符串2) -> 統(tǒng)計(jì)字符串1中字符串2出現(xiàn)的次數(shù)
字符串1.count(字符串2,開(kāi)始下標(biāo),結(jié)束下標(biāo)) - 統(tǒng)計(jì)字符串1開(kāi)始下標(biāo)到結(jié)束下標(biāo)范圍內(nèi)字符串2出現(xiàn)的次數(shù)
str2 = 'how are you? i am fine! thank you!'
print(str2.count('you')) # 2
print(str2.count('a')) # 3
print(str2.count('you', 0, 15)) # 1
print(str2.count('you', 0, 4)) # 0
4.
str1 = 'you'
str2 = 'how are you'
# 判斷str2是否以str1結(jié)尾
print(str2[-len(str1):] == str1)
5.字符串查找
"""
字符串1.find(字符串2) - 獲取字符串2第一次在字符串1出現(xiàn)的位置(用大于等于0的下標(biāo)值表示);
字符串2不存在結(jié)果是-1
字符串1.index(字符串2) - 獲取字符串2第一次在字符串1出現(xiàn)的位置(用大于等于0的下標(biāo)值表示);
字符串2不存在會(huì)報(bào)錯(cuò)
"""
str2 = 'how are you? i am fine! thank you!'
print(str2.index('you')) # 8
print(str2.find('you123')) # 8
print(str2.find('you123')) # -1
# print(str2.index('you123')) # ValueError: substring not found
6.join
"""
字符串.join(序列) - 將序列中的元素用字符串連接在一起產(chǎn)生一個(gè)新的字符串铺呵;
序列中的元素是字符串
"""
str3 = '+'.join('abc')
print(str3) # a+b+c
str4 = ''.join(['name', 'age', 'gender'])
print(str4)
str5 = ''.join({'a': 1, 'b': 1})
print(str5) # ab
7.字符串替換
"""
1) 字符串1.replace(字符串2, 字符串3) -> 將字符串1中所有的字符串2都替換成字符串3
2)
字符串1.maketrans(字符串2,字符串3) -> 創(chuàng)建字符串2和字符串3一一對(duì)應(yīng)的映射表
字符串1.translate(替換的映射表)
"""
str2 = 'how are you? i am fine! thank you!'
new_str2 = str2.replace('you', 'me')
print(new_str2) # how are me? i am fine! thank me!
# 創(chuàng)建映射表
table = str.maketrans('a!', 'b+')
new_str2 = str2.translate(table) # 將字符串str2中所有的a都替換成b, 所有的!都替換成+
print(new_str2)
8.字符串切割
"""
字符串1.split(字符串2) - 將字符串1中所有的字符串2作為切割點(diǎn)切成多分
"""
str2 = 'how are you? i am fine! thank you!'
print(str2.split(' ')) # ['how', 'are', 'you?', 'i', 'am', 'fine!', 'thank', 'you!']