目录
1.2 sys中的intern方法强制2个字符串指向同一个对象
1.字符串的驻留机制
1.1 驻留机制的几种情况(交互模式)
- 字符串的长度为1或0时
- 符合标识符的字符串
- 字符串只在编译是进行驻留,而非运行时
- [-5,256]直接的整数数字
运行代码:在交互模式下
>>> s1=''
>>> s2=''
>>> s1 is s2
True
>>> s1='%'
>>> s2='%'
>>> s1 is s2
True
>>> s1='abc%'
>>> s2='abc%'
>>> s1==s2
True
>>> s1 is s2
False
>>> id(s1)
2427592439920
>>> id(s2)
2427592440496
>>> s1='abcx'
>>> s2='abcx'
>>> s1 is s2
True
>>> a='abc'
>>> b='a'+'bc'
>>> c=''.join(['ab','c'])
>>> a is b
True
>>> a is c
False
>>> c
'abc'
>>> type(c)
<class 'str'>
>>> type(a)
<class 'str'>
>>> a=-5
>>> b=-5
>>> a is b
True
>>> a=-6
>>> b=-6
>>> a is b
1.2 sys中的intern方法强制2个字符串指向同一个对象
运行代码:在交互模式下
>>> import sys
>>> a='abc%'
>>> b='abc%'
>>> a is b
False
>>> a=sys.intern(b)
>>> a is b
True
>>>
1.3 PyCharm对字符串进行了优化处理
运行结果:在PyCharm中
s1='abc%'
s2='abc%'
print(s1 is s2)#True
1.4 字符串驻留机制的优缺点
- 当需要值相同的字符串是,可以直接从字符串池中拿来使用,避免频繁的创建和销毁,提升效率和节约内存,因此拼接字符串和修改字符串是比较影响性能的
- 在需要进行字符串拼接时建议使用str类型的join方法,而非+,因为join()方法是先计算出所以字符的长度,然后拷贝,只new一次对象,效率要比“+”效率高
2.字符串的常用操作
2.1 字符串的查询操作
功能 | 方法名称 | 作用 |
---|---|---|
查询方法 | 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
#print(s.index('k'))#ValueError: substring not found
print(s.find('k'))#-1
#print(s.rindex('k'))#ValueError: substring not found
print(s.rfind('k'))#-1
2.2 字符串的大小写转化操作
功能 | 方法名称 | 作用 |
---|---|---|
大小写转化 | upper() | 把字符串中所有字符转成大写字母 |
lower() | 把字符串中所有字符转成小写字母 | |
swapcase() | 把字符串中所有大写字母转成小写字母,小写字母转成大写字母 | |
capitalize() | 把第一个字符转为大写,把其余字符转为小写 | |
title() | 把每个单词的第一个字符转为大写,每个单词剩余字符转为小写 |
代码演示:
s='hello,python'
'''upper(),会产生一个新的字符串对象'''
a=s.upper()
print(a,id(a))#HELLO,PYTHON 2544300046064
print(s,id(s))#hello,Python 2544300356272
'''lower(),会产生一个新的字符串对象'''
s1='hello,PYTHON'
b=s1.lower()
print(b,id(b))#hello,python 2544300095856
print(s1,id(s1))#hello,Python 2544300356272
s2='hello,PYTHON'
print(s2.swapcase())#HELLO,python
print(s2.capitalize())#Hello,python
print(s2.title())#Hello,Python
2.3 字符串内容对齐操作的方法
功能 | 方法名称 | 作用 |
---|---|---|
字符串对齐 | center() | 居中对齐,第一个参数指定宽度,第二个参数指定填充符,默认是空格,设置宽度小于实际宽度,返回原字符串 |
ljust() | 左对齐,第一个参数指定宽度,第二个参数指定填充符,默认是空格,设置宽度小于实际宽度,返回原字符串 | |
rjust() | 右对齐,第一个参数指定宽度,第二个参数指定填充符,默认是空格,设置宽度小于实际宽度,返回原字符串 | |
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.rjust(20))# hello,python
print(s.rjust(5))#hello,python
'''右对齐,使用0进行填充'''
print(s.zfill(20))#00000000hello,python
print('123456'.zfill(20))#00000000000000123456
print('-123456'.zfill(20))#-0000000000000123456
2.4 字符串劈分操作
功能 | 方法名称 | 作用 |
---|---|---|
字符串劈分 | split() | 从字符串的左边开始劈分,默认的劈分字符是空格字符串,返回的值都是一个列表 |
以通过参数sep指定劈分字符串的劈分符 | ||
通过参数maxsplit指定劈分字符串时的最大劈分次数,在经过最大劈分次数之后,剩余的子串会单独作为一部分 | ||
rsplit() | 从字符串的右边开始劈分,默认的劈分字符是空格字符串,返回的值都是一个列表 | |
以通过参数sep指定劈分字符串的劈分符 | ||
通过参数maxsplit指定劈分字符串时的最大劈分次数,在经过最大劈分次数之后,剩余的子串会单独作为一部分 |
代码演示:
s='hello world python'
'''从左边开始劈分'''
lst=s.split()
print(lst)#['hello', 'world', 'python']
s1='hello-world-python'
lst=s1.split(sep='-')
print(lst)#['hello', 'world', 'python']
s1='hello-world-python'
lst=s1.split(sep='-',maxsplit=1)
print(lst)#['hello', 'world-python']
'''从右边开始劈分'''
s1='hello-world-python'
lst=s1.rsplit(sep='-',maxsplit=1)
print(lst)#['hello-world', 'python']
2.5 判断字符串操作
功能 | 方法名称 | 作用 |
---|---|---|
判断字符串 | isidentifier() | 判断指定的字符串是不是合法的标识符 |
isspace() | 判断指定的字符串是否全部由空白字符组成(回车,换行,水平制表符) | |
isalpha() | 判断指定的字符串是否全部由字母组成 | |
isdecimal() | 判断指定的字符串是否全部由十进制的数字组成 | |
isnumeric() | 判断指定的字符串是否全部由数字组成 | |
isalnum() | 判断指定的字符串是否全部由字母和数字组成 |
注:合法标识符由字母,数字,下划线组成
代码演示:
s='hello,python'
print('1.',s.isidentifier())#1. False
print('2.','hello'.isidentifier())#2. True
print('3.','张三_'.isidentifier())#3. True
print('4.','张三_123'.isidentifier())#4. True
print('5.','\t'.isspace())#5. True
print('6.','abc'.isalpha())#6. True
print('7.','张三'.isalpha())#7. True
print('8.','张三1'.isalpha())#8. False
print('9.','123'.isdecimal())#9. True
print('10.','123四'.isdecimal())#10. False
print('11.','ⅡⅢⅣ'.isdecimal())#11. False
print('12.','123'.isnumeric())#12. True
print('13.','123四'.isnumeric())#13. True
print('14.','ⅡⅢⅣ'.isnumeric())#14. True
print('15.','abc1'.isalnum())#15. True
print('16.','张三123'.isalnum())#16. True
print('17.','abc!'.isalnum())#17. False
2.6 字符串操作的其他方法
功能 | 方法名称 | 作用 |
---|---|---|
字符串替换 | replace() | 第一个参数指定被替换的子串,第二个参数指定替换子串的字符串,该方法返回替换后得到的字符串,替换前的字符串不会发生变化,调用该方法时可以通过第三个参数指定最大替换次数 |
字符串的合并 | join() | 将列表或元组中的字符串合并成一个字符串 |
代码演示:
s='hello,Python'
print(s.replace('Python','Java'))#hello,Java
s1='hello,Python,Python,Python'
print(s1.replace('Python','Java',2))#hello,Java,Java,Python
lst=['hello','java','Python']
print('*'.join(lst))#hello*java*Python
print(''.join(lst))#hellojavaPython
''' '*'.join(lst) 表示用*粘连列表lst中的字符串'''
3.字符串的比较
print('apple'>'app')#True
print('apple'>'banana')
print(ord('a'),ord('b'))
print(ord('刘'))
print(chr(97),chr(98))
print(chr(21016))
4.字符串的切片操作
- 字符串是不可变类型
- 不具备增,删,改操作
- 切片操作将产生新对象
s='hello,Python'
s1=s[:5]
s2=s[6:]
s3='!'
newstr=s1+s2+s3
print(s1)#hello
print(s2)#Python
print(newstr)#helloPython!
print(s[1:5:1])#ello
print(s[::-1])#nohtyP,olleh
5.格式化字符串
三种方式:
(1)% 占位符
(2){}
(3)f-string
#(1) % 占位符
name='张三'
age=20
print('我叫%s,今年%d岁' % (name,age))#我叫张三,今年20岁
#(2) {}
print('我叫{0},今年{1}岁'.format(name,age))#我叫张三,今年20岁
#(3) f-strint
print(f'我叫{name},今年{age}岁')#我叫张三,今年20岁
#(1)
print('%d' % 99)
print('%10d' % 99)#10表示宽度
print('%f' % 3.1415926)#3.141593
print('%.3f' % 3.1415926)#3.142 注:.3表示小数点后三位
#同时表示宽度和精度
print('%10.3f' % 3.1415926)# 3.142 注:总宽度10,小数点后3位
#(2)
print('{0:0.3}'.format(3.1415926))#3.14 注:.3表示的是一共3位数
print('{:.3f}'.format(3.1415926))#3.142 注:.3f表示2位小数
print('{:10.3f}'.format(3.1415926))# 3.142 注:同时设置精度和宽度,总宽度10,小数点后3位
6.字符串的编码转化
编码与解码的方式:
编码:将字符串转化为二进制数据(bytes)
解码:将(bytes)类型的数据转化成字符串类型
s='天涯共此时'
#编码
print(s.encode(encoding='GBK'))#GBK编码格式中,一个中文占俩字节
#b'\xcc\xec\xd1\xc4\xb9\xb2\xb4\xcb\xca\xb1'
print(s.encode(encoding='UTF-8'))#UTF-8编码格式中,一个中文占三个字节
#b'\xe5\xa4\xa9\xe6\xb6\xaf\xe5\x85\xb1\xe6\xad\xa4\xe6\x97\xb6'
#解码
byte1=s.encode(encoding='GBK')
byte2=s.encode(encoding='UTF-8')
print(byte1.decode(encoding='GBK'))#天涯共此时
print(byte2.decode(encoding='UTF-8'))#天涯共此时