目录
字符串是python的基本数据结构,是一个不可变的序列。
一、字符串的驻留机制
python中字符串的表示有三种:单引号,双引号,三引号表示
a = 'python'
b = "python"
c = '''python'''
分别查看一下他们的id
print(id(a))
print(id(b))
print(id(c))
1700223303472
1700223303472
1700223303472
查看id值后发现三个不同的变量a,b,c他们的id值居然是一模一样的,因此并没有创建新的字符串,这就是字符串的驻留机制 :仅保存一份相同且不可变的字符串方式,由于a中已经存储了字符串python,再放入b中时不会创建新的地址而是直接复制a中的地址。
字符串驻留机制的优缺点
当需要相同的字符串时,可以直接从字符池中拿来使用,避免频繁的创建和销毁,提升效率和节约内存,因此,拼接字符串和修改字符串是会比较影响性能的。
在需要进行字符串的拼接时,会产生新的字符串对象,建议使用str类型的.join方法,而非+号连接,因为join()方法是先计算出字符串的长度,然后再拷贝,只new一次对象,效率比+号高。
二、字符串的常见操作
1、查询方法
index() 查找字符串第一次出现的位置,如果查找的字符串不存在抛异常
s = 'hello.world'
print(s.index('lo'))
3
rindex() 查找字符串最后一次出现的位置,如果查找的字符串不存在抛异常
print(s.rindex('l'))
9
find() 查找字符串第一次出现的位置,如果查找的字符串不存在则返回-1
print(s.find('lo'))
3
rfind() 查找字符串第最后一次出现的位置,如果查找的字符串不存在则返回-1
print(s.rfind('8'))
-1
2、大小写转换
upper() 把字符串中所有的字符转成大写字母
a = 'heLLo.python'
b = s.upper()
print(a,id(a))
print(b,id(b))
heLLo.python 1641147873712
HELLO.WORLD 1641147873264
查看id值发现修改过后出现了新的字符串
lower() 把字符串中所有的字符转换成小写字母
print(a.lower())
swapcase() 把字符串中所有大写字母转换成小写字母,把所有小写字母都转换成大写字母
print(a.swapcase())
capitalize() 把第一个字符转换成大写,其余字母转换成小写
print(a.capitalize())
title() 把每个单词的第一个字母转换成大写,每个单词剩余字符转换成小写
print(a.title())
3、字符串内容对齐
center() 字符串居中对齐,第一个参数指定宽度,第二个参数指定填充符,第二个参数是可选的,默认是空格,如果设置宽度小于实际宽度则返回原字符
s = 'hello,python'
print(s.center(20,'*'))
****hello,python****
print(s.center(10,'*')) #小于实际宽度输出原字符
hello,python
ljust() 字符串左对齐,第一个参数指定宽度,第二个参数指定填充符,第二个参数是可选的,默认是空格,如果设置宽度小于实际宽度则返回原字符
print(s.ljust(20))
hello,python |
注意左对齐设置的宽度大于实际宽度会自动填充空格一直到竖线。
rjust() 字符串右对齐,第一个参数指定宽度,第二个参数指定填充符,第二个参数是可选的,默认是空格,如果设置宽度小于实际宽度则返回原字符
print(s.rjust(20,'('))
((((((((hello,python
zfill() 右对齐,左边用0填充,该方法只接收一个参数,用于指定字符串的宽度,如果设置宽度小于实际宽度则返回原字符
print(s.zfill(20))
00000000hello,python
三、判断字符串操作的方法
1、isidentifier()
英 [aɪˈdentɪfaɪə(r)],标识符,标识号
判断指定的字符串是不是合法的标识符,返回值为True、False。
s = 'hello,python'
print(s.isidentifier())
False
2、 isspace()
判断指定的字符串是否全部由空白字符组成(回车、换行、水平制表符)。
print('\t'.isspace())
True
3、isalpha()
英 [ˈælfə] ,字母表
判断指定的字符串是否全部由字母组成。注:在python中汉字也可作为字母
print('zhang张三'.isalpha()) #汉字也是字母
True
4、isdecimal()
判断指定字符串是否全部由十进制数字组成。
print('3453'.isdecimal())
True
5、isnumeric()
判断指定字符串是否全部由数字组成。
print('789dad'.isnumeric())
False
6、isalnum()
判断指定字符串是否全部由字母和数字组成。
print('dajhd44w'.isalnum())
True
四、字符串的劈分操作
1、split()函数
从字符串的左边开始劈分,默认的劈分字符是空格字符串,返回的值都是一个列表,以通过的参数sep指定分割字符串的劈分符,通过参数maxsplit指定劈分字符串时的最大劈分次数,在经过最大次劈分后,剩余字符串会单独作为一部分。
s = 'helloworld python'
lst = s.split()
#没有指定分隔符时默认以字符串中的空格为分隔符
s1 = 'hello|world|python'
print(s1.split(sep='|'))
['helloworld', 'python']['hello', 'world', 'python']
2、rsplit()函数
从字符串的右边开始劈分,默认的劈分字符是空格字符串,返回的值都是一个列表,以通过的参数sep指定分割字符串的劈分符,通过参数maxsplit指定劈分字符串时的最大劈分次数,在经过最大次劈分后,剩余字符串会单独作为一部分。
print(s1.rsplit(sep='|',maxsplit=1))
['hello|world', 'python']
五、字符串的替换和合并操作
1、字符串的替换
replace()
第一个参数指定被替换的字符,第二个参数指定替换字串的字符串,该方法返回替换后得到的字符串,替换前的字符串不发生变化,调用该方法时可以使用第三个参数指定最大替换次数,被指定字符不存在时不会报错,输出原字符串。
s = 'hello,python'
print(s.replace('python','java'))
print(s.replace('pt','ja')) #pt不存在,输出原字符
hello,java
hello,python
2、字符串的合并
join()
将列表或元组中的字符串合并成一个字符串
t = ('hello','java','python')
print(''.join(t))
print('*'.join(t)) #字符串连接
hellojavapython
hello*java*python
六、字符串的比较
运算符:>,<,==,!=,<=,>=
比较规则:首先比较两个字符中的第一个字符,如果相等则依次比较后面的字符,直到两个字符不相等时,其比较结果就为两个字符串的比较结果,后续字符不在比较。
比较原理:两个字符进行比较时,比较的是其ordinal value(原始值),调用内置函数ord可以得到指定字符的原始值,与内置函数ord对应的是内置函数chr,调用内置函数chr时指定原始值可以得到其对应字符。
print('apple'>'app')
print('apple'>'appre')
print(ord('a'),ord('b')) #97,98
print(chr(97),chr(98))
print(ord('张'))
True
False
97 98
a b
24352
七、字符串的切片操作
字符串是不可变序列,不具备增删改等操作,切片操作将会产生新的对象。
s = 'hello,python'
s1 = s[:5]
s2 = s[6:]
s3 = '!'
new = s1+s3+s2
print(new)
hello!python
利用字符串的切片操作可以实现字符串的逆序输出:
a = 'asdf'
print(a[::-1])
fdsa
八、 格式化字符串
1、使用%进行格式化
name = '张三'
age = 25
print('我叫%s,我今年%d岁' % (name,age))
还可以表示保留小数位数
#10表示宽度
print('%10d' % 99)
#保留五位小数
print('%.5f' % 3.141592)
#同时指定宽度和小数
print('%10.5f' % 3345.324242)
99
3.14159
3345.32424
2、使用{}进行格式化---使用format()方法
使用{}需要使用.format()方法。
print('我叫{0},我今年{1}岁,我真的叫{0}'.format(name,age))
使用format()表示保留小数
#使用{}也可以实现宽度精度的设置
print('{0}'.format(3.1415926))
#总共保留3位数字
print('{0:.3}'.format(3.1415926))
#总共保留三位小数
print('{0:.3f}'.format(3.1415926))
#0表示的占位符顺序,可以省略不写
#同时设置宽度和精度
print('{0:10.3f}'.format(3.1415926))
3、使用f-string进行格式化
print(f'我叫{name},我今年{age}岁')
九、字符串的编码转换
s='天涯共此时'
#字符串编码
print(s.encode(encoding='GBK')) #在GBK编码中一个中文占两个字节
print(s.encode(encoding='UTF-8')) #一个中文占三个字节
#解码,编码格式与解码要相同
byte=s.encode(encoding='GBK')
#字符串解码
print(byte.decode(encoding='GBK'))