字符串
在Python中字符串是基本数据类型,是一个不可变的字符序列,无论是索引还是切片,都只能是获取字符串,而不能进行赋值
1.字符串的驻留机制
仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串的驻留池中,Python的驻留机制对相同的字符串只保留一份拷贝,后续创建相同字符串时,不会开辟新空间,而是把该字符串的地址赋给新创建的变量
(1)驻留机制的几种情况(交互模式)
字符串的长度为0或1时
符合标识符的字符串
字符串只在编译时进行驻留,而非运行时
[-5,256]之间的整数数字
(2)sys中的intern方法强制两个字符串指向同一个对象
(3)PyCharm对字符串进行了优化处理
(4)字符串驻留机制的优缺点
当需要值相同的字符串时,可以直接从字符串池里拿来使用,避免频繁的创建和销毁,提升效率和节约内存,因此拼接字符串和修改字符串是会比较影响性能的
在需要进行字符串拼接时建议使用str类型的join方法,而非+,因为join()方法是先计算出所有字符串中的长度,然后再拷贝,只更新一次对象,效率要比“+”效率高
print('----------------------------字符串的驻留机制--------------------')
'''
不同的值被存放在字符串的驻留池中,
Python的驻留机制对相同的字符串只保留一份拷贝,
后续创建相同字符串时,
不会开辟新空间,
而是把该字符串的地址赋给新创建的变量
'''
a = 'python'
b = "python"
c = '1111'
d = '1111'
print(a, id(a))
print(b, id(b))
print(c, id(c))
print(d, id(d))
2.字符串的常用操作
(1)字符串的查询操作方法
print('----------------------------字符串的常用操作--------------------')
print('----------------------字符串的查询操作方法-------------------')
a = 'hello,hello'
print('-------------index()----------------')
'''
查找子串substr第一次出现的位置,
如果查找的子串不存在时,
则抛出ValueError
'''
print(a.index('he'))
# print(a.index('d'))
print('-------------rindex()----------------')
'''
查找子串substr最后一次出现的位置,
如果查找的子串不存在时,
则抛出ValueError
'''
print(a.rindex('he'))
# print(a.rindex('d'))
print('-------------find()----------------')
'''
查找子串substr第一次出现的位置,
如果查找的子串不存在时,
则返回-1
'''
print(a.find('he'))
print(a.find('d'))
print('-------------rfind()----------------')
'''
查找子串substr最后一次出现的位置,
如果查找的子串不存在时,
则返回-1
'''
print(a.rfind('he'))
print(a.rfind('d'))
(2)字符串的大小写转换操作方法
print('----------------------字符串的大小写转换操作方法--------------')
a = 'hEllo,helLo'
print('-------------upper()----------------')
'''把字符串中所有字符都转换成大写字母'''
b = a.upper()
print(b, id(b))
print(a, id(a))
print('-------------lower()----------------')
'''把字符串中所有字符都转换成小写字母'''
print(b.lower())
print('-------------swapcase()-------------')
'''
把字符串中所有大写字母转换成小写字母,
把所有小写字母转换成大写字母
'''
print(a.swapcase())
print('-------------capitalize()------------')
'''把第一个字符转换成大写,把其余字符转换成小写'''
print(a.capitalize())
print('-------------title()----------------')
'''把每个单词的第一个字符转换成大写,
把每个单词的剩余字符转换成小写'''
print(a.title())
(3)字符串内容对齐操作的方法
print('----------------------字符串内容对齐操作的方法--------------')
a = 'hello,hello'
print('-------------center()----------------')
'''居中对齐,
第一个参数指定宽度,
第二个参数指定填充符,
第二个参数是可选的,默认是空格,
如果设置宽度小于实际宽度则返回原字符串'''
print(a.center(20, '*'))
print('-------------ljust()----------------')
'''左对齐,第一个参数指定宽度,
第二个参数指定填充符,
第二个参数是可选的,默认是空格,
如果设置宽度小于实际宽度则返回原字符串'''
print(a.ljust(20, '*'))
print('-------------rjust()----------------')
'''右对齐,
第一个参数指定宽度,
第二个参数指定填充符,
第二个参数是可选的,默认是空格,
如果设置宽度小于实际宽度则返回原字符串'''
print(a.rjust(20, '*'))
print(a.rjust(20))
print('-------------zfill()----------------')
'''右对齐,
左边用0填充,
该方法只接收一个参数,
用于指定字符串的宽度,
如果指定的宽度小于等于字符串的长度,
则返回字符串本身'''
print(a.zfill(20))
# 对于“-”,会留在最左端
print('-120'.zfill(10))
(4)字符串劈分操作的方法
print('----------------------字符串劈分操作的方法--------------')
print('-------------split()----------------')
'''
从字符串的左边开始劈分,
默认的劈分字符是空格字符串,
返回的值都是一个列表。
'''
a = 'nice to meet you'
print(a.split())
a = 'nice|to|meet|you'
'''
以通过参数sep指定劈分字符串的是劈分符
'''
print(a.split('|'))
'''
通过参数maxsplit指定劈分字符串时的最大劈分次数,
在经过最大劈分之后,
剩余的子串会单独作为一部分
'''
print(a.split('|', maxsplit=1))
(5)判断字符串操作的方法
print('----------------------判断字符串操作的方法--------------')
a = 'hello,hello'
print('-------------isidentifier()----------------')
'''判断指定的字符串是不是合法的标识符'''
print(a.isidentifier())
print('-------------isspace()----------------')
'''判断指定的字符串是否全部由空白字符组成
(回车、换行、水平制表符)'''
print(a.isspace())
print('-------------isalpha()----------------')
'''判断指定的字符串是否全部由字母组成'''
print(a.isalpha())
print('-------------isdecimal()----------------')
'''判断指定的字符串是否全部由十进制的数字组成 '''
print(a.isdecimal())
print('-------------isnumeric()----------------')
'''判断指定的字符串是否全部由数字组成'''
print(a.isnumeric())
print('-------------isnumeric()----------------')
'''判断指定的字符串是否全部由字母和数字组成'''
print(a.isalnum())
(6)字符串操作的其它方法
print('----------------------字符串操作的其它方法--------------')
print('-------------replace()----------------')
'''第一个参数指定被替换的子串,
第二个参数指定替换子串的字符串,
该方法返回替换后得到的字符串,
替换前的字符串不发生变化,
调用该方法时可以通过第三个参数指定最大替换次数'''
a = 'nice to nice to nice meet you'
print(a.replace('nice', 'ni', 2))
print('-------------replace()----------------')
'''将列表或元组中的字符串合并成一个字符串
前面需要指定连接符号'''
a = ['nice', 'to', 'meet', 'you']
print('|'.join(a))
print(''.join(a))
a = ('nice', 'to')
print('|'.join(a))
print(''.join(a))
3.字符串的比较操作
(1)运算符:>,>=,<,<=,==,!=
(2)比较规则:
首先比较两个字符串的第一个字符,如果相等则继续比较下一个字符,依次比较下去,直到两个字符串中的字符不相等时,其比较结果就是两个字符串的比较结果,两个字符串中的所有后续字符将不再被比较
(3)比较原理:
两个字符进行比较时,比较的是其ordinal value(原始值),调用内置函数ord可以得到指定字符的ordinal value。与内置函数ord对应的是内置函数chr,调用内置函数chr时指定ordinal value可以得到其对应的字符
print('----------------------字符串的比较操作--------------')
'''==与is的区别
==比较的是value
is比较的是id'''
a = b = 'python'
c = 'python'
print(a == b)
print(a is b)
print(c == b)
print(c is b)
print('a', id(a))
print('b', id(b))
print('c', id(c))
4.字符串的切片操作
字符串是不可变类型
不具备增、删、改等操作
切片操作将产生新的对象
print('----------------------字符串的切片操作--------------')
a = 'nice to nice to nice meet you'
'''切片[start:end:step]'''
s1 = a[:5]
s2 = a[5:]
print(s1)
print(s2)
s3 = '*'
new_a = s1+s3+s2
print(new_a)
print(id(a))
print(id(s1))
5.格式化字符串
(1)%做占位符
%s 字符串
%i或%d 整数
%f 浮点数
例:’我的名字叫: %s,今年%d岁了’ % (name,age)
(2)做占位符
例: ’我的名字叫:{0},今年{1}岁了,我真的叫:{0}’.format(name,age)
print('----------------------格式化字符串--------------')
a = 'nice to meet you'
b = 20
print('%s,我已经%d岁' % (a, b))
print('{0},我已经{1}岁'.format(a, b))
print(f'{a},我已经{b}岁')
6.字符串的编码转换
(1)为什么需要字符串的编码转换
(2)编码与解码方式
编码:将字符串转换成二进制数据(bytes)
解码:将bytes类型的数据转换成字符串类型
print('----------------------字符串的编码转换--------------')
print('-------------编码---------------')
a = '白日依山尽'
# 在gbk编码格式中一个中文占用两个字节
print(a.encode(encoding='GBK'))
# 在utf-8编码格式中一个中文占用三个字节
print(a.encode(encoding='UTF-8'))
print('-------------解码---------------')
byte = a.encode(encoding='gbk')
print(byte.decode(encoding='gbk'))
byte = a.encode(encoding='utf-8')
print(byte.decode(encoding='utf=8'))