Python字符串
字符串
1.字符串的驻留机制
字符串
在Python中字符串是基本数据类型,是一个不可变的字符序列
什么叫字符串驻留机制呢?
仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串的驻留池中,Python的驻留机制对相同的字符串只保留一份拷贝,后续创建相同字符串时,不会开辟新空间,而是把该字符的地址赋给新创建的变量
#字符串的驻留机制
a='hello'
b="hello"
c='''hello'''
print(a,id(a))
print(b,id(b))
print(c,id(c))
输出:
hello 2659185572144
hello 2659185572144
hello 2659185572144
id相同这说明对象a,b,c在内存当中只有一份
驻留机制的几种情况(交互模式)
字符串的长度为1或0时
说明两个对象在内存当中时开了一个内存空间
符合标识符的字符串
·当字符串符合标识符时,
这说明两个对象在内存中开了两个内存空间,内容虽相同,却用两个空间存储
·当字符串属于标识符时,
这时候就产生了驻留,内存地址相同
字符串旨在编译时进行主流,而非运行时
为什么没有产生驻留呢?
因为b的值是在运行之前就已经连接完毕,而c中的这个join操作是在运行时,在程序运行时会开新的内存空间。
[-5,256]之间的整数数字
因为-6不在[-5,256]范围内,所以不产生驻留
sys中的intern方法强制2个字符串指向同一个对象
2.字符串的常用操作
a.查询操作
(1)index()
查找字符串substr第一次出现的位置(索引),如果查找的字符串不存在时,则会抛出Value Error
s='hello,hello'
print(s.index('o'))
输出:4
(2)rindex()
查找字符串substr最后一次出现的位置,如果查找的字符串不存在时,会抛出Value Error
s='hello,hello'
print(s.rindex('o'))
输出:10
(3)find()
查找字符串substr第一次出现的位置,如果查找的字符串不存在时,则返回-1
s='hello,hello'
print(s.find('o'))
输出:4
(4)rfind()
查找字符串substr最后一次出现的位置,如果查找的字符串不存在时,则返回-1
s='hello,hello'
print(s.refind('o'))
输出:10
b.大小写转换操作
(1)upper()
s='hello,hello' #转成大写之后,会产生一个新的字符串对象
a=s.upper()
print(a)
输出:HELLO,HELLO
(2)lower()
s='HELLO,HELLO'
a=s.lower() #同样也会产生一个新的字符串对象
print(a)
输出:hello,hello
(3)swapcase()
s='Hello,Hello'
a=s.swapcase()
print(a)
输出:hELLO,hELLO
(4)capitalize()
s='heLLO,Hello'
a=s.capitalize()
print(a)
输出:Hello,hello
(5)title()
s='heLLO,Hello'
a=s.title()
print(a)
输出:Hello,Hello
c.内容对齐操作
(1).center()
s='hello,baby'
print(s.center(20,'%'))
输出:%%%%%hello,baby%%%%%
(2).ljust()
s='hello,baby'
print(s.ljust(20,'%'))
输出:hello,baby%%%%%%%%%%
(3).rjust()
s='hello,baby'
print(s.rjust(20,'%'))
输出:%%%%%%%%%%hello,baby
(4).zfill()
s='hello,baby'
print(s.zfill(20))
输出:0000000000hello,baby
d.劈分操作
(1)split()
从字符串 的左边开始劈分,默认的劈分字符时空格字符串,返回的值都是一个列表
a='hello,world'
lst=a.split()
print(lst)
输出:[‘hello,world’]
以通过参数sep指定劈分字符串时的劈分符
a='hello world'
lst=a.split(sep='|')
print(lst)
输出:[‘hello world’]
通过参数maxsplit指定劈分字符串时的最大劈分次数,在经过最大次劈分之后,剩余的字串会单独做成一部分
a='hello|world|ok'
lst=a.split(sep='|',maxsplit=1)
print(lst)
输出:[‘hello’, ‘world| ok’]
(2)rsplit()
从字符串的右边开始劈分,默认的劈分字符时空格字符串,返回的值都是一个列表
a='hello world ok'
print(a.rsplit())
输出:[‘hello’, ‘world’, ‘ok’]
以通过参数sep指定劈分字符串时的劈分符
通过参数maxsplit指定劈分字符穿时的最大劈分次数,在经过最大次劈分之后,剩余的字串会单独做为一部分
a='hello|world|ok'
print(a.rsplit(sep='|',maxsplit=1))
输出:[‘hello|world’, ‘ok’]
e.判断字符串操作
(1).isidentifier()
判断指定的字符串是不是合法的标识符
s='hello,world'
print(s.isidentifier())
输出:False
合法的标识符是数字,字母和下划线.不包括逗号
(2).isspace()
判断指定的字符串是否全部由空白字符组成(回车,换行,水平制 表符)
print('\t'.isspace())
输出:True
(3).isalpha()
判断指定的字符串是否全由字母组成
s='hello,1'
s2='张三'
print(s.isalpha())
print(s2.isalpha())
输出:False
True
(4).isdecimal()
判断指定字符串是否全部由十进制的数字组成
s='123,四'
s2='123'
print(s.isdecimal())
print(s2.isdecimal())
输出:False
True
(5).isnumeric()
判断指定的字符串是否全部由数字组成
s='1234.'
s2='1589四'
print(s.isnumeric())
print(s2.isnumeric())
输出:False
True
(6).isalnum()
判断指定字符是否全部由字母和数字组成
s='hello12138'
print(s.isalnum())
输出:True
f.字符串的替换与合并
(1).replace()
第1个参数指定被替换的子串,第2 个参数指定替换字串的字符串,该方法返回替换后得到的字符串,替换前的字符串不发生变化.调用该方法时可以通过第3个参数指定最大替换次数
s='hello,girl'
print(s.replace('girl','boy'))
输出:hello,boy
s='hello,hello,hello,world'
print(s.replace('hello','ok',3)) #3表示最大替换次数
输出:ok,ok,ok,world
(2).join()
将列表或元组中的字符串合并成一个字符串
lst=['hello','flower','hi']
print('@'.join(lst))
输出:hello@flower@hi
a='hello'
print('@'.join(a))
输出:h@e@l@l@o
3.字符串的比较
(图片转载网络)
print('apple'>'app')
print('apple'>'banana')
输出:True
False
怎么知道哪个字符更大呢?
我们可以比较它们的原始值
print(ord('a'),ord('b'))
输出: 97 98
4.字符串的切片操作
s='hello,world'
s1=s[:5] #没有指定起始位置,默认从0 开始,默认步长为1
s2=s[6:] #没有指定结束位置,默认到末尾
s3='!'
new_str=s1+s3+s2
print(new_str)
输出:hello!world
5.格式化字符串
为什么需要格式化字符串?
在python中我们会遇到一个问题,问题是如何输出格式化的字符串。我们经常会输出类似’亲爱的xxx你好!您尾号xxxx卡快捷支付xx元,余额xxxx元’之类的字符串,而xxx的内容都是根据变量变化的,所以,需要一种简便的格式化字符串的方式。
在python中,我们用%或{}实现格式化字符串。
(图片转载网络)
#第一种方式 %
name='张三'
age=20
print('我叫%s,今年%d岁'%(name,age))
输出:我叫张三,今年20岁
# 第二种方式 {}
name='张三'
age=20
print('我叫{0},今年{1}岁'.format(name,age))
输出:我叫张三,今年20岁
当然还有第三种方式
#第三种方式 f-string
name='张三'
age=20
print(f'我叫{name},今年{age}岁')
输出:我叫张三,今年20岁
我们还可以用格式化字符来表示宽度
print('%10d' % 100) #10表示宽度为10
print('helloworld')
输出:
同时可以表示精度
print('%.3f' % 3.1415926) #3表示保留三位,同时四舍五入
输出:3.142
也可以同时表宽度和精度
print('%10.3f' % 3.1415926)
输出:
3.142
6.字符串的编码转换
为什么需要字符串的变成转换?
(图片转载网络)
s='一二三四五'
print(s.encode(encoding='GBK')) #在GBK这种编码格中,一个中文占两个字节
输出:
b’\xd2\xbb\xb6\xfe\xc8\xfd\xcb\xc4\xce\xe5’
其中‘b’表示的是二进制
s='一二三四五'
print(s.encode(encoding='UTF-8'))
#在UTF-8这种编码格中,一个中文占三个字节
输出:
b’\xe4\xb8\x80\xe4\xba\x8c\xe4\xb8\x89\xe5\x9b\x9b\xe4\xba\x94’
那我们怎么进行解码呢?
#解码
s='一二三四五'
byte=s.encode(encoding='GBK') #编码
print(byte.decode(encoding='GBK')) #解码
输出:一二三四五
注意:编码格式要与解码格式相同