目录
- 前言
- 一、字符串的编码、检测和比较
- 1. 编码与解码
- 2. 字符检测与判断
- 3. 字符串的比较
- 二、占位符与格式化
- 1. %型格式化
- 2. {}型格式化
- 3. 浮点格式化
- 4. f-string 格式化
- 4.1 对象调用
- 4.2 数字格式
- 4.3 字符串格式
- 4.4 功能增强
- 三、字符驻留机制
前言
本篇将更深入地介绍字符串的使用和机制,有关字符串的基础内容,见Python基础学习笔记(九)——字符串(上)。
一、字符串的编码、检测和比较
1. 编码与解码
字符串是由Unicode字符组成的,字符按一定格式转换为字节的过程,称为编码;编码的逆向操作,称为解码。
encode(encoding, errors):将目标字符串(str)转换为指定编码格式的字节对象(bytes)decode(encoding, errors):将目标字节对象(bytes)转换为指定编码格式的字符串(str)
以上两个函数实现了文本与二进制数据之间的转换。其中,encoding默认值为"utf-8",errors默认值为"strict"。
encoding的可选参数(不论大小写)列表详见Python基础学习笔记(二)——编码_命名,errors的部分可选参数如下:
"strict":检测到非法字符,抛出UnicodeError异常"ignore":忽略非法字符"replace":用特定字符替代非法字符
str_ = 'dandelion的博客'
# GBK编码格式下,1汉字占2字节
en = str_.encode('GBK')
print(en)
de = en.decode('GBK')
print(de)# utf-8编码格式下,1汉字占3字节
en = str_.encode()
print(en)
de = en.decode()
print(de)
b'dandelion\xb5\xc4\xb2\xa9\xbf\xcd'
dandelion的博客b'dandelion\xe7\x9a\x84\xe5\x8d\x9a\xe5\xae\xa2'
dandelion的博客
chr(int):将任意进制的Unicode码值转换为字符ord(str|bytes):将一个字节对象或字符转换为十进制的Unicode码值(不能输入空字符)
charcode和order函数实现了str与int之间的转换。
print(ord(' '.encode()), ord('a'), ord('A'), ord('缪'), ord('0'))
print(chr(255), chr(95))
32 97 65 32554 48
ÿ _
2. 字符检测与判断
isidentifier():若字符串中的字符全部为合法标识符,返回True;否则返回Falseisspace():若字符串中的字符全部为空白符(空格、换行、水平制表符),返回True;否则返回Falseisalpha():若字符串中的字符全部为letter类型(英文字母、汉字等),返回True;否则返回Falseisdecimal():若字符串中的字符全部为十进制数字字符(0~9),返回True;否则返回Falseisnumeric():若字符串中的字符全部为数字(阿拉伯、中文、罗马等),返回True;否则返回Falseisalnum():若字符串中的字符全部为数字或letter,返回True;否则返回False
print('_dandelion_'.isidentifier())
print(' \t\n'.isspace())
print('dandelion的博客'.isalpha())
print('02'.isdecimal())
print('Ⅱ0二十四'.isnumeric())
print('Muelsyse1103'.isalnum())# 在utf-8编码下,汉字不被视为字母
print('sleep'.encode().isalpha())
print('好困'.encode().isalpha())
True True True True True True
True False
3. 字符串的比较
从字符串左端开始,逐个字符进行比较,若两个字符的Unicode码值(原始值)相等,就比较下一个字符,若不相等则确定两串大小关系。当且仅当每个字符都相等时,两串相等。
print(ord('1'), ord('2'), ord('3'))
print('112' > '113')
print('212' > '113')
49 50 51
False
True
常见的Unicode码值有:0-9 -> 48~57,A-Z -> 65~90,a-z -> 97~122
二、占位符与格式化
占位符是一种特殊字符,用于表示字符串中将来要填充的值的位置,通常用于字符串格式化。它们是在程序运行时动态生成的,以便将实际值插入到占位符的位置。
1. %型格式化
最传统的格式化方法,使用%型占位符将变量的值插入到字符串中,格式为:str % {variables}.
%d | %i:将整型变量的值插入到字符串中%f:将浮点型变量的值插入到字符串中%s:将字符串型变量的值插入到字符串中
特定类型的占位符只能传递特定类型的值。
name = input('名字:')
age = int(input('年龄:'))
order = int(input('等阶:'))
coefficient = float(input('强度系数:'))print('我叫%s,一名%d岁的%i阶魔法使,魔力强度系数%f' % (name, age, order, coefficient))
在上述示例中,用户可以根据实际情况给变量赋值,变量的值根据{variables}中的变量与str中的占位符的位置一一对应插入到str中,并得到一个特定格式的字符串。
2. {}型格式化
不限制变量类型的格式化方法,使用{index}型占位符将变量的值插入到字符串中,格式为: str.format(variables).
name = input('名字:')
age = int(input('年龄:'))
order = int(input('等阶:'))
coefficient = float(input('强度系数:'))print('我叫{0},一名{1}岁的{2}阶魔法使,魔力强度系数{3}'.format(name, age, order, coefficient))
在上述示例中,用户可以根据实际情况给变量赋值,变量的值根据{variables}中的变量与str中的占位符的索引对应插入到str中,并得到一个特定格式的字符串。
特别的,若全为占位符为{},插入方式仍为 “位置一一对应”。
3. 浮点格式化
对于%型格式化,浮点型的占位符为%ca.bf.
其中,c, a, b都是整型,c是填充符,默认值为空格;整数部分a为右对齐参数,作用相当于rjust(a, 'c')函数;小数部分b为精度参数,返回保留b位小数(四舍五入)的浮点数。
# 最大精度:保留6位小数
print('%f' % 3.1415926)
# 只对齐,使用最大精度,填充符为0
print('%010f' % 3.1415926)
# 右对齐,默认精度为0
print('%10.f' % 3.1415926)
# 不对齐,精度为3
print('%.3f' % 3.1415926)
# 右对齐,精度为3
print('%10.3f' % 3.1415926)
# 不对齐,默认精度为0
print('%.f' % 3.1415926)
3.141593
003.1415933
3.1423.142
3
对于{}型格式化,浮点型的占位符为{index: ca.b}.
其中,c, a, b的含义与前者基本一致,区别在于,有小数点.时:
b不再为可选参数a的值未传递,或小于等于字符串长,默认值为len+1,即至少左空一格
并且有{index: a.b}保留b位有效数字,{index: a.bf}保留b位小数。
# 最大精度:保留6位小数
print('{0:f}'.format(3.1415926535897932))
# 最大精度:保留16位有效数字
print('{0:}'.format(3.1415926535897932))
# 右对齐,使用最大精度,填充符为0
print('{:025}'.format(3.1415926535897932))
# 左空一格,精度为3
print('{:.3}'.format(3.1415926535897932))
# 右对齐,精度为3
print('{:10.3}'.format(3.1415926535897932))
3.141593
3.141592653589793
000000003.1415926535897933.143.14
4. f-string 格式化
4.1 对象调用
可直接将变量写入字符串的格式化方法,使用{variable}型占位符将变量的值插入到字符串中,需要前缀f或F对字符串进行标识。
# 直接输入
print(f'我考了{100}分')# 变量传递
score = 100
print(f'我考了{score}分')
我考了100分
f-string格式化也支持表达式和函数调用。
# 平方运算
x = int(input())
print(f"{(lambda x: x**2)(x)}")
4.2 数字格式
f-string格式化仍遵循上述的浮点格式化机制,并新增了分隔描述符,占位符格式为{decimal:,d}和{decimal:_d}.
其中,decimal是十进制整数,,和_是分隔符,表示每三位分隔一次。
# 不对齐,保留2位小数
print(f"{3.1415926:.2f}")# 对多位整数按位划分
print(f"{2024114514:,d}")
3.14
2,024,114,514
4.3 字符串格式
f-string格式化可以规定字符串的对齐格式,占位符格式为{str:fillchar/how/width.len},可以实现:先截断字符串保留指定长度(从左到右),再对齐填充。
其中,fillchar是填充符,how是对齐方式(居中^、左对齐<、右对齐>),width是对齐宽度,len是保留长度。
s = "dandelion"# 左对齐:保留长度超过字符串长,不发生截断
print(f"{s:*<20.10}")
# 右对齐:截断后保留5个字符
print(f"{s:*>20.5}")
# 居中:不截断截断
print(f"{s:*^20}")
dandelion***********
***************dande
*****dandelion******
4.4 功能增强
在Python 3.12版本后,f-string格式化支持引号重用、多行表达式和注释、转义字符。
# 引号重用:允许嵌套定义
print(f"{f"{f"{f"{f"{f"{1+1}"}"}"}"}"}") # 2# 多行表达式和注释:允许跨行,并在行尾添加注释
lst = f"列表:{"; ".join(["1", # 第1项"2", # 第2项"3" # 第3项
])}"# 转义字符:允许在语句内使用反斜杠
print(f"{'\n'}")
三、字符驻留机制
字符驻留机制是一种优化技术,用于节约内存和提高性能,指的是:
编译过程中,解释器会将较短的不可变字符串对象保存在内存池中,当创建新的字符串时,首先检查该字符串是否已经存在于内存池中,如果是,则返回已存在的对象的引用,也就是把内存地址赋给新变量,而不是开辟一个新空间。
其中,较短的字符串一般指符合标识符或长度不超过1的字符串。 intern()函数还可以显式地将一个字符串对象添加到内存池中,以便进行字符驻留。
特别的,Pycharm对该编译机制进一步优化后,所有相同的字符串id均相同。