Python的学习(十):字符串
在Python中字符串是基本数据类型,是一个不可变的字符序列
字符串的驻留机制
-
仅保存一份相同且不变字符串的方法,不同的值被存放在字符串的驻留池中,python的驻留机制对相同的字符串只保留一份拷贝,后续创建相同字符串时,不会开辟新空间,而是把字符串的地址赋值
- 给新创建的变量。
-
驻留机制的几种情况(交互模式)
- 字符串的长度为0或为1时
- 符合标识符的字符串
- 字符串只在编译时进行驻留,不是在运行时
- [-5,256]之间的整数数字
-
sys中的intern方法强制2个字符串指向同一个对象
-
PyCharm对字符串进行了优化处理
优缺点?
- 需要值相同的字符串时,可以直接从字符串池中拿来使用,避免频繁的创建与销毁,提升效率和节约内存,因此拼接字符串和修改字符会比较影响性能。
- 在需要进行字符串拼接时建议使用str类型的join方法,不是+,因为join先计算出所有字符的长度,然后拷贝,只要new对象一次,效率更高。
字符串的常用操作
字符串的查询
-
index()
查找子串第一次出现的位置,如果不存在,则抛出ValueError异常
-
rindex()
查找子串最后一次出现的位置,如果不存在,则抛出ValueError异常
-
find()
查找子串第一次出现的位置,如果不存在,则返回-1
-
rfind()
查找子串最后一次出现的位置,如果不存在,则返回-1
字符串的大小写转换
转换之后会产生一个新的字符串对象!!!
-
upper()
把字符串中所有字符都转成大写字母
-
lower()
把字符串中所有字符都转成小写字母
-
swapcase()
把字符串中所有大写字母转成小写,把所有小写字母转成大写
-
capitalize()
把第一个字符转换称大写,把其余字符转换成小写
-
title()
把每个单词的第一个字符转换成大写,把每个单词的剩余字符转换成小写
字符串内容对齐
填充符不写,默认是空格!
例子:s = ‘hello,Python’
-
center()
居中对齐,第一个参数指定宽度,第二个参数指定填充符,第2个参数是可选的,默认是空格,如果设置宽度小于实际宽度则返回原字符。
print(s.center(20,'*')) #****hello,Python****
-
ljust()
左对齐,第一个参数指定宽度,第二个参数指定填充符,第二个参数是可选的,默认是空格如果设置宽度小于实际宽度则返回原字符。
print(s.ljust(20,'*')) #hello,Python********
-
rjust()
右对齐,第一个参数指定宽度,第二个参数指定填充符,第二个参数是可选的,默认是空格如果设置宽度小于实际宽度则返回原字符。
print(s.rjust(20,'*')) #********hello,Python
-
zfill()
右对齐,左边用0来填充,该方法只接收一个参数,用于指定字符的宽度,如果指定的宽度小于等于字符串的长度,返回字符串本身。
print(s.zfill(20)) #00000000hello,Python
字符串劈分
-
split
()从字符串的左边开始劈分,默认的劈分字符是空格字符串,返回的值都是一个列表
s = 'hello world Python' lst = s.split() print(lst) #['hello','world','Python']
以通过参数sep指定劈分字符串的劈分符
s1 = 'hello|world|Python' print(s1.split(sep = '|')) #['hello','world','python']
通过参数maxsplit指定劈分字符串的最大次数,在经历最大次劈分之后,剩余的字串会单独作为一部分。
print(s1.split(sep = '|',maxsplit = 1)) #['hello','world|Python']
-
rsplit
()-
从字符串的右边开始劈分,默认的劈分字符是空格字符串,返回的值都是一个列表
-
以通过参数sep指定劈分字符串的劈分符
-
通过参数maxsplit指定劈分字符串的最大次数,在经历最大次劈分之后,剩余的字串会单独作为一部分。
-
字符串操作方法
-
isidentifier()
判断指定的字符串是不是合法的标识符
-
isspace()
判断指定字符串是否全部由空白字符串组成(回车、换行、水平制表)
-
isalpha()
判断字符串是否全部由字母组成
-
isdecimal()
判断指定字符串是否全部由十进制的数字组成
-
ismumeric()
判断指定的字符串是否全部由数字组成
支持中文数字、阿拉伯数字、罗马数字!
-
isalnum()
判断字符串是否全部由字母和数字组成
字符串的替换与合并
-
replace()
第一个参数指定被替换的子串,第二个参数指定替换子串的字符串,该方法返回替换后得到的字符串,替换前的字符串不会发生变化,调用该方法可以通过第三个参数指定最大替换次数。
s = 'hello,python' print(s.replace('Python','java')) #hello.java s1 = 'hello,python,python,python' print(s.replace('Python','java',2)) #hello.java,java,python
-
join()
将列表或者元组中的字符串合并成一个字符串
lst = ['hello','java','python'] print('|'.join(lst)) print(''.join(lst)) #hello|java|python #hellojavapython
字符串的比较
-
运算符号:>,>=,<,<=,==,!=
-
比较规则:首先比较两个字符串中的第一个字符,如果相等则继续比较下一个字符,依次比较下去,直到两个字符串中的字符不相等时,比较结果就是两个字符串的比较结果,两个字符串中的所有后续字符将不再被比较。
-
**比较原理:**两串字符进行比较时,比较的是其Ordinal value(原始值),调用内置函数ord可以得到指定字符的原始值,与内置函数ord对应的是内置函数chr,调用chr时指定的Ordinal value可以得到与其对应的字符。
print(ord('a').ord('b')) #97 98 print(ord(97).ord(98)) #a b
注意:==与is的区别
- ==比较的是value
- is 比较的时id是否相等
字符串的切片
切片会产生新的字符串对象!!!
s = 'hello,Python'
s1 = s[:5]#hello 由于没有指定起始位置,所以从0开始切到索引5
s2 = s[6:]#Python 由于没有指定结束位置,所以切索引6直到最后一个元素
-
标准写法:
[star:end:step]
#从1开始截到5,不包含5,步长为1 print(s[1:5:1])#ello #默认从0开始到最后一个元素,步长为2 print(s[::2])#hlopto #默认从最后一个元素到第一个元素1,步长为1 print(s[::-1])#nohtyp,olleh
格式化字符串
- 占位两种方式:
-
%作占位符
name = '傻逼' age = 18 print('我叫%s,今年%d岁' %(name,age))
-
{}作占位符号
#0为第一个参数,1为第一个参数 print('我叫{0},今年{1}岁'.format(name,age))
-
f-string
print('我叫{name},今年{age}岁')
用%表示:
-
宽度
print('%10d' % 99)#10表示宽度
-
小数点后几位
print('%.3f' % 3.1415926)#.3表示小数点后三位 print('%10.3f' % 3.1415926)#10.3同时表示宽度和精度
用{}表示:
print('{0:.3}'.format(3.1415926))#.3表示的是一共三位数
print('{0:.3f}'.format(3.1415926))#.3f表示的是一共三位小数
print('{:10.3f}'.format(3.1415926))#同时设置宽度和精度,宽度是10,3位是小数
字符串的编码和解码
-
编码与解码的方式
编码:将字符串转化成二进制数据(bytes)
解码:将bytes类型的数据转换成字符串类型
解码的格式要和编码的格式相同!