一、字符串的驻留机制
字符串是不可变的字符序列,不同的值被存放在字符串的驻留池中,Python的驻留机制对相同的字符串只保留一份拷贝,后续创建相同字符串时,不会开辟新空间。而是把字符串的地址付给新创建的变量。(仅保存一份相同的且不会改变的
a= ‘hello‘ b = "hello" c = ‘‘‘hello‘‘‘ print(a,id(a)) print(b,id(b)) print(c,id(c))
结果:
hello 2517227894184
hello 2517227894184
hello 2517227894184
驻留机制的几种的情况:
(1)字符串长度为0或1
(2)符合标识符的字符串
(3)字符串只在编译时驻留,而非运行时
a= ‘abc‘ b = "ab"+‘c‘ c = ‘‘.join([‘ab‘,‘c‘]) print(a,id(a)) print(b,id(b)) print(c,id(c))
结果:
abc 2489126615224
abc 2489126615224
abc 2489127420904
虽然a,b,c的输出结果都是abc,但是a,b有相同的内存空间,与c不同。是因为a,b的内存空间是在编译时分配,由于a与b内容相同,所以指向同一块内存空间。而c是在程序运行过程中利用join()方法重新开辟的新的内存空间,所以不同。
(4)【-5,256】之间的整数数字
驻留机制的优缺点
当需要值相同的字符串时,可以直接从字符串池中拿来使用,避免频繁的创建和销毁,提升效率和节约内存,因此拼接字符串和修改字符串时比较影响性能的。
进行字符串拼接是建议使用str类型的join方法,而非+,因为join()方法是先计算出所有字符串中的长度,然后在拷贝,只new一次对象,效率要比+高。
二、字符串的查询操作的方法
index() 查找子串substr第一次出现的位置,如果查找的子串不存在,抛出异常
rindex() 查找子串substr最后一次出现的位置,如果查找的子串不存在,抛出异常
find() 查找子串substr第一次出现的位置,如果查找的子串不存在时,则返回-1
rfind()查找子串substr最后一次出现的位置,如果查找的子串不存在时,则返回-1
s = ‘hello,hello‘ print(s.index(‘lo‘)) print(s.find(‘lo‘)) print(s.rindex(‘lo‘)) print(s.rfind(‘lo‘))
结果:
3
3
9
9
建议大家使用find()
三、字符串的大小写转化操作的方法
upper() 所有字符转成大写字母l
lower() 所有字符都转成小写字母
swapcase() 字符串中所有大写转成小写字母,所有小写字母转成大写字母
capitalize() 第一个字符转换为大写,其余字符转换为小写
title() 每一个字符的第一个字符转换为大写,把每个单词的剩余字符转换为小写
四、字符串的劈分操作的方法
split()
rsplit()
s = ‘hello,python you‘ lst = s.split() print(lst) print(s.split(sep=‘,‘))
结果:
[‘hello,python‘, ‘you‘]
[‘hello‘, ‘python you‘]
五、字符串的一系列操作
isidentifier() 判断字符串是否合法,符合标识符命名规则
ispace() 判断指定的字符串是否全部是由空白字符组成(回车、换行、水平制表符)
isalpha() 判断指定的字符串全部由字母组成
isdecimal() 判断指定字符串是否全部由十进制的数字组成
isnumeric() 判断指定的字符串是否全部由数字组成
isalnum() 判断指定字符串是否全部由字母和数字组成
replace() 字符串替换
join() 字符串的合并,将列表或元组中的字符串合并为一个字符串
s =‘hello,python,you‘ print(s.replace(‘hello‘,‘Hello‘)) s1 = [‘hello,python‘,‘you‘] print(‘*‘.join(s1))
结果:
Hello,python,you
hello,python*you
六、字符串的比较操作
比较规则:首先比较两个字符串中的第一个字符,如果相等则继续比较下一个字符,一次比较下去,直到出现字符不相等时,其比较结果就是字符串的比较结果,两个字符串中的所有后续字符将不再被比较
比较原理:两个字符进行比较时,比较的是其ordinal value(原始值),调用内置函数ord可以得到指定字符的ordinal value。与内置函数ordUI应的是内置函数chr,调用内置函数chr时指定ordinal value可以得到其对应的字符
print(‘apple‘>‘app‘) print(ord(‘a‘),chr(97))
结果:
True
97 a
七、字符串的切片操作
字符串是不可变类型
不具备增删改等操作,切片操作将产生新的对象
格式化字符串:按一定格式输出的字符串
%:占位符
{}:占位符
name = ‘张三‘ #%作占位符 age = 20 print(‘我叫%s,今年%d岁‘ % (name,age))#元组 #{}做占位符 print(‘我叫{0},今年{1}岁‘.format(name,age))#format方法 #f-string print(f‘我叫{name},今年{age}岁‘) #表示的精度和宽度 print(‘%10d‘ % 99) #10表示的是宽度 print(‘%.3f‘ % 3.1415926)# .3表示小数点后保留三位 print(‘%10.3f‘ % 3.1415926)#表示总宽度为10,且小数点后保留三位 print(‘{0:.3}‘.format(3.1415926))#.3表示一共是三位小数 print(‘{:.3f}‘.format(3.1415926))#.3f表示是三位小数 print(‘{0:10.3f}‘.format(3.1415926))#同时设置宽度和精度,宽度是10,精度是3位小数
八、字符串的编码转换
二进制数据
编码 解码
s = ‘天涯共此时‘ print(s.encode(encoding=‘GBK‘))#在GBK中一个中文占两个字节 byte = s.encode(encoding="GBK") print(byte.decode(encoding=‘GBK‘))
原文:https://www.cnblogs.com/beatuy/p/14406121.html