字符串
定义
- 基本数据类型之一,是一个不可变的字符序列
字符串的驻留机制(了解)
概念
- Python的驻留机制对相同的字符串只保留一份拷贝,后续创建相同字符串时,不会开辟新空间,而是把该字符串的地址赋给新创建的变量
为驻留机制的几种情况(交互模式:win+R+python)
-
字符串长度为0或1时
-
符合标识符的字符串(只包含数字、下划线、字母且数字不可以开头)
-
[-5,256]之间的整数数字
- 字符串只在编译时进行驻留,而非运行时
- ==用于判断值是否相等,is用于判断地址是否相同
-
见下图
PyCharm对字符串进行了优化处理
字符串驻留机制的优缺点
- 当需要值相同的字符串时,可以直接从字符串池里拿来使用,避免频繁的创建和销毁,提升效率和节约内存,因此拼接字符串和修改字符串是会比较影响性能的。
- 在需要进行字符串拼接时建议使用str类型的join方法,而非+
,因为join()方法是先计算出所有字符中的长度,然后再拷贝,只new一次对象,效率要比"+"效率高。
字符串的常用查询操作
-
index( )、rindex( )、find( )、rfind( )
s = 'james,james' print(s.index('es')) #3 print(s.find('es')) #3 print(s.rindex('es')) #9 print(s.rfind('es'))#9 #print(s.index('h')) #报错 print(s.find('h')) #print(s.rindex('h')) print(s.rfind('h'))
字符串的大小写转换操作
-
upper( )、lower( )、swapcase( )、capitalizes( )、title( )
字符串的对齐操作
-
center( )、ljust( )、rjust( )参数类似,zfill( )用0补充
s = 'James,jamess' #居中对齐 print(s.center(20,'*')) #左对齐 print(s.ljust(20,'*')) print(s.ljust(12,'*')) print(s.ljust(20)) #右对齐 自动默认使用0来补位 print(s.zfill(20)) print(s.zfill(12)) print('-234'.zfill(8))
字符串的分隔操作
-
split( )、 rsplit( )
s = 'hello James boy' lst = s.split() #默认" "为标记来分割 print(lst) #默认是从左到右进行分割 s1 = 'hello|James|boy' print(s1.split(sep='|')) print(s1.split(sep='|',maxsplit=1)) #从右到左分割 s1 = 'hello|James|boy' print(s1.rsplit(sep='|')) print(s1.rsplit(sep='|',maxsplit=1))
判断字符串组成的方法
-
isidentifier( )、isspace( )、isalpha( )、isdecimal( ) 、isalnum( )
s = 'hello,James,boy' print('1.', s.isidentifier()) #False print('2.', 'james'.isidentifier()) #True print('3.', 'james_'.isidentifier()) #True print('4.', 'james_123'.isidentifier()) #True print('5.', '\n'.isspace()) #True print('6.', 'abc1'.isalpha()) #True print('7.', 'abc1'.isdecimal()) #False print('8.', '12'.isdecimal()) #True print('9.', '12'.isnumeric()) #True print('10.', '12四'.isnumeric()) #True print('11.', 'abc1'.isalnum()) #True print('12.', 'abc1!'.isalnum()) #False
字符串的替换和合并
-
-
replace( )
#replace替换 s = 'hello,James,boy' print(s.replace('James','python'))#s的内容不变 s1 = 'hello, james,james,james' print(s1.replace('james','python',2))
-
join( )
#列表join连接 lst = ['hello','James','boy'] print('|'.join(lst))#hello|James|boy #元组join连接 tt = ('hello','James','boy') print('*'.join(tt))#hello*James*boy print(''.join(tt))#helloJamesboy
字符串的比较操作
-
比较运算符:>,>=,<,<=,==,!=
-
比较规则: 首先比较两个字符串中的第一个字符,如果相等则继续比较下一个字符,依次比较下去,直到两个字符串中的字符不相等时,其比较结果就是两个字符串的比较结果,两个字符串中的所有后续字符将不再被比较
-
比较原理: 两字符进行比较时,比较的是其ordinal value(原始值),调用内置函数ord可以得到指定字符的ordinal
value。与内置函数ord对应的是内置函数chr,调用内置函数chr时指定ordinal value可以得到其对应的字符print('james' > 'ja') #True print('james' > 'kate') #False print(ord('j'), ord('k')) #106 107 print(chr(106),chr(107)) #'j' 'k'
==比较的是值,is比较的是id
字符串的切片
-
字符串是不可变类型,改变其内容将产生新的对象
s = 'hello,James' s1 = s[:5] #从0到5, 不包括5 s2 = s[6:] s3 = '!' newstr = s1+s2+s3 print(s1, id(s1)) print(s2, id(s2)) print(newstr, id(newstr)) #三者id都不一样
-
切片[start : end : step],规则见列表切片
s = 'hello,James' print(s[:5]) #从0到5, 不包括5 print(s[6:]) print(s[1:5:1]) print(s[::1]) #省去就是头和尾 print(s[::-1]) print(s[-6::1])
格式化字符串
-
%作占位符
- %s,字符串
- %i或%d,整数
- %f,浮点数
#占位符 % name = 'James' age = 36 print(name, age) print('我叫%s, 今年%d' %(name,age))
-
{ }做占位符
#用{}定位位置 name = 'James' age = 36 print('我叫{0},今年{1}岁'.format(name, age))
-
f’{直接填充}’
#直接填充 name = 'James' age = 36 print(f'我叫{name},今年{age}岁')
字符串的编解码
-
encoding=‘GBK’:1个中文占2个字节
-
encoding=‘UTF-8’:1个中文占3个字节
-
编码:encode( ),把字符串转化为二进制
s = '我很帅' #编码encode print(s.encode(encoding='GBK')) #打印二进制,1个中文占2个字节 print(s.encode(encoding='UTF-8'))#打印二进制,1个中文占3个字节
-
解码:decode( ),把二进制转化为字符串
byte = s.encode(encoding='GBK') print(byte) #打印二进制 print(byte.decode(encoding='GBK')) #打印中文 byte = s.encode(encoding='UTF-8') print(byte) #打印二进制 print(byte.decode(encoding='UTF-8')) #打印中文