目录
1、字符串的驻留机制
驻留机制的优缺点
2、字符串的常用操作
2.1 查询
2.2 大小写转换
2.3 字符串对齐
2.4 字符串劈分
2.5 判断字符串
2.6 替换和合并
3、字符串的比较
4、字符串的切片操作
5、格式化字符串
6、字符串的编码转换
字符串
在Python中字符串是基本数据类型,是一个不可变的字符序列
仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串的驻留池中,Python的驻留机制对相同的字符串只保留一份拷贝,后续创建相同的字符串时,不会开辟新空间,而把该字符串的地址赋给新创建的变量
a = 'Python'
b = "Python"
c = '''Python'''
print(id(a))
print(id(b))
print(id(c))
#三者的值相同
驻留机制的优缺点
- 当需要值相同的字符串时,可以直接从字符串池里面拿来使用,避免频繁创建和销毁,提升效率和节约内存,因此拼接字符串和修改字符串是会比较影响性能的
- 在需要进行字符串拼接时建议使用str类型的join方法,而非+,因为join()方法是先计算出所有字符中的长度,然后再拷贝,只new一次对象,效率更高
- 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
- upper():把字符串中所有字符转换成大写字母
- lower():把字符串中所有字符转换成小写字母
- swapcase():把字符串中所有大写字符转换成小写字母,把所有小写字符转换成大写字母
- capitalize():把第一个字符转换成大写,其余字符转换成小写
- title():把每个单词的第一个字符转换成大写,其余字符转换成小写
- 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(s.zfill(10)) # hello,python
m='-2736'
print(m.zfill(8)) # -0002736
- split():从字符串左边开始劈分,默认的劈分字符(通过sep参数指定)是空格字符串,返回的值都是一个列表,参数maxsplit指定最大劈分次数
- rsplit():从字符串右边开始劈分
s='hello world python'
lst=s.split()
print(lst) #['hello','world','python']
s1='hello|world|python'
print(s1.split(sep='|')) #['hello','world','python']
print(s1.split(sep='|',maxsplit=1)) #['hello','world|python']
print(s.rsplit())#['hello','world','python']
print(s1.rsplit(sep='|')) #['hello','world','python']
print(s1.rsplit(sep='|',maxsplit=1)) #['hello|world','python']
- isidentifier():判断指定的字符串是不是合法的标识符
- isspace():判断指定的字符串是否全部由空白字符组成(回车、换行、水平制表符)
- isalpha():判断指定的字符串是否全部由字母组成
- isdecimal():判断指定的字符串是否全部由十进制的数字组成
- isnumeric():判断指定的字符串是否全部由数字组成
- isalnum():判断指定的字符串是否全部由字母和数字组成
s='hello,python'
print(s.isidentifier()) #False
print('\t'.isspace()) #True
print('abc'.isalpha()) #True
print('张三'.isalpha()) #True
print('123四'.isdecimal()) #False
print('123'.isnumeric()) #True
print('123四'.isnumeric()) #True
print('abc1'.isalnum()) #True
- replace():用第2个参数替换第1个参数指定的字符串
- join():将列表或元组中的字符串合并成一个字符串
s='hello,python'
print(s.replace('python','java'))# hello,java
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
运算符:>,>=,<,<=,==,!= (一个字符一个字符进行比较,直至不同)
print('apple'>'app') # True
print('apple'>'banana') # False 比较的是a和b的ord值(a为97,b为98)
==和is的区别
==比较的是value
is比较的是两者的id
切片将产生新的对象
切片左闭右开
s='hello,python'
s1=s[:5]
print(s1) #hello
s2=s[6:]
print(s2) #python
s3='!'
newstr=s1+s3+s2
print(newstr) #hello!python
#s1,s2,s3,newstr的id都不相同
切片[start:end:step]
s='hello,python'
print(s[1:5:1]) #ello
print(s[::2]) #hlopto
print(s[::-1]) #nohtyp,olleh
print(s[-6::1]) #python
格式化字符串的两种方式
(1)%作占位符
%s:字符串
%d:整数
%f:浮点数
例:'我的名字叫:%s,今年%d岁了' % (name,age)
name='张三'
age=20
print('我叫%s,今年%d岁' % (name,age)) #我叫张三,今年20岁
(2){}作占位符
例:'我的名字叫:{0},今年{1}岁了' .format(name,age)
name='张三'
age=20
print('我叫{0},今年{1}岁'.format(name,age)) #我叫张三,今年20岁
print(f'我叫{name},今年{age}岁') #我叫张三,今年20岁
print('{0:.3}'.format(3.1415926)) #3.14(0是占位符,3代表一共3位数)
print('{:.3f}'.format(3.1415926)) #3.142
宽度和精度
print('%10d' % 99) # 99(10表示宽度)
print('%.3f' % 3.1415926) #3.142(3表示小数点后三位)
print('%10.3f' % 3.1415926) # 3.142
为什么要进行编码转换
编码:将字符串转换为二进制(bytes)
解码: 将bytes类型的数据转换成字符串
编码和解码的格式一定要相同
s='天涯共此时'
#编码
print(s.encode(encoding='GBK')) # b'\xcc\xec\xd1\xc4\xb9\xb2\xb4\xcb\xca\xb1'
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')) #天涯共此时