一句废话都没有的Pycharm(九):字符串
介绍:
-
1.字符串的驻留机制
-
2.字符串的常用操作
- 2.1查询
- 2.2字符串大小写转换
- 2.3字符串内容对齐
- 2.4字符串的劈分
- 2.5判断字符串
- 2.6替换与合并
-
3.字符串的比较
-
4.字符串的切片操作
-
5.格式化字符串
-
6.字符串的编码转换
1.字符串的驻留机制
字符串的驻留机制就是仅保留一份相同且不可变的保存方式。具体来说,我用三种方式输出同一个字符串,它们的地址都是相同的。
例如:
#字符串的驻留机制
a='kcopop'
b="kcopop"
c='''kcopop'''
print(a,id(a))#id:4463805616
print(b,id(b))#id:4463805616
print(c,id(c))#id:4463805616,
#由此,我们发现,相同字符串的不同输出有相同的id,这就叫字符串的驻留机制
结果:
驻留机制会出现的几种情况:
- 字符串的长度为0或者1
- 符合标识符的字符串(含有字母、数字、下划线的字符串)
- 字符串只在编译时进行驻留,非运行时
- [-5,256]之间的整数数字
对于pycharm来说,它优化这个机制,只要内容相同,就自动驻留。
2.字符串的常用操作
2.1查询
骨骼图:
代码展示:
#查找
s="hello,hello"
print(s.index('lo'))#查找子串lo第一次出现的位置
print(s.rindex('lo'))#查找子串lo第一次出现的位置
print(s.find('lo'))#查找子串lo最后一次出现的位置
print(s.rfind('lo'))#查找子串lo最后一次出现的位置
#print(s.index('hd'))#ValueError: substring not found 如果查找的子串不存在,则输出ValueError
#print(s.rindex('hd'))#ValueError: substring not found 如果查找的子串不存在,则输出ValueError
print(s.find('hd'))#如果查找的子串不存在,则返回-1
print(s.rfind('hd'))#如果查找的子串不存在,则返回-1
结果展示:
2.2字符串大小写转换
字符串是个不可变序列,改变大小写将会产生一个新的字符串对象。
骨骼图
代码片段:
p="hello,Lihuanying"
print(p.upper())#所有字母转换成大写
print(p.lower())#所有字母转换成小写
print(p.swapcase())#字符串中大写换小写,小写换大写
print(p.capitalize())#第一个字符转成大写,其余转成小写
print(p.title())#每个单词第一个字符转为大写,每个单词剩余转为小写
结果展示:
2.3字符串内容对齐
骨骼图:
代码演示:
#字符串内容对齐
print(p.center(20,'*'))#居中
print(p.ljust(20,'*'))#左对齐
print(p.rjust(20,'*'))#右对齐
print(p.zfill(20))#右对齐,右边用0填充
print('-1.222'.zfill(10))#右对齐,右边用0填充,0填充在负号后面了
结果展示:
2.4字符串的劈分
骨骼图:
代码演示:
#劈分
#split()默认从左开始分
q='hello; Li; huan; ying"'
print(q.split())#默认的劈分字符是空格操作,返回的值是一个列表
print(q.split(sep=';'))#指定;为劈分符
print(q.split(sep=';',maxsplit=2))#指定;为劈分符,最大劈分次数为2,则剩余的huan; ying会作为一个整体
#rsplit()默认从右开始分
print(q.rsplit())#默认的劈分字符是空格操作,返回的值是一个列表
print(q.rsplit(sep=';'))#指定;为劈分符
print(q.rsplit(sep=';',maxsplit=2))#指定;为劈分符,最大劈分次数为2,则剩余的huan; ying会作为一个整体
结果展示:
2.5判断字符串
骨骼图:
代码展示:
#判断字符串
#判断指定字符串是不是合法的标识符
print('1.','Tom汤姆_1'.isidentifier())#T:数字字母下划线都是合法的
print('2.','Tom汤姆&_1'.isidentifier())#F
#判断指定字符串是否全部由空白字符组成(回车,换行,水平制表符)
print('3.','\t\n\r'.isspace())#T回车,换行,水平制表符
print('4.','\b'.isspace())#F退格不是空白字符
#判断指定字符串是不是全部由字母组成
print('5.','Tom汤姆'.isalpha())#T
print('6.','1'.isalpha())#F
#判断指定字符串是不是全部由十进制的数字组成
print('7.','123'.isdecimal())#T
print('8.','一'.isdecimal())#F
#判断指定字符串是不是全部由数字组成
print('9.','一1'.isnumeric())#T
#判断指定字符串是不是全部由字母和数字组成
print('10.','一1tom汤姆'.isalnum())#T
print('11.','_'.isalnum())#F
结果展示:
2.6替换与合并
骨骼图:
代码演示:
#替换
y='hi,Tom,Jerry,Peter,Alice'
print(y.replace('Tom','Bob'))
y='hi,Tom,Tom,Tom,er,Alice'
print(y.replace('Tom','Bob',2))#第一个参数指定被替换的子串,第二个参数指定替换子串的字符串,第三个参数指定最大替换次数
#合并
#合并字符串
lis=['hi','Tom','Join']
print(''.join(lis))
print(','.join(lis))#用逗号隔开
#合并元组
tuple1=('hi','Tom','Join')
print(','.join(tuple1))#用逗号隔开
结果展示:
3.字符串的比较
比较运算符>,>=,<,<=,==,!=
当两个字符进行比较时,其实比较的是他们的ordinal value,可以用函数ord()得到字符的ordinal valu,相反,可以用函数chr获得ordinal valu所对应的字符。
例如:通过ord(a)
可以得到a的ordinal value为97。
代码演示:
#比较
print('a'>'b')#F
print('a'<'b')#T
print(ord('a'))
print(ord('b'))
print(chr(97))
print(chr(98))
print('abb'=='abb')#T
print('abb'!='abb')#F
结果:
4.字符串的切片操作
我们都知道字符串是一个不可变类型,不能进行增删改操作,但通过引入切片操作,我们可以对字符串引入新元素。
代码演示:
#切片新增元素
q='hello,Lihuanying"'
q1=q[:5]
print(q1)
q2=q[6:]
print(q2)
q3='!'
q4=q1+q3+q2
print(q4)
结果:
5.格式化字符串
创建方式
- %占位符
- %s——字符串
- %I或%d——整数
- %f——浮点数
语法:'我是%s,今年%d岁' % (name,age)
- {}
语法:'我是{0},今年{1}岁,没骗你,真的{1}岁' .format (name,age)
代码演示:
#格式化
#%
name='Tom'
age=22
print('我叫%s,今年%d岁了' % (name,age))
#{}
print('我叫{0},今年{1}岁了,不骗你,真的{1}岁'.format(name,age))
结果:
6.字符串的编码转换
- 编码
将字符串转化为二进制数据(bytes)
- 解码
将bytes类型的数据转换为字符串类型
代码演示:
#编码
a='你是谁'
print(a.encode(encoding='GBK'))#在GBK编码格式中一个中文占两个字符
print(a.encode(encoding='UTF-8'))#在GBK编码格式中一个中文占三个字符
#解码
w1=a.encode(encoding='GBK')
print(w1.decode(encoding='GBK'))
w2=a.encode(encoding='UTF-8')
print(w2.decode(encoding='UTF-8'))
结果展示: