字符串

在Python中是根本数据类型,是不可变的字符序列

字符串的驻留机制

仅保留一份雷同且不可变字符串的办法,不同的值被寄存在字符串的驻留池中,Python的驻留机制对雷同的字符串只保留一份拷贝,后续创立雷同的字符串时,不会开拓新空间,而且把该字符串的地址赋给新创建的变量。

字符串的驻留机制产生的几种状况:

# 1.字符串的长度为0或1s1 = ''s2 = ''print(s1 is s2)  # True# 2.合乎标识符的字符串(合乎命名标准:字母、数字、下划线)s1 = 'ab_'s2 = 'ab_'print(s1 is s2)  # True# 3.字符串只在编译时驻留,而非运行时a = 'abc'b = 'ab' + 'c'c = ''.join(['ab', 'c'])print(a is b)  # Trueprint(a is c)  # False# 4.[-5, 256]间接的整数数字a = '-5'b = '-5'print(a is b)  # True

驻留机制的优缺点:

须要值雷同的字符串,能够间接从字符串池拿来应用,防止频繁的创立和销毁,晋升效率、节约内存,因而拼接字符串和批改字符串是比拟影响性能的。在须要进行字符串拼接时倡议应用str类型的join办法,而非“+”,因为join()办法是先计算所有字符的长度,再拷贝,至新建一次对象,效率更高。

字符串的罕用操作

查问子串地位

# 1.index():子串首次呈现的地位,不存在,抛出# 2.rindex():子串末次呈现的地位,不存在,抛出# 3.find():子串首次呈现的地位,不存在,返回-1# 4.rfind():子串末次呈现的地位,不存在,返回-1s = 'hello hello'print(s.index('h'))  # 0# print(s.index('j'))  # ValueError: substring not foundprint(s.rindex('h'))  # 6print(s.find('h'))  # 0print(s.find('j'))  # -1print(s.rfind('h'))  # 6

大小写转换操作

# 1.upper: 把所有字符转成大写,产生新的字符串对象# 2.lower: 把所有字符转成小写,产生新的字符串对象# 3.swapcase: 把所有字符小写变大写,大写变小写,产生新的字符串对象# 4.capitalize: 把第一个字符转成大写,其余转小写,产生新的字符串对象# 4.title: 把每一个单词的首字符转成大写,其余转小写,产生新的字符串对象s = 'hello world'print(s.upper())  # HELLO WORLDprint(s.lower())  # hello worldprint(s.swapcase())  # HELLO WORLDprint(s.capitalize())  # Hello worldprint(s.title())  # Hello World

字符串内容的对齐操作

# 1.center(): 居中对齐,第一个参数指定宽度,第二个参数指定填充符,第二个参数可选,默认空格,设置宽度小于理论宽度则返回原字符串# 2.ljust(): 左对齐,第一个参数指定宽度,第二个参数指定填充符,第二个参数可选,默认空格,设置宽度小于理论宽度则返回原字符串# 3.rjust(): 右对齐,第一个参数指定宽度,第二个参数指定填充符,第二个参数可选,默认空格,设置宽度小于理论宽度则返回原字符串# 4.zfill(): 右对齐,右边用0填充,只有一个参数指定宽度,设置宽度小于理论宽度则返回原字符串s1 = 'hello Python'print(s.center(20))print(s.center(20, '-'))  # ----hello world-----print(s.ljust(20, '-'))  # hello world---------print(s.rjust(20, '-'))  # ---------hello worldprint(s.zfill(20))  # 000000000hello worldprint('-8911'.zfill(8))  # -0008911

字符串的劈分操作

# 1.split(): 从左开始劈分,默认的劈分字符是空格,返回一个列表;# 通过sep参数指定劈分的字符;参数maxsplit指定最大劈分次数,超出次数后,残余的子串会独自做为一部分# 2.rsplit(): 从右开始劈分,默认的劈分字符是空格,返回一个列表;# 通过sep参数指定劈分的字符;参数maxsplit指定最大劈分次数,超出次数后,残余的子串会独自做为一部分s3 = 'hello my name is Alin's4 = 'hello-my-name-is-Bill'print(s3.split())  # ['hello', 'my', 'name', 'is', 'Alin']print(s4.split(sep='-'))  # ['hello', 'my', 'name', 'is', 'Bill']print(s4.split('-', maxsplit=3))  # ['hello', 'my', 'name', 'is-Bill']print(s4.rsplit('-', maxsplit=3))  # ['hello-my', 'name', 'is', 'Bill']print(s3.rsplit())  # ['hello', 'my', 'name', 'is', 'Alin']

判断字符串的操作方法

# 1.isidentifier(): 判断是否是非法的标识符# 2.isspace(): 判断是否由空白字符组成(回车、换行、制表符)# 3.isalpha(): 判断是否由字母字符组成# 3.isdecimal(): 判断是否由十进制数字组成# 3.isnumeric(): 判断是否由数字组成(包含汉字、罗马数字等)# 3.isalnum(): 判断是否由字母和数字组成s5 = 'hello'print(s5.isidentifier())  # Trueprint(s5.isspace())  # Falseprint(s5.isalpha())  # Trueprint(s5.isdecimal())  # Falseprint(s5.isnumeric())  # Falseprint(s5.isalnum())  # True

字符串的替换

# replace(): 返回替换后失去的新字符串对象,原字符串不发生变化# 参数1:被替换的子串# 参数2:用来替换的子串# 参数3:最大替换的次数s6 = 'hello 1 1 1'print(s6.replace('1', '2', 2))  # hello 2 2 1

字符串的合并

# join():将列表或元组中的字符串合并成一个字符串l1 = ['1', 2, '2']l2 = ['1', '2', '3']# print(''.join(l1))  # TypeError: sequence item 1: expected str instance, int foundprint('-'.join(l2))  # 1-2-3

字符串的比拟操作

# 运算符:>,>=,<,<=,==,!=# 比拟规定:从第一个开始,若相等,持续比拟下一个,顺次比拟,首次不相等时的比拟后果# 为两个字符串的比拟后果,后续的字符将不再进行比拟# 比拟原理:两个字符比拟的是其ordinal value,调用内置函数ord()能够失去字符的ordinal value;# 内置函数chr():指定ordinal value获取对应的字符。print('apple' > 'appml')  # Falseprint('apple' > 'app')  # Trueprint('apple' > 'b')  # Falseprint(ord('l'))  # 108print(ord('m'))  # 109print(chr(109))  # m
==和is的区别?==判断value是否相等,is比拟的是id是否相等

字符串的切片操作(与列表相似)

# 不可变类型,不反对增删改操作,切片操作将产生新的对象# 语法:[start:end:step]s = 'hello,Python's11 = s[:5]s22 = s[6:]s33 = '!'ns = s11 + s33 + s22print(s11)  # helloprint(s22)  # Pythonprint(s33)  # !print(ns)  # hello!Pythonprint(s[-6::])  # Pythonprint(s[6::-1])  # P,olleh

格式化字符串

# 1.应用%作占位符(%s:字符串;%i或%d:整数;%f:浮点型数)name = 'all'age = 22print('我的名字是%s,往年%d岁' % (name, age))  # 我的名字是all,往年22岁# 2.{}作占位符print('我的名字是{0},往年{1}岁'.format(name, age))  # 我的名字是all,往年22岁# 3.f-stringprint(f'我的名字是{name},往年{age}岁')  # 我的名字是all,往年22岁
宽度与精度的设置
print('%10d' % 99)  # 10标识宽度print('%.3f' % 3.1415926)  # .3标识小数点后保留位数,输入3.142print('%10.3f' % 3.1415926)  # 可同时应用,输入     3.142print('{0:.3}'.format(3.1415926))  # 输入3.14,限度总位数print('{0:.3f}'.format(3.1415926))  # 输入3.142,限度小数点后保留位数print('{0:10.3f}'.format(3.1415926))  # 输入     3.142,限度小数点后保留位数

字符串的编码转换

# 编码:将字符串转换为二进制数据(bytes)# 解码:将bytes类型的数据转成字符串类型s = '好天气'print(s.encode(encoding='GBK'))  # b'\xba\xc3\xcc\xec\xc6\xf8'print(s.encode(encoding='UTF-8'))  # b'\xe5\xa5\xbd\xe5\xa4\xa9\xe6\xb0\x94'b = s.encode(encoding='GBK')print(b.decode(encoding='GBK'))  # 好天气# print(b.decode(encoding='UTF-8'))# 编码格局不同,报错UnicodeDecodeError: 'utf-8' codec can't decode byte 0xba in position 0: invalid start byte