一.字符串的驻留机制
1.字符串
是Python中的基本数据类型,是一个不可变的字符序列
2.驻留机制
相同字符串只保留一份拷贝,即id相同
①几种情况(交互模式 cmd)
字符串的长度为0/1
s1=''
s2=''
s1 is s2 #True
符合标识符的字符串
s1='abc%'
s2='abc%'
s1==s2#False
s1 is s2#False
字符串只在编译时进行驻留,而非运行时
a='abc'
b='ab'+'c'
c=''.join(['ab,'c'])
a is b#True b在编译时完成
a is c#False c是在运行时开辟空间 所以不驻留
[-5,256]之间的整数数字
②强制驻留
import sys
s1='abc%'
s2='abc%'
a=sys.intern(b)
s1 is s2#True
③优缺点
避免频繁的创建和销毁,提升效率和节约内存
拼接字符串和修改字符串是比较影响性能的,故拼接字符串使用str类型的join方法,而非+,因为join()是先计算所有字符中的长度,然后再拷贝,只new一次对象,效率比+高
二.字符串的操作
1.查询
①index()查找子串substr第一次出现的位置,若子串不存在,抛出ValueError
②rindex()查找子串substr最后一次出现的位置,若子串不存在,抛出ValueError
③find()查找子串substr第一次出现的位置,若子串不存在,返回-1
④rfind()查找子串substr最后一次出现的位置,若子串不存在,返回-1
s='hello,hello'
print(s.index('lo'))#3
print(s.find('lo'))#3
print(s.rindex('lo'))#9
print(s.rfind('lo'))#9
2.大小写转换
①upper()将所有字符转成大写
②lower()将所有字符转成小写
③swapcase()将大写转成小写,将小写转成大写
④capitalize()首字母大写,其余小写
⑤title()把每个单词首字母大写,其余小写
s='hello,hello'
print(s,id(s))
a=s.upper()#产生一个新的字符串对象
print(a,id(a))
b=s.lower()#产生一个新的字符串对象
print(b,id(b))
3.对齐操作
①center()
居中对齐;第1个参数指定宽度;第2个参数(可选)指定填充符,默认为空格;若设置宽度小于实际宽度返回原字符串
②ljust()
左对齐;第1个参数指定宽度;第2个参数(可选)指定填充符,默认为空格;若设置宽度小于实际宽度返回原字符串
③rjust()
右对齐;第1个参数指定宽度;第2个参数(可选)指定填充符,默认为空格;若设置宽度小于实际宽度返回原字符串
④zfill()
右对齐,左边用0填充;只接受一个参数指定宽度;若设置宽度小于实际宽度返回原字符串
s='hello,Python'
print(s.center(20,'*'))#****hello,Python****
print(s.ljust(20,'*'))#hello,Python********
print(s.rjust(20))# hello,Python
print(s.zfill(20))#00000000hello,Python
print('-8910'.zfill(8))#-0008910
4.劈分操作
①split()
从字符串左边开始劈分,默认的劈分字符为空格字符串,返回的值都是一个列表
通过参数sep指定劈分字符串是的劈分符
参数maxplit指定最大劈分次数,在经过最大次劈分之后,剩余子串单独作为一部分
②rsplit()
从字符串右边开始劈分,默认的劈分字符为空格字符串,返回的值都是一个列表
通过参数sep指定劈分字符串是的劈分符
参数maxplit指定最大劈分次数,在经过最大次劈分之后,剩余子串单独作为一部分
s='hello world Python'
lst=s.split()
print(lst)#['hello', 'world', 'Python']
s1='hello|world|Python'
print(s1.split(sep='|',maxsplit=1))#['hello', 'world|Python']
print(s1.rsplit(sep='|',maxsplit=1))#['hello|world', 'Python']
5.判断字符串操作
①isidentifier()判断指定的字符串是否为合法标识符
②isspace()判断指定的字符串是否全部由空白字符组成(回车、换行、水平制表符)
③isalpha()判断指定的字符串是否全部由字母组成
④isdecimal()判断指定的字符串是否全部由十进制数字组成
⑤isnumeric()判断指定的字符串是否全部由数字组成
⑥isalnum()判断指定的字符串是否全部由字母和数字组成
6.字符串的替换、合并
①replace()
第1个参数指定被替换的子串,第2个参数指定替换子串的字符串;该方法返回替换后得到的字符串,替换前的字符串不发生改变;调用该方法时可以通过第3个参数指定最大替换次数
②join()
将列表或元组中的字符串合并成一个字符串
s='hello,Python,Python,Python'
print(s.replace('Python',"Java",2))#hello,Java,Java,Python
lst=['hello','java','Python']
print('|'.join(lst))#hello|java|Python
print(''.join(lst))#hellojavaPython
t=('hello','java','Python')
print(''.join(t))#hellojavaPython
print('*'.join('Python'))#P*y*t*h*o*n
7.字符串的比较
>、>=、<、<=、==、!=
区别:==(内容)与is(地址)
#字符串的比较 ord()与chr()互为逆过程
print(ord('a'),ord('b'))#97 98
print(chr(97),chr(98))#a b
8.字符串的切片
切片操作产生新对象
s='hello,Python'
s1=s[:5]#产生新对象
s2=s[6:]#产生新对象
s3='!'#产生新对象
newstr=s1+s3+s2#产生新对象
print(newstr)#hello!Python
print(newstr[::-1])#nohtyP!olleh
三.格式化字符串
1.%作占位符
%s——字符串
%i或%d——整数
%f——浮点数
2.{}作占位符
3.f
#%
name='张丹'
age=20
print('我叫%s,今年%d岁' % (name,age))#我叫张丹,今年20岁
#{}
print('我叫{0},今年{1}岁了,我真的叫{0}'.format(name,age))#我叫张丹,今年20岁了,我真的叫张丹
#f字符串
print(f'我叫{name},今年{age}岁了')#我叫张丹,今年20岁了
#宽度
print('%10d' % 99)# 99
#浮点数精度:小数点后几位
print('%.3f' % 3.1415926)#3.142
print('{0:.3}'.format(3.1415926))#3.14 这里指一共三位数
print('{:.3f}'.format(3.1415926))#3.142
print('{:10.3f}'.format(3.1415926))# 3.142
四.字符串的编码转换
1.为什么要字符串编码转换?
A计算机str在内存中以Unicode表示,编码为byte字节传输,解码到B计算机显示
2.编码、解码
编码:将字符串转换为二进制数据(bytes)
解码:将bytes类型转换成字符串
#编码与解码
s='天涯共此时'
#编码
print(s.encode(encoding='GBK'))#在GBK编码格式中,一个中文占两个字节 b'\xcc\xec\xd1\xc4\xb9\xb2\xb4\xcb\xca\xb1'
print(s.encode(encoding='UTF-8'))#在UTF-8编码格式中,一个中文占三个字节 b'\xe5\xa4\xa9\xe6\xb6\xaf\xe5\x85\xb1\xe6\xad\xa4\xe6\x97\xb6'
#解码
#byte代表一个二进制数据
byte=s.encode(encoding='GBK')#编码
print(byte.decode(encoding='GBK'))#解码 天涯共此时