字符串的驻留机制
- 什么叫字符串驻留机制呢?
仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串的驻留池中,Python的驻留机制对相同的字符串只保留一份拷贝,后续创建相同字符串时,不会开辟新空间,而是把该字符串的地址赋给新创建的变量 - 驻留机制的几种情况(交互模式)
- 字符串的长度为0或1时
- 符合标识符(由数字、下划线、字母组成,不能以数字开头,不能包含空格)的字符串
- 字符串只在编译时进行驻留,而非运行时
- [-5,256]之间的整数数字
- sys中的intern方法强制2个字符串指向同一个对象
- 在需要进行字符串拼接时建议使用 str类型的join方法,而非+ ,因为join()方法是先计算出所有字符中的长度,然后再拷贝,只new一次对象,效率要比"+"效率高
字符串的查找
#index,如果找不到抛出ValueError
a = 'hello world'
print(a.index('l')) #2
print(a.index('l',3)) #3,指定起始的查找位置
#rindex,查找字符串最后一次出现的位置
print(a.rindex('l')) #9
#find,如果找不到元素,不是报错,而是返回-1
print(a.find('l')) #2
print(a.find('l',3)) #3,指定起始的查找位置
#rfind,查找字符串最后一次出现的位置
print(a.rfind('l')) #9
#切片,索引与列表相同
print(a[0]) #h,字符串类型
字符串的修改
- 字符串不可修改,如果需要修改字符串,那么需要调用字符串内置的方法并且重新赋值(id都变了)
- 修改
#replace
a = 'hello world'
print(a,id(a)) #hello world 1706091134704
b = a.replace('o','e') #字符串中需要修改几个就修改几个
print(b,id(b)) #helle werld 1706091134832
c = a.replace('o','e',1) #可以限制修改次数,从前往后
print(c) #helle world
#join
print('-'.join(['hello','world'])) #hello-world,将列表或元组中的字符串连接成一个字符串
print('-'.join('python')) #p-y-t-h-o-n
#upper
a = 'hello world'
b = a.upper() #将小写字母全部变成大写
print(b,id(b)) #HELLO WORLD 2592704413360
#lower
c = b.lower() #将大写字母全部变成小写
print(c,id(c)) #hello world 2592704413552
#swapcase
a1 = 'hELlo WoRld'
b1 = a1.swapcase() #将小写字母全部变成大写,将大写字母全部变成小写
print(b1) #HelLO wOrLD
#capitalize
c1 = a1.capitalize() #字符串首字母大写,其余转为小写
print(c1) #Hello world
#title
d1 = a1.title() #每个单词首字母大写,其余转为小写
print(d1) #Hello World
#center
a = 'hello world'
print(a.center(19)) #□□□□hello world□□□□,居中对齐,第一个参数指定宽度,第二个参数(可选)指定填充符,默认是空格
print(a.center(19,'*')) #****hello world****
print(a.center(10)) #hello world,宽度小于原字符串宽度则返回原字符串
#ljust
print(a.ljust(15)) #hello world□□□□,左对齐,第一个参数指定宽度,第二个参数(可选)指定填充符,默认是空格
print(a.ljust(15,'*')) #hello world****
print(a.ljust(10)) #hello world,宽度小于原字符串宽度则返回原字符串
#rjust
print(a.rjust(15)) #□□□□hello world,右对齐,第一个参数指定宽度,第二个参数(可选)指定填充符,默认是空格
print(a.rjust(15,'*')) #****hello world
print(a.rjust(10)) #hello world,宽度小于原字符串宽度则返回原字符串
print('-1'.rjust(5)) # -1
#zfill
print(a.zfill(15)) #0000hello world,右对齐,左边用0填充,只接收一个参数指定宽度
print(a.zfill(10)) #hello world,宽度小于原字符串宽度则返回原字符串
print('-1'.zfill(5)) #-0001
#strip,去除字符串两端的空格
a = ' hello world '
f = a.strip()
print(f) #hello world
#lstrip,去除左边的空格
g = a.lstrip()
print(g) #hello world□
#rstrip,去除右边的空格
h = a.rstrip()
print(h) #□hello world
字符串的切割
#split
a = 'hello world'
b =a.split() #对字符串进行切割,从左开始,默认以空格作为分割符
print(b) #['hello', 'world'] #切割之后的元素会放在一个列表当中,可与join()连用
c = a.split('l') #以'l'作为分割符
print(c) #['he', '', 'o wor', 'd'](''为两个l之间的)
d = a.split('l',maxsplit=1) #指定切割次数,maxsplit可以省略
print(d) #['he', 'lo world']
#还可以以单词作为切割符
#rsplit
b =a.rsplit() #可以对字符串进行切割,从右开始
print(b) #['hello', 'world']
c = a.rsplit('l')
print(c) #['he', '', 'o wor', 'd']
d = a.rsplit('l',maxsplit=1)
print(d) #['hello wor', 'd']
字符串的判断
#isalpha
print('hello我'.isalpha()) #True,判断是否全由字母组成
print('hello world'.isalpha()) #False,有空格
#isdigit,判断是否全是数字组成
print('123'.isdigit()) #True
print('123'.isdigit()) #True
print(b'123'.isdigit()) #True,二进制
print('123.5'.isdigit()) #False
print('123一'.isdigit()) #False
print('ⅠⅡⅢ'.isdigit()) #False
#isdecimal,判断是否由十进制的数字组成
print('123'.isdecimal()) #True
print('123'.isdecimal()) #True
print(b'123'.isdecimal()) #AttributeError,二进制
print('123.5'.isdecimal()) #False
print('123一'.isdecimal()) #False
print('ⅠⅡⅢ'.isdecimal()) #False
#isnumeric,判断是否全部由数字组成
print('123'.isnumeric()) #True
print('123'.isnumeric()) #True
print(b'123'.isnumeric()) #AttributeError,二进制
print('123.5'.isnumeric()) #False
print('123一'.isnumeric()) #True
print('ⅠⅡⅢ'.isnumeric()) #True
#islower
b = 'abc'
print(b.islower()) #True,判断是否全是小写
#isupper
c = 'ABC'
print(c.isupper()) #True,判断是否全是大写
#isidentifier
print('hello.world'.isidentifier()) #False,判断是否是合法的标识符
print('张三'.isidentifier()) #True
#isalnum
print('abc123'.isalnum()) #True,判断是否全部由数字和字母组成
print('张三123'.isalnum()) #True
字符串的转义(print解析才有用)
- 换行符:n
- 水平制表符:t(python中8个字符对齐)
- 退格键(删除键):b
print('hellobworld') #hellworld
print('hello\nworld') #hellonworld
print('http:\www.baidu.com') #http:www.baidu.com
print('http:\\www.baidu.com') #http:\www.baidu.com
- 统一取消转义:r或R
注意:原始字符串最后的内容不能是一个反斜杠,可以是两个反斜杠
print(r'hellonworld') #hellonworld
print(R'hellonworld') #hellonworld
print('妈妈说:'吃饭了'') #妈妈说:'吃饭了'
print('hellorworld') #world
字符串的编码
- encode编码,默认utf-8
- decode解码,默认utf-8
- 以什么格式编码就以什么格式解码
print('你好'.encode()) #b'xe4xbdxa0xe5xa5xbd'
print('你好'.encode('utf-8')) #b'xe4xbdxa0xe5xa5xbd'
print('你好'.encode(encoding='utf-8')) #b'xe4xbdxa0xe5xa5xbd'
print(b'xe4xbdxa0xe5xa5xbd'.decode()) #你好
print(b'xe4xbdxa0xe5xa5xbd'.decode('utf-8')) #你好
print(b'xe4xbdxa0xe5xa5xbd'.decode(encoding='utf-8')) #你好
字符串的比较
- 比较规则:首先比较两个字符串中的第一个字符,如果相等则继续比较下一个字符,依次比较下去,直到两个字符串中的字符不相等时,其比较结果就是两个字符串的比较结果,两个字符串中的所有后续字符将不再被比较
- 比较原理:两上字符进行比较时,比较的是其ordinal value(原始值),调用内置函数ord可以 得到指定字符的ordinal value。与内置函数ord对应的是内置函数chr,调用内置函数chr时指定ordinal value可以得到其对应的字符