作者:梦幻死灵_791 | 来源:互联网 | 2023-09-16 10:45
字符串
字符串的驻留机制
在Python中字符串是基本数据类型,是一个不可变的字符序列
仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串的驻留池中,Python的驻留机制对相同的字符串只保留一份拷贝,后续创建相同字符串时,不会开辟新空间,而是把该字符串的地址赋给新创建的变量
驻留机制的几种情况(交互模式)
- 字符串的长度为0或1时
- 符合标识符的字符串---->数字、字母、下划线组成的字符串
- 字符串只在编译时进行驻留,而非运行时
- [-5,256]之间的整数数字
符合标识符的字符串:
s1 = 'a_'
s2 = 'a_'
print(s1 == s2) #True
print(s1 is s2) #True
print(id(s1)) #2917529052080
print(id(s2)) #2917529052080
不符合标识符的字符串:
s1 = 'abc%'
s2 = 'abc%'
print(s1 == s2) #True
print(s1 is s2) #False
print(id(s1)) #2917528987056
print(id(s2)) #2917528987376
字符串只在编译时进行驻留,而非运行时:
s1 = 'abc'
s2 = 'a'+'bc'
s3 = ''.join(['a','bc'])print(s1 == s2) #True
print(s1 == s3) #Trueprint(s1 is s2) #True
print(s1 is s3) #Falseprint(type(s1)) #
print(type(s2)) #
print(type(s3)) #print(id(s1)) #2917494471664
print(id(s2)) #2917494471664
print(id(s3)) #2917528925424
驻留机制的优缺点
- 当需要值相同的字符串时,可以直接从字符串池里拿来使用,避免频繁的创建和销毁,提升效率和节约内存,因此拼接字符串和修改字符串是会比较影响性能的。
- 在需要进行字符串拼接时建议使用str类型的join方法,而非+,因为join()方法是先计算出所有字符中的长度,然后再拷贝,只new一次对象,效率要比"+"效率高
字符串的常用操作
字符串的查询操作
1、index()
查找子串substr第一次出现的位置,如果查找的子串不存在时,则抛出ValueError
2、rindex()
查找子串substr最后一次出现的位置,如果查找的子串不存在时,则抛出ValueError
3、find()
查找子串substr第一次出现的位置,如果查找的子串不存在时,则返回-1
4、rfind()
查找子串substr最后一次出现的位置,如果查找的子串不存在时,则返回-1
字符串的大小写
1、upper()
把字符串中所有字符都转成大写字母
2、lower()
把字符串中所有字符都转成小写字母
3、swapcase()
把字符串中所有大写字母转成小写字母,把所有小写字母都转成大写字母
4、capitalize()
把第一个字符转换为大写,把其余字符转换为小写
5、title()
把每个单词的第一个字符转换为大写,把每个单词的剩余字符转换为小写
字符串内容对齐的操作
1、center()
居中对齐,第1个参数指定宽度,第2个参数指定填充符,第2个参数是可选的,默认是空格,如果设置宽度小于实际宽度则返回原字符串
2、ljust()
左对齐,第1个参数指定宽度,第2个参数指定填充符,第2个参数是可选的,默认是空格,如果设置宽度小于实际宽度则则返回原字符串
3、rjust()
右对齐,第1个参数指定宽度,第2个参数指定填充符,第2个参数是可选的,默认是空格,如果设置宽度小于实际宽度则则返回原字符串
4、zfill()
右对齐,左边用0填充,该方法只接收一个参数,用于指定字符串的宽度,如果指定的宽度小于等于字符串的长度,返回字符串本身
如果是负数,在负号后面填0
字符串的分割
split()
- 从字符串的左边开始劈分,默认的劈分字符是空格字符串,返回的值是一个列表
- 以通过参数sep指定劈分字符串是的劈分符
- 通过参数maxsplit指定劈分字符串时的最大劈分次数,在经过最大次劈分之后,剩余的子串会单独做为一部分
rsplit()
- 从字符串的右边开始劈分,默认的劈分字符是空格字符串,返回的值都是一个列表
- 以通过参数sep指定劈分字符串是的劈分符
- 通过参数maxsplit指定劈分字符串时的最大劈分次数,在经过最大次劈分之后,剩余的子串会单独做为一部分
字符串的替换
replace()
第1个参数指定被替换的子串,第2个参数指定替换子串的字符串,该方法返回替换后得到的字符串,替换前的字符串不发生变化,调用该方法时可以通过第3个参数指定最大替换次数
字符串的合并
join()
将列表或元组中的字符串合并成一个字符串
list = ['aa','bb','cc']
print("*".join(list)) #aa*bb*cc
在字符串中的每一个字符间加入合并符,合成一个新的字符串
str= 'abc'
print("*".join(str)) #a*b*c
str = 'a bc'
print("*".join(str)) #a* *b*c
字符串的比较
运算符&#xff1a;>,<,>&#61;,<&#61;,&#61;&#61;,!&#61;
比较规则:首先比较两个字符串中的第一个字符&#xff0c;如果相等则继续比较下一个字符&#xff0c;依次比较下去&#xff0c;直到两个字符串中的字符不相等时&#xff0c;其比较结果就是两个字符串的比较结果&#xff0c;两个字符串中的所有后续字符将不再被比较
比较原理:两上字符进行比较时&#xff0c;比较的是其ordinal value(原始值),调用内置函数 ord 可以得到指定字符的ordinal value。与内置函数ord对应的是内置函数chr,调用内置函数chr时指定ordinal value可以得到其对应的字符
ord(&#39;a&#39;)
#97
ord(&#39;b&#39;)
#98chr(97)
#&#39;a&#39;
字符串的切片
切片 [start&#61;0:end&#61;str.len():step&#61;1]
注意&#xff1a;如果step<0
str&#61;&#39;apple&#39;
str1 &#61; str[::-1]
print(str1)#elppa
print(str[::-2])
#epa
如果start或者end为负数
str&#61;&#39;apple&#39;
print(str[-3::])
#ple
格式化字符串
格式化字符串的两种方式
1、%作占位符
例如&#xff1a;
&#39;你好&#xff0c;我的名字是:%s,今年:%d岁了&#39;%(name,age)
小括号中是实际值
2、{}作占位符
例如&#xff1a;
&#39;你好&#xff0c;我的名字是:{0},今年:{1}岁了&#39;.format(name,age)
小括号中是实际值
3、f
例如&#xff1a;
f&#39;你好&#xff0c;我的名字是:{name},今年:{age}岁了&#39;
整数 &#39;%<宽度>d&#39;%实际值 浮点数 &#39;%<宽度>.<小数点后n位>f&#39;%实际值&#39;{占位:.<表示几位数>}&#39;.format(实际值)&#39;{占位:.<小数点后n位>f}&#39;.format(实际值)#占位可以不写
字符串的编码与解码
编码&#xff1a;将字符串转换为二进制数据
解码&#xff1a;将bytes类型的数据转化为字符串类型
编码
str &#61; &#39;你好&#xff0c;中国&#39;
print(str.encode(encoding&#61;&#39;GBK&#39;)) #b&#39;\xc4\xe3\xba\xc3\xa3\xac\xd6\xd0\xb9\xfa&#39;
print(str.encode(encoding&#61;&#39;UTF-8&#39;)) #b&#39;\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8c\xe4\xb8\xad\xe5\x9b\xbd&#39;
解码
str &#61; &#39;你好&#xff0c;中国&#39;
a &#61; str.encode(encoding&#61;&#39;GBK&#39;)
print(a.decode(encoding&#61;&#39;GBK&#39;)) #你好&#xff0c;中国
b &#61; str.encode(encoding&#61;&#39;UTF-8&#39;)
print(b.decode(encoding&#61;&#39;UTF-8&#39;)) #你好&#xff0c;中国