Python 语言-第三章字符串类型
第三章字符串类型
3.1 字符串的驻留机制
-
字符串是 python 基本数据类型之一,是一个不可变字符序列
- 所以对字符串元素不可切片赋值
-
驻留机制:仅保留一份相同且不可变字符串的方法,不同的值被存放在字符串的驻留池中
- 在 python 中,会对相同的字符串只保留一份拷贝,后续创建相同字符串时,不会开辟新空间,而是把该字符的地址赋予新创建的变量,如:

- 在 python 中,会对相同的字符串只保留一份拷贝,后续创建相同字符串时,不会开辟新空间,而是把该字符的地址赋予新创建的变量,如:
-
符合驻留机制(在交互模式下)的几种情况:
- 字符串的长度为 0 或者 1 时
- 符合标识符的字符串
- 符合的标识符包括:字母、数字、下划线
- 字符串只在编译时驻留,而非运行时
- [-5,256]之间的整数数字
-
在交互模式下 sys 模块中的 intern 方法可以强制 2 个字符指向同一个对象
- 例如:

- 例如:
-
PyCham 对字符串的驻留进行了优化处理,即使在 python 中不满足驻留机制,但是使用 PyCharm 时的内存地址是一致的
-
例如:
a = '123$' b = '123$' print(a is b)True
-
-
驻留机制的优缺点
- 优点:当需要值相同的字符串时,可以直接从字符串池中拿来使用,避免频繁的创建和销毁,提升效率和节约内存
- 缺点:基于优点,所以当拼接字符串和修改字符串是会比较影响性能的
- 在需要进行字符串拼接时建议使用 str 类型的 join 方法,而并非 +
- 因为 join() 方法是先计算出所有字符串的长度,然后进行拷贝。只需要 new 一次对象,效率比使用 + 高
- 在需要进行字符串拼接时建议使用 str 类型的 join 方法,而并非 +
3.2 基本操作
-
字符串可以视为名称为字符的列表,与列表操作类似
- 所以也具有索引、切片等操作(这里不详细介绍,在列表可能会详细说切片和索引)
-
同时字符串也支持很多方法,可以用来对字符串进行处理。
-
方法需要通过对象名和方法名来调用,
-
语法格式为:
对象名.方法名(参数)
-
-
3.2.1 查询操作
-
方法 描述 s.find(suber[,start[,end]]) 查找 suber 第一次出现的位置,如果 suber 不存在时,返回 -1
若用 start 和 end 指定范围,则在 s[start,end] 范围进行搜索s.index(suber[,start[,end]]) 用法与 find 相同,只不过当 suber 不在 s 中时,抛出 ValueError 异常 s.rfind(suber[,start[,end]]) 用法与 find 相同,只是从右边找 s.rindex(suber[,start[,end]]) 用法与 index 相同,只是从右边找 s.count(suber[,start[,end]]) 返回 suber 在 s 中出现的次数
若用start和end指定范围,则返回在 s[start,end] 的次数 -
例如:
s = 'Hello,llo' print(s.index('lo'))3-
返回结果为 3,理解为索引为 3 即可
-
字符串的索引
- 正向索引:从左向右的顺序,左边第一字符的索引为 0,第二个字符索引为 1o
- 逆向索引:从右向左的顺序,-1 表示最右的字符的索引,-2 表示倒数第二个字符的索引,依此类推。
-
s[0] s[1] s[2] s[3] s[4] s[5] s[6] s[7] s[8] H e l l o , l l o s[-9] s[-8] s[-7] s[-6] s[-5] s[-4] s[-3] s[-2] s[-1]
-
3.2.2 大小写转换操作
-
方法 描述 s.upper( ) 将字符串所有字母全部转换为大写字母(upper:上面的) s.lower( ) 将字符串全部转换为小写字母(lower:低的) s.swapcase( ) 大小写相互转换(swap:交换,case:情形) s.capitalize( ) 字符串第一个字符大写,将其余字符转为其他小写字母(capital:大写) s.title( ) 每个单词的第一个字符大写,将其余字符转为其他小写字母(title:标题)
3.2.3 字符串对齐操作
-
方法 描述 s.just(width[,fillchar]) 左对齐,输出 width 个字符,右边不足部分使用 fillchar(默认为空格)填充 s.rjust(width[,fillchar]) 右对齐,输出 width 个字符,,左边不足部分使用 fillchar(默认为空格)填充 s.center(width[,fillchar]) 居中对齐,输出 width 个字符,两边不足部分使用 fillchar(默认为空格)填充 s.zfill(width) 用于将字符串长度变为width,字符串右对齐,左边不足部分用 0 填充
3.2.4 字符串劈分操作
-
方法 描述 split([sep] [,maxsplit]) 从字符串左边开始拆分,sep 参数指定分割符(默认为空格),maxspilt 参数指定最大分割次数 rsplit([sep] [,maxsplit]) 用法跟 spilt 一致,只是从右边开始拆分 -
例如:
s = 'Hello World Python' print(s.split()) s1 = 'Hello|World|Python' print(s1.split(sep='|')) print(s1.split(sep='|',maxsplit=1))['Hello', 'World', 'Python'] ['Hello', 'World', 'Python'] ['Hello', 'World|Python']
3.2.5 字符串连接操作
-
使用
+连接:一般连接-
一般语法:
字符串1+字符串2+……+字符串n
-
-
使用
join()连接:一般连接- 在需要进行字符串拼接时建议使用 str 类型的 join 方法,而并非 +
- 因为字符串的驻留机制,和 join() 的使用方法,效率比使用 + 高
- join() 使用方法:先计算出所有字符串的长度,然后进行拷贝。
- 因为字符串的驻留机制,和 join() 的使用方法,效率比使用 + 高
- 在需要进行字符串拼接时建议使用 str 类型的 join 方法,而并非 +
-
使用
*连接:重复连接-
一般语法:
字符串 * 正整数或者
正整数 * 字符串
-
3.2.6 字符串判断操作
-
方法 描述 s.isalnum() 判断 s 是否全是字母或数字组成 s.isalpha() 判断 s 是否全是字母组成 s.islower() 判断 s 是否全是小写字母组成 s.isupper() 判断 s 是否全是大写字母组成 s.istitle() 判断 s 是否是大写首字母开头 s.isdigit() 判断 s 是否全是由数字组成 s.isdecimal() 判断 s 是否只包含十进制数字 s.isnumeric() 判断 s 是否只由数字组成 s.isspace() 判断 s 是否只包含空格 s.startwith(prefix[,start[,end]]) 判断 s 是否以 perfix开头 s.endwith(suffix[,start[,end]]) 判断 s 是否以suffix结尾
3.2.7 字符串替换操作
-
方法 描述 s.replace(s1,s2[,count]) 将 s 中的 s1 替换成为 s2
若指定 count,则指定替换count 次 (replace:取代)s.strip([chars]) 在 s 前后移除由 chars 指定的字符(默认空格) (strip:脱去 chars:字符) s.lstrip([chars]) 与 strip 用于一致,只是只移除 s 前的指定指定字符 s.rstrip([chars]) 与 strip 用于一致,只是只移除 s 后的指定指定字符 s.expandtabs([tabsize]) 将s中的 tab 符号转化为tabsize 个空格(默认8个空格)
3.2.8 字符串比较操作
- 运算符:>、>=、<、<=、==、!=
- == 与 is 的区别
- == 比较的是 value
- is 比较的是 id
- == 与 is 的区别
- 比较规则:
- 从第一个字符开始,相等就继续比较下一个字符,直到两个字符串中的字符不相等时,其比较结果就是字符串的比较结果,后续字符将不再比较
- 比较原理
- 比较的是其 ordinal value (原始值),西文字符通过 ASCll 码进行对比,中文字符通过Unicode码
ord():可以得到字符对应的 ordinal valuechr():可以得到 ordinal value 对应的字符
- 从小到大的顺序为:空字符、数字字符、大写字母、小写字母
- 比较的是其 ordinal value (原始值),西文字符通过 ASCll 码进行对比,中文字符通过Unicode码
3.2.9 字符串切片操作
- 因为字符串是不可变类型,所以不具备增、删、改等对元素的操作
- 进行切片操作产生的是一个对象
3.3 格式化字符串
3.3.1 % 作为占位符
-
例如:
"姓名:%s;年龄:%d" % ("李华",19)- 构成:
定义的格式化字符串 + % + 实际值- 其中自定义的字符串中包含需要的格式化说明符
- 格式化说明符格式:
{格式说明符:格式控制符}
- 格式化说明符格式:
- 其中自定义的字符串中包含需要的格式化说明符
- 构成:
-
常见格式化说明符:
格式说明符 含义 %% 输出百分号 %d 输出十进制数字 %c 输出chr(num) %s 输出字符串 %o/O 输出8进制 %x/%X 输出16进制 %e/%E 以科学计数法输出浮点数 %[w] [.p]f 以小数输出浮点数
长度为 w(默认为0)
小数部分有 p 位(默认为 6 位)- 其中
%[w] [.p]f中的 w 的意思是宽度,p 的意思是精度- 宽度:输出小数点前多少位
- 精度:输出小数点后多少位
- 其中
-
常见格式化辅助指令:
符号 功能 m 定义输出的宽度。若变量值的输出宽度超过m,则按实际宽度输出 - 在指定宽度内输出值左对齐 + 在输出的正整数前面显示正好(默认不显示) # 在输出的八进制数前面添加“0o”,十六进制前面添加“0X”或者“0x” 0 在指定宽度内输出值时左边的空格用0填充 -n 对于浮点数指定输出时小数点后保留的位数(四舍五入),对于字符串指定输出前n个字符 -
示例:
x=123.456789 print("%f;%12.3f;%-12.3f;%012.3f"%(f,f,f,f)) #输出小数点形式表示的浮点数 print("%e;%12.3e;%-12.3e;%012.3e"%(f,f,f,f))123.45678; 123.457;123.457;00000123.457 1.234568e+02 1.235e+02;1.235e+02; 0001.235e+02-
%f :输出浮点数
%12.3f:输出小数点前 12 位,小数点后 3 位的浮点数
-
3.3.2 {} 作为占位符
-
实现字符串格式化的首选方案
-
例如:
"{0}{1}".format(a,b)- 构成:
定义的格式化字符串 + .format + 实际值- 自定义格式化字符串由普通字符和格式说明符组成。
- 格式化说明符格式:
{[序号或键名]:格式控制符}
- 格式化说明符格式:
- 自定义格式化字符串由普通字符和格式说明符组成。
- 构成:
-
常用格式控制符:
符号 功能 d 输出十进制数 b 输出二进制数 o 输出八进制数 x或X 输出十六进制数 c 输出以整数为编码的字符 f或F 以小数形式的浮点数 e或E 以科学计数法的浮点数 % 输出百分号 -
例如:
x=123.456789 print("{0:f};{1:<12.3f}".format(f,f))123.456789;123.457
3.3.3 f-string 形式
-
例如:
name = '张三' age = '38' print(f'我叫{name},今年{age}岁')我叫张三,今年38岁
3.4 字符串编码转换
-
为什么需要字符串的编码转换:便于其他计算机显示
-
-
编码与解码的方式
-
编码:将字符串转换为二进制数据(bytes)
- 使用
encode()方法进行编码
- 使用
-
解码:将二进制数据转换为字符串类型
- 使用
decode()进行解码
- 使用
-
例如:
s = 'Hello,World' byte = s.encode(encoding='UTF-8') print(byte) str = byte.decode(encoding='UTF-8') print(str)b'Hello,World' Hello,World
-
-
常见编码解码格式
- UTF-8:使用这种格式一个中文占 3 个字节
- GBK:使用这个格式一个中文占 2 个字节
-
编码和解码的类型必须一致

浙公网安备 33010602011771号