7 字符串
7.1 字符串概念
- 在python中字符串是基本数据类型,是一个不可变的字符序列
7.2 字符串驻留机制
- 概念:仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串的驻留池中,Python的驻留机制对相同的字符串只保留一份拷贝,后续创建相同字符串时,不会开辟新空间,而是把该字符串的地址赋给新创建的变量
- 驻留机制的几种情况(交互模式)
1.字符串的长度为0或1时
2.符合标识符的字符串
3.字符串只在编译时进行驻留,而非运行时
4.[-5,256]之间的整数数字
5.sys中的intern方法强制2个字符串指向同一个对象
PyCharm对字符串进行了优化处理
顺便:cmd输入python可以进入交互模式编译(nice啊
符合标识符的字符串是指含有字母数字下划线的字符串,不符合id不同
只在编译时驻留
强制2个字符串指向同一个对象
PyCharm对字符串进行了优化处理
a = 'abc'
b = "abc"
c = '''abc'''
print(a,id(a))
print(b,id(b))
print(c,id(c))
# 全部输出:abc 2642812555184
7.3 字符串的查询操作
- index():查找子串substr第一次出现的位置,如果查找的子串不存在时,则抛出ValueError
- rindex() :查找子串substr最后一次出现的位置,如果查找的子串不存在时,则抛出ValueError
- find():查找子串substr第一次出现的位置,如果查找的子串不存在时,则返回-1
- rfindO:查找子串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
print(s.find('k')) #-1
print(s.index('k')) #报错:ValueError: substring not found
7.4 字符串的大小写转换操作
- upper():把字符串中所有字符都转成大写字母
- lower():把字符串中所有字符都转成小写字母
- swapcase():把字符串中所有大写字母转成小写字母,把所有小写字母都转成大写字母
- capitalize():把第一个字符转换为大写,把其余字符转换为小写
- title():把每个单词的第一个字符转换为大写,把每个单词的剩余字符转换为小写
7.5 字符串的对齐操作
- center():居中对齐,第1个参数指定宽度,第2个参数指定填充符,第2个参数是可选的,默认是空格,如果设置宽度小于实际宽度则则返回原字符串
- ljust():左对齐,第1个参数指定宽度,第2个参数指定填充符,第2个参数是可选的,默认是空格,如果设置宽度小于实际宽度则则返回原字符串
- rjust():右对齐,第1个参数指定宽度,第2个参数指定填充符,第2个参数是可选的,默认是空格,如果设置宽度小于实际宽度则则返回原字符串
- zfill():右对齐,左边用0填充,该方法只接收一个参数,用于指定字符串的宽度,如果指定的宽度小于等于字符串的长度,返回字符串本身
s = 'hello,hello'
print(s.center(20,'*'))
print(s.ljust(20,'*'))
print(s.rjust(20,'*'))
print(s.zfill(20))
'''
****hello,hello*****
hello,hello*********
*********hello,hello
000000000hello,hello
'''
7.5 字符串的劈分操作
-
split():
1.从字符串的左边开始劈分,默认的劈分字符是空格字符串,返回的值都是一个列表;
2.通过参数sep指定劈分字符串的劈分符
3.通过参数maxsplit指定劈分字符串时的最大劈分次数,在经过最大次劈分之后,剩余的子串会单独做为一部分 -
rsplit():
1.从字符串的右边开始劈分,默认的劈分字符是空格字符串,返回的值都是一个列表;
2.通过参数sep指定劈分字符串是劈分符
3.通过参数maxsplit指定劈分字符串时的最大劈分次数,在经过最大次劈分之后,剩余的子串会单独做为一部分
s = 'hello,hello,world'
list = s.split()
print(list)# ['hello,hello,world']
# 从左侧开始劈分
s1 = 'hello|world|python'
print(s1.split())
print(s1.split(sep='|'))
print(s1.split(sep='|',maxsplit=1))
'''
['hello|world|python']
['hello', 'world', 'python']
['hello', 'world|python']
'''
# 从右侧开始劈分
print(s1.rsplit())
print(s1.rsplit('|'))
print(s1.rsplit(sep='|',maxsplit=1))
'''
['hello|world|python']
['hello', 'world', 'python']
['hello|world', 'python']
'''
7.6 字符串的判断操作
- isidentifier():判断指定的字符串是不是合法的标识符
- isspace():判断指定的字符串是否全部由空白字符组成(回车、换行,水平制表符)
- isalpha():判断指定的字符串是否全部由字母组成
- isdecimal():判断指定字符串是否全部由十进制的数字组成
- isnumeric():判断指定的字符串是否全部由数字组成
- isalnum():判断指定字符串是否全部由字母和数字组成
s = 'hello,hello,world'
print(s.isidentifier()) #False
print(s.isspace()) #False
print(s.isalpha()) #False
print(s.isdecimal()) #False
print((123).isnumeric()) #True 数字要括起来
print(s.isalnum()) #False
print('abc'.isidentifier()) #True
7.6 字符串的替换和合并操作
- replace():第1个参数指定被替换的子串,第2个参数指定替换子串的字符串,该方法返回替换后得到的字符串,替换前的字符串不发生变化,调用该方法时可以通过第3个参数指定最大替换次数
- join():将列表或元组中的字符串合并成一个字符串
# ?????分隔符怎么不是在中间 待解
s = 'hello,hello,world,join,hello'
print(s.replace('world','my')) #hello,hello,my,join,hello
print(s.replace('hello','hi',2)) # hi,hi,world,join,hello
list = [ 'hello','hello','world','join','hello']
print('|',join(list)) #| hello hello world join hello
print('',join(list)) # hello hello world join hello 前面有个空格
t = ('hello','hello','world','join','hello')
print('',join(t)) # hello hello world join hello
print('*',join('python')) #* p y t h o n
7.7 字符串的比较
print('apple'>'app') #True
print('apple'>'banana') #False
print(ord('a'),ord('b')) #False
print(chr(97),chr(98)) #a b
7.8 字符串的切片操作
字符串是不可变类型,不具备增删改等操作,切片操作后将产生新的对象
s ='hello,python'
s1 = s[:5]
s2 = s[6:]
s3 = '!'
s4 = s1+s2+s3
print(s1)
print(s2)
print(s4)
print(id(s))
print(id(s1))
print(id(s2))
print(id(s4))
'''
hello
python
2537319571632
2537319581488
2537319581040
'''
#切片操作 [start:end:step]
s ='hello,python'
print(s[1:5:1]) #从1开始截到5,步长为1
print(s[::2]) #默认从0开始,到最后一个元素结束,步长为2
print(s[::-1]) #默认从最后一个元素开始,到第一个元素结束,因为步长为负
print(s[-6::1]) # 从索引为-6开始,到字符串的最后一个结束,步长为1
'''
ello
hlopto
nohtyp,olleh
python
'''
7.9 字符串的格式化
- %作占位符:%s 字符串;%i或%d 整数;%f 浮点数
- {}作占位符:
'我的名字叫:{0},今年{1}岁了,我真的叫{0}'.format(name,age)
其中,{}里面的0和1分别表示format中下标为0和为1的变量 - f-string
name = '张三'
age = 19
#%占位符 ' '%()
print('我叫%s,今年%d岁'%(name,age)) #我叫张三,今年19岁
#{} ' '.format()
print('我叫{0},今年{1}岁'.format(name,age)) #我叫张三,今年19岁
#f-string f' {} '
print(f'我叫{name},今年{age}岁') #我叫张三,今年19岁
- 精度和宽度
print('%10d'%99) #10表示宽度
print('%.3f'%3.14159) #.3表示精度,小数点后面保留几位小数
print('%10.3f'%3.14159) #同时表示精度和宽度
print('{0:.3}'.format(3.14159)) #表示format中的第一个变量保存3位数
print('{0:.3f}'.format(3.14159)) #表示format中的第一个变量保存3位小数
print('{:10.3f}'.format(3.14159)) #默认format中的第一个变量,保存3位小数,宽度为10
'''
99
3.142
3.142
3.14
3.142
3.142
'''
7.10 字符串的编码和解码
- 编码:将字符串转换成二进制数据bytes
- 解码:将bytes类型的数据转换成字符串类型
s = '天涯共此时'
#编码 GBK中一个中文两个字节,UTF-8中,一个中文三个字节
byte = s.encode(encoding='GBK')
#解码
print(byte.decode(encoding='GBK'))