字符串
字符串是基本数据类型,是不可变的字符序列
一、字符串的驻留机制
- Python的驻留机制对相同的字符串只保留一份,后续创建相同的字符串时,不会开辟新的空间,而是把该字符串的地址赋值给新创建的变量
py
a='python'
b="python"
c='''python'''
print(a,id(a)) # a、b、c的id都相等
print(b,id(b))
print(c,id(c))
- 符合驻留机制的几种情况
- 字符串的长度为0或1时
- 符合标识符的字符串(字母、数字、下划线)
- 字符串只在编译时进行驻留,并非运行时
- [-5,256]之间的整数数字
驻留机制的优缺点
1)当需要值相同的字符串时,可以直接从字符串池里拿来使用,避免频繁的创建和销毁,提升效率和节约内存,因此,拼接字符串和修改字符串是比较影响性能的 2)在需要字符串拼接时,使用str类型的join方法,而非+,因为join()方法是先计算出所有字符中的长度,再拷贝,只new一次对象,效率比“+”要高
二、字符串的常用操作
- 查询操作
py
s = 'hello,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: substring not found
print(s.find('k')) #-1
- 字符串的大小写转换的操作方法
py
s = 'hello,hello'
a = s.upper()
# 转成大写之后,会产生一个新的字符串对象
print(a, id(a)) # HELLO,HELLO 1500605251696
print(s, id(s)) # hello,hello 1500605251824
# 转成小写之后,会产生一个新的字符串对象
print(s.lower(),id(s.lower())) # hello,hello 2061775204400
s1 = 'hello Python'
print(s1, id(s1))
print(s1.swapcase(), id(s1.swapcase())) # HELLO pYTHON
print(s1.capitalize(), id(s1.capitalize())) # Hello python
print(s1.title(), id(s1.title())) # Hello Python
- 字符串内容对齐操作
py
s = 'hello,python'
# 居中对齐
print(s.center(20, '*')) # ****hello,python****
# 左对齐
print(s.ljust(20, '*')) # hello,python********
# 右对齐
print(s.rjust(20, '*')) # ********hello,python
# 右对齐,使用0填充
print(s.zfill(20)) # 00000000hello,python
- 字符串劈分操作方法
py
s = 'hello world python'
print(s.split()) # ['hello', 'world', 'python']
print(s.split(maxsplit=1)) #['hello', 'world python']
s1 = 'hello|world|python'
print(s1.split(sep='|')) # ['hello', 'world', 'python']
# 从右边分割
print(s1.rsplit(sep='|', maxsplit=1)) #['hello|world', 'python']
判断字符串的操作方法
字符串的替换和合并操作
py
s = 'hello python,python,python,python'
print(s.replace('python', 'java', 3)) # hello java,java,java,python
lst = ['hello', 'python', 'java']
print('|'.join(lst)) # hello|python|java
print(''.join(lst)) # hellopythonjava
t = ('hello', 'python', 'java')
print('|'.join(t)) # hello|python|java
print(''.join(t)) # hellopythonjava
print('*'.join('python')) # p*y*t*h*o*n
三、字符串的比较
运算符:>,>=,<,<=,==,!=
- 比较规则 首先比较两个字符串中的第一个字符,如果相等则继续比较下一个字符,依次比较下去,直到两个字符串中的字符不相等时,其比较结果就是两个字符串的比较结果,两个字符串中的所有后续字符将不再被比较
- 比较原理 两个字符进行比较时,比较的是其ordinal value(原始值),调用内置函数ord可以得到指定字符的原始值。 与内置函数ord对应的内置函数chr,调用内置函数chr时指定ordinal value可以得到对应的字符
py
print('apple' > 'app') # True
print('a' > 'b') # False
print(ord('a'), ord('b')) # 97 98
print(chr(97), chr(98)) # a b
- ==和is的区别:==比较的value,is比较的是id是否相等
四、字符串的切片操作
- 字符串是不可变类型,不具备增删改操作
- 切片操作会产生一个新的对象
- 语法:str[star: end: step]
py
s = 'hello,python'
print(s[1:5:1]) # ello 从1开始截到5(不包含5),步长1
print(s[:5]) # hello 从0开始截到5(不包含5),步长1
print(s[1:]) # ello,python 从1开始截到最后,步长1
print(s[::2]) # hlopto 从0开始截到最后,步长2
print(s[::-1]) # nohtyp,olleh 默认从字符串的最后一个元素开始,到字符串的第一个元素结束,因为步长为负数
print(s[-6::1]) #python
五、格式化字符串
- 格式化字符串常用占位符 (1)%做占位符,%s表示字符串,%i或者%d表示整数,%f表示浮点数 (2){}作占位符 (3)f-string
py
name = '张三'
age = 25
# %占位
print('我叫%s,今年%d岁了'% (name,age)) # 我叫张三,今年25岁了
# {}
print('我叫{0},今年{1}岁了,就叫{0}'.format(name,age)) # 我叫张三,今年25岁了,就叫张三
# f-string
print(f'我叫{name},今年{age}岁了') # 我叫张三,今年25岁了
- 字符串的精度和宽度
py
print('%d' % 88) # %d占位88
print('%10d' % 88) # 88,表示宽度为10
print('%f' % 3.1415926) # 3.141593
print('%.3f' % 3.1415926) # 3.142,.3表示保留三位小数
# 同时表示宽度和精度,总宽度为10,保留小数点后三位
print('%10.3f' % 3.1415926) # 3.142
print('{}'.format(88)) # 88,当只有一个占位参数时,0(位置)可省略
print('{0:10}'.format(88)) # 88,表示宽度为10
print('{0:.3}'.format(3.1415926)) # 3.14,表示只位宽度
print('{0:.3f}'.format(3.1415926)) # 3.142,保留三位小数
# 同时表示宽度和精度,总宽度为10,保留小数点后三位
print('{:10.3f}'.format(3.1415926)) # 3.142
六、字符串的编码转换
- 编码与解码的方式 编码:将字符串转为二进制数据bytes 解码:讲bytes类型的数据转换为字符串类型
py
s = '天涯共此时'
'''编码'''
# GBK编码一个汉字占两个字节
print(s.encode(encoding='GBK')) # b'\xcc\xec\xd1\xc4\xb9\xb2\xb4\xcb\xca\xb1'
# UTF-8编码一个汉字占三个字节
print(s.encode(encoding='UTF-8')) # b'\xe5\xa4\xa9\xe6\xb6\xaf\xe5\x85\xb1\xe6\xad\xa4\xe6\x97\xb6'
'''解码'''
byte = s.encode(encoding='GBK') # 编码
print(byte.decode(encoding='GBK')) # 解码
byte = s.encode(encoding='UTF-8') # 编码
print(byte.decode(encoding='UTF-8')) # 解码