目录
1字符串的驻留机制
字符串同元组一样,是一个不可变的字符序列。可用''," ",''' ''',来创建。
字符串的驻留机制:仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串的驻留池中,python的驻留机制对相同的字符串只保留一份拷贝,后续创建相同字符串时,不会开辟新空间,而是把该字符串的地址赋给新创建的变量。
驻留机制的几种情况(交互模式)
1.字符串的长度为0或1时
2.符合标识符的字符串
3.字符串只在编译时进行驻留,而非运行时
4.[-5,256]之间的整数数字
sys中的intern方法强制2个字符串指向同一个对象
pycharm对字符串进行了优化处理
字符串驻留机制的优缺点:
当需要值相同的字符串时,可以直接从字符串池里拿来使用,避免频繁的创建和销毁,提升效率和节约内存,因此拼接字符串和修改字符串是会比较影响性能。
当需要进行字符串拼接时建议使用str类型的join方法,而非+,因为join()方法是先计算出所有字符中的长度,然后再拷贝,只new一次对象,效率要比“+”效率高。
2字符串的常用操作
1字符串的查询操作的方法:
a = "hello, hello"
print(a.index('lo')) # 3 ## 查找字符串第一次出现的位置,查找的字符串不存在会报错
print(a.find('lo')) # 3 ## 查找字符串第一次出现的位置,查找的字符串不存在会报-1
print(a.rindex('lo')) # 10 ## 查找字符串最后一次出现的位置,查找的字符串不存在会报错
print(a.rfind('lo')) # 10 ## 查找字符串最后一次出现的位置,查找的字符串不存在会报-1
# print(a.index('k')) # ValueError: substring not found
print(a.find('k')) # -1
2字符串的大小写转换操作方法
"-----字符串中的大小写转换的方法------"
s = "Hello worlD!,this is python."
print(s.upper()) # 全部转成大写的字符串
print(s.lower()) # 转完之后虽然值是一样的,但是和原来的id是不一样的,说明字符串是不可变序列,转完之后产生了新的序列
print(s.swapcase()) # 把字符串中所有的大写转为小写,小写转为大写
print(s.capitalize()) # 把字符串的第一个字符大写,其余均为小写
print(s.title()) # 把字符串中的每个单词的首字母大写,其余的字符为小写
3字符串内容对齐操作:
"-----字符串内容对齐操作------"
s = 'hello,world!'
# center() 居中对齐,第一个参数指定宽度,第二个参数指定填充字符,默认为空格
print(s.center(20, "#")) # 给定20的长度,字符串一共12个,然后左右各填充4个#
# ####hello,world!####
# ljust() 左对齐,第一个参数指定宽度,第二个参数指定填充字符,默认为空格
print(s.ljust(20, "*")) # 给定20的宽度,字符串左对齐,其余的填充*,如果设的宽度小于原字符,就返回返回原字符
# hello,world!********
# rjust() 右对齐,第一个参数指定宽度,第二个参数指定填充符
print(s.rjust(20, "!"))
# !!!!!!!!hello,world!
# zfill() 右对齐,左边用0填充,该方法只接收一个参数,用于指定字符串的宽度,如果指定的宽度小于等于字符串的长度,返回字符串本身
print(s.zfill(20))
# 00000000hello,world!
4字符串劈分操作的方法
"-----字符串内容劈分操作------"
s1 = 'hello,world! this is python!'
print(s1.split()) # 默认空格分割 ,也就是按空格分开
# ['hello,world!', 'this', 'is', 'python!']
s2 = 'hello world! |this |is |python!'
print(s2.split(sep="|")) # 以|分割
# ['hello world! ', 'this ', 'is ', 'python!']
print(s2.split(sep='|', maxsplit=1)) # maxsplit为最大劈分次数,也就是分几次,其余的就不分了
# ['hello world! ', 'this |is |python!']
print(s1.rsplit()) # rsplit()就是从右侧开始劈分,默认为空格
# ['hello,world!', 'this', 'is', 'python!']
print(s2.rsplit(sep="|",maxsplit=1))
# ['hello world! |this |is ', 'python!']
5判断字符串操作的方法
"-----判断字符串操作的方法------"
s1 = "hello world!, this is python!"
# isidentifier() 判断字符串是否是合法的标识符
print(s1.isidentifier()) # False ## 合法的字符串(数字,下划线,字母),这里有逗号。
print("hello".isidentifier()) # True
print('张三_123'.isidentifier()) # True
# isspace() 判断指定的字符串是否全部由空白字符(回车,水平制表符,换行)组成
print("\t".isspace()) # True
# isalpha() 判断指定的字符串是否由全部由字母组成
print('abc'.isalpha()) # True
print('李潇'.isalpha()) # True
print('abc1'.isalpha()) # False
# isdecimal() 判断指定字符串是否由是十进制的数字组成
print('123'.isdecimal()) # True
print('123四'.isdecimal()) # False
# isnumeric() 判断指定的字符串是否全部由数字组成
print('123'.isnumeric()) # True
print('123四'.isnumeric()) # True
# isalnum() 判断字符串是否全部由字母和数字组成
print('123abc'.isalnum()) # True
print('123abc!'.isalnum()) # False
6字符串操作的其它方法
"--------字符串的替换------"
# replace() 第一个参数指定被替换的字串,第二个参数为要替换的字符串,第三个参数指定最大替换次数
s1 = "hello,python,python,python"
print(s1.replace("python", "java", 2))
# join() 将列表或元组中的字符串合并成一个字符串
lst = ['hello', 'python', 'java']
print('|'.join(lst)) # hello|python|java
print(''.join(lst)) # hellopythonjava
t = ('h', 'e', 'l', 'l', 'o')
print("".join(t)) # hello
print('*'.join('python')) # p*y*t*h*o*n
3字符串的比较
运算符:>,<,<=,>=,==,!=
比较规则:首先比较两个字符串中的第一个字符,如果相等则继续比较下一个字符,依次比较下去,直到两个字符串中的字符不相等时,则比较结果就是两个字符串的比较结果,两个字符串中的所有后续字符将不再被比较。
比较原理:两上字符进行比较时,比较的是其ordinal value(原始值),调用内置函数ord(),k可以得到指定字符的ordinal value。与内置函数ord()对应的是内置函数chr,调用内置函数chr时,指定ordinal value可以得到其对应的字符。
"--------字符串的比较------"
print('apple' > 'app') # True
print('apple' > 'banana') # False
# 这里比较的是原始值,从第一个字母开始
print(ord('a')) # 97
print(ord('b')) # 98
print(chr(97)) # a
print(ord('李')) # 26446
print(chr(26446)) # 李
4字符串的切片操作
字符串是不可变类型,不具备增删改操作。
切片操作之后会产生新的对象
字符串切片同列表切片一样。
5格式化字符串
1.以%作为占位符
%s表示字符串,%i或者%d表示整数,%f表示浮点数
# 1.以%做为占位符
name = '张三'
age = 20
print('我是%s,今年%d岁了' % (name, age))
2.{}作为占位符
"--------格式化字符串------"
name = '张三'
age = 20
# 2.以{}做为占位符
print('我是{0},我今年{1}岁了,我真的叫{0}'.format(name, age))
3.f -string
print(f'我叫{name},今年{age}岁了')
"--------格式化字符串------"
# 1.以%做为占位符
name = '张三'
age = 20
# 3.f-string
print(f"我叫{name},今年{age}岁了")
4.宽度和精度
print("%10d" % 99) # 这里的10表示宽度
print('%.4f' % 3.1415926535) # 3.1416 .4表示保留4位小数
print('%10.3f' % 3.1415926) # # 3.142 还可以同时指定宽度和精度
print("{0:.3}".format(3.1415926)) # 3.14 这里的.3表示一共是3位,这里的0是索引
print("{0:.3f}".format(3.1415926)) # 3.142 这里的.3表示3位小数
print("{0:10.3f}".format(3.1415926)) # 3.142 同时指定宽度和精度
6字符串的编码转换
字符串转成二进制数据,再从二进制转成字符串
编码与解码的方式:
编码:将字符串转为2进制数据(bytes)
字符串.encode(encoding='编码格式')
解码:将bytes类型的数据转为字符串类型
字符串.decode(encoding='编码格式')
"--------字符串编码------"
##### 编码,将字符串转为2进制
s = "书山有路勤为径"
print(s.encode(encoding='UTF-8')) # 在utf-8中一个中文占3个字节
print(s.encode(encoding='GBK')) # 在GBK中一个中文占2个字节
##### 解码
## print(二进制数.decode(encoding='编码表'))
print(b'\xca\xe9\xc9\xbd\xd3\xd0\xc2\xb7\xc7\xda\xce\xaa\xbe\xb6'.decode(encoding='GBK'))
# 书山有路勤为径
print(b'\xe4\xb9\xa6\xe5\xb1\xb1\xe6\x9c\x89\xe8\xb7\xaf\xe5\x8b\xa4\xe4\xb8\xba\xe5\xbe\x84'.decode(encoding="UTF-8"))