23.字符串
-
在Python中字符串时基本数据类型,是一个不可变的字符序列。
-
可以用’ ‘、" “、”’ '"。
-
字符串的驻留机制
- 仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串的驻留池中,Python的驻留机制对相同的字符串只保留一份拷贝,后续创建相同字符串时,不会开辟新空间,而是把字符串的地址赋给新创建的变量。
a = 'Python' b = "Python" c = '''Python''' print(a, id(a)) print(b, id(b)) print(c, id(c)) # 输出的结果 Python 1874508798960
- 驻留机制的集中情况(在交互模式下)
- 字符串的长度为0或1时。
- 符合标识符的字符串(字母数字下划线)。
- 字符串旨在编译时进行驻留,而非运行时。
- [-5, 256]之间的整数数字。
- sys中的intern方法强制2个字符串指向同一个对象。
- PyCharm对字符串进行了优化处理。
- 字符串驻留机制的优缺点
- 当需要值相同的字符串时,可以直接从字符串池里拿来使用,避免频繁的创建和销毁,提升效率和节约内存,因此拼接字符串和修改字符串是会比较影响性能的。
- 在需要进行字符串拼接时建议使用str类型的join方法,而非+,因为join()方法是先计算出所有字符串中的长度,然后再拷贝,只new一次对象,效率要比"+"效率高。
24.字符串中查询操作
# 字符串的查询操作
s = 'helllo,hello'
print(s.index('lo')) # 3
print(s.find('lo')) # 3
print(s.rindex('lo')) # 9
print(s.rfind('lo')) # 9
print(s.index('k')) # ValueError:
print(s.find('k')) # -1
25.字符串的大小写转换操作
# 字符串的大小写转换
s = 'hello,python'
a = s.upper() # 转成大写后,会产生一个新的字符串对象
b = s.lower() # 转换之后,会产生一个新的字符串对象
S2 = 'hello, Python'
print(s2.swapcase())
print(s2.title())
26.字符串内容对齐操作
s = 'hello,Python'
print(s.center(20,'*'))
print(s.ljust(20,'*'))
print(s.rjust(20,'*'))
27.字符串劈分操作
s = 'hello world Python'
lst = s.split()
print(lst) # ['hello', 'world', 'Python']
s1 = 'hello|world|Python'
print(s1.split(sep='|')) # ['hello', 'world', 'Python']
print(s1.split(sep='1',maxsplit=1)) # ['hello', 'world|Python']
# rsplit()从右侧开始劈分
print(s.rsplit())
print(s1.rsplit('|'))
print(s1.rsplit(sep='|', maxsplit=1))
28.判断字符串操作的方法
s = 'hello,python'
print('1.', s.isidentifier()) # False
print('2.', 'hello'.isidentifier()) # True
print('3.', '张三_'.isidentifier()) # True
print('4.', '张三_123'.isidentifier()) # True
print('5.', '\t'.isspace()) # True
print('6.', 'abc'.isalpha()) # True
print('7.', '张三'.isalpha()) # True
print('8.', '张三1'.isalpha()) # False
print('9.', '123'.isdecimal()) #True
print('10.', '123四'.isdecimal()) # False
print('11.', '123'.isnumeric()) #True
print('12.', '123四'.isnumeric()) # True
print('13.', 'abc1'.isalnum()) #True
print('14.', '法外狂徒张三123'.isalnum()) # True
print('15.', 'abc!'.isalnum()) #False
29.字符串操作其他方法
s = 'hello,Python'
print(s.replace('Python', 'Java')) # hello,Java
s1 = 'hello,Python,Python,Python'
print(s1.replace('Python','Java',2)) # hello,Java,Java,Python
lst = ['hello','Java', 'Python']
print('|'.join(lst)) # hello|Java|Python
t = ('hello', 'Java', 'Python')
print(''.join(t)) # helloJavaPython
print('*'.join('Python')) # P*y*t*h*o*n
30.字符串的比较操作
- 运算符:>, >=, <, <=, ==, !=
- 比较规则:首先比较两个字符串中的第一个字符串,如果相等则继续比较下一个字符串,依次比较下去,知道两个字符串中的字符不相等时,其比较结果就是两个字符串比较的结果,两个字符串中的所有后续字符串将不再进行比较。
- 比较原理:两个字符串进行比较时,比较的是其ordinal value(原始值),调用内置函数ord可以得到指定字符的ordinal value。与内置函数ord对应的是内置函数chr,调用内置函数chr时,指定ordinal value可以得到其对应的字符。
31.字符串的切片操作
- 字符串时不可变类型
- 不具备增、删、改等操作
- 切片操作将产生新的对象
32.格式化字符串
-
格式化字符串的两种方式
-
%作占位符
-
{}作占位符
# 格式化字符串 # % 占位符 name = '张三' age = 20 print('我叫%s,今年%d岁' % (name,age)) # {} 占位符 print('我叫{0},今年{1}岁'.format(name, age)) # f-string print(f'我叫{name}, 今年{age}岁') print('%10d' % 99) # 10表示的是宽度 print('%.3f' % 3.1415926) # .3表示是小数点后三位 # 同时表示宽度和精度 print('10.3f' % 3.1415726) # 一共总宽度10 小数点后3位 print('{0}'.format(3.1415926)) print('{0:.3}'.format(3.1415926)) # .3表示的是一共有三位数 print('{0:.3f}'.format(3.1415926)) # .3f表示的是有三位小数 print('{0:10.3f}'.format(3.1415926)) # 同时设置宽度和精度,10表示宽度为10,.3f表示的是有三位小数
-
33.字符串的编码
-
为什么需要字符串的编码转换
-
编码与解码的方式
- 编码:将字符串转换为二进制数据(bytes)
- 解码:将bytes类型的输转换成字符串类型
s = '法外狂徒张三' # 编码 print(s.encode(encoding='GBK')) # 在GBK编码格式中,一个中文占两个字节 print(s.encode(encoding='UTF-8')) # 在UTF-8编码格式中,一个中文占三个字节 #解码 # byte代表就是一个二进制数据(字节类型的数据) byte = s.encode(encoding='GBK') print(byte.decode(encoding='GBK'))