目录
- 前言
- 一、字符串的编码、检测和比较
- 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"
:用特定字符替代非法字符
python">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)
python">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
之间的转换。
python">print(ord(' '.encode()), ord('a'), ord('A'), ord('缪'), ord('0'))
print(chr(255), chr(95))
python">32 97 65 32554 48
ÿ _
2. 字符检测与判断
isidentifier()
:若字符串中的字符全部为合法标识符,返回True
;否则返回False
isspace()
:若字符串中的字符全部为空白符(空格、换行、水平制表符),返回True
;否则返回False
isalpha()
:若字符串中的字符全部为letter
类型(英文字母、汉字等),返回True
;否则返回False
isdecimal()
:若字符串中的字符全部为十进制数字字符(0~9
),返回True
;否则返回False
isnumeric()
:若字符串中的字符全部为数字(阿拉伯、中文、罗马等),返回True
;否则返回False
isalnum()
:若字符串中的字符全部为数字或letter
,返回True
;否则返回False
python">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())
python">True True True True True True
True False
3. 字符串的比较
从字符串左端开始,逐个字符进行比较,若两个字符的Unicode
码值(原始值)相等,就比较下一个字符,若不相等则确定两串大小关系。当且仅当每个字符都相等时,两串相等。
python">print(ord('1'), ord('2'), ord('3'))
print('112' > '113')
print('212' > '113')
python">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
:将字符串型变量的值插入到字符串中
特定类型的占位符只能传递特定类型的值。
python">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)
.
python">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
位小数(四舍五入)的浮点数。
python"># 最大精度:保留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)
python">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
位小数。
python"># 最大精度:保留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))
python">3.141593
3.141592653589793
000000003.1415926535897933.143.14
4. f-string 格式化
4.1 对象调用
可直接将变量写入字符串的格式化方法,使用{variable}
型占位符将变量的值插入到字符串中,需要前缀f
或F
对字符串进行标识。
python"># 直接输入
print(f'我考了{100}分')# 变量传递
score = 100
print(f'我考了{score}分')
python">我考了100分
f-string
格式化也支持表达式和函数调用。
python"># 平方运算
x = int(input())
print(f"{(lambda x: x**2)(x)}")
4.2 数字格式
f-string
格式化仍遵循上述的浮点格式化机制,并新增了分隔描述符,占位符格式为{decimal:,d}
和{decimal:_d}
.
其中,decimal
是十进制整数,,
和_
是分隔符,表示每三位分隔一次。
python"># 不对齐,保留2位小数
print(f"{3.1415926:.2f}")# 对多位整数按位划分
print(f"{2024114514:,d}")
python">3.14
2,024,114,514
4.3 字符串格式
f-string
格式化可以规定字符串的对齐格式,占位符格式为{str:fillchar/how/width.len}
,可以实现:先截断字符串保留指定长度(从左到右),再对齐填充。
其中,fillchar
是填充符,how
是对齐方式(居中^
、左对齐<
、右对齐>
),width
是对齐宽度,len
是保留长度。
python">s = "dandelion"# 左对齐:保留长度超过字符串长,不发生截断
print(f"{s:*<20.10}")
# 右对齐:截断后保留5个字符
print(f"{s:*>20.5}")
# 居中:不截断截断
print(f"{s:*^20}")
python">dandelion***********
***************dande
*****dandelion******
4.4 功能增强
在Python 3.12
版本后,f-string
格式化支持引号重用、多行表达式和注释、转义字符。
python"># 引号重用:允许嵌套定义
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
均相同。