Skip to content

字符串

字符串是基本数据类型,是不可变的字符序列

一、字符串的驻留机制

  • Python的驻留机制对相同的字符串只保留一份,后续创建相同的字符串时,不会开辟新的空间,而是把该字符串的地址赋值给新创建的变量
py
a='python'
b="python"
c='''python'''

print(a,id(a))  # a、b、c的id都相等
print(b,id(b))
print(c,id(c))
  • 符合驻留机制的几种情况
  1. 字符串的长度为0或1时
  2. 符合标识符的字符串(字母、数字、下划线)
  3. 字符串只在编译时进行驻留,并非运行时
  4. [-5,256]之间的整数数字
  • 驻留机制的优缺点

    1)当需要值相同的字符串时,可以直接从字符串池里拿来使用,避免频繁的创建和销毁,提升效率和节约内存,因此,拼接字符串和修改字符串是比较影响性能的 2)在需要字符串拼接时,使用str类型的join方法,而非+,因为join()方法是先计算出所有字符中的长度,再拷贝,只new一次对象,效率比“+”要高

二、字符串的常用操作

  1. 查询操作
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
  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
  1. 字符串内容对齐操作
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
  1. 字符串劈分操作方法
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']
  1. 判断字符串的操作方法

  2. 字符串的替换和合并操作

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是否相等

四、字符串的切片操作

  1. 字符串是不可变类型,不具备增删改操作
  2. 切片操作会产生一个新的对象
  3. 语法: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. 格式化字符串常用占位符 (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岁了
  1. 字符串的精度和宽度
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

六、字符串的编码转换

  1. 编码与解码的方式 编码:将字符串转为二进制数据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'))  # 解码