#Python 的字符串
字符串相当于字符的列表,是一种十分常用且功能复杂的类型。
在 基础语法 - 变量与基本类型 一节中, 我们已经初步接触过字符串了。
#编码与 bytes
计算机通过电子元件进行二进制存储,最小存储单元称为 字节(byte),一个字节拥有 8 个二进制位。
字符文本需要转换为二进制字节才能在计算机中进行存储,这种转换方式称作编码。例如英文字母 A 在 ASCII 编码 中对应的二进制值为 01000001 即十进制的 65。
在 Python 中,存在一种名为 bytes 的类型,用于存储连续的多个字节。bytes 是不可变类型,与之对应的可变类型为 bytearray。
bytes 类型的字面量类似字符串,通过 b'xxxx' 或 b"xxxx" 表示,例如 b'hello world'。
bytearray 类型没有字面量写法,只能通过 bytearray 函数创建。
将字符串转换为 bytes 的操作称为 编码(encode),反之将 bytes 转换为字符串的操作称作 解码(decode)。
示例:
data:bytes = b'hello world'
print(data)
text:str = data.decode() # 解码
print(text)
print(text.encode()) # 编码
从打印的内容上来看,bytes 好像和字符串一样,只是开头多了个 b,实则不然:
bytes的元素是 字节,字符串的元素是 字符(一个字符可能不止一个字节)bytes可以存储非文本的数据,例如图片等
通过下面这是示例可以清晰的观察这一点:
text:str = '你好世界'
print(text)
data:bytes = text.encode() # 编码
print(data)
print('字符串长度为', len(text), '字节长度为', len(data)) # 可以看到长度不通
print(text[1], data[1]) # text[1] 是一个完整的汉字“好”,而 data[1] 是“你”字中的一个字节
'你好世界'作为字符串的长度是 4,因为包含 4 个汉字'你好世界'作为bytes的长度是 12,因为编码这四个汉字使用了 12 个字节'你好世界'作为字符串,索引 1 位置是字符'好''你好世界'作为bytes,索引 1 位置值为 189,是编码中的一个字节
#旧式字符串格式化
在编程开发中常常需要根据一些变量来创建字符串,可以使用 % 运算符进行格式化,语法如下:
"格式化字符串" % (值1, 值2, ...) # (值1, 值2, ...) 是一个元组
只有一个值时也可以写作:
"格式化字符串" % 值 # 一个单独的值
例如:
print("猪肉的价格是 %d 元/斤" % 15)
print("%d 斤猪肉的价格是 %d 元" % (3, 3*15))
这里格式化字符串里的 %d 是 十进制整数 占位符,对应的值会以十进制整数的格式替换到它的位置,其它常见的占位符还有:
%%: 百分号本身%d: 十进制整数%o: 十进制整数%x: 十六进制整数(小写)%X: 十六进制整数(大写)%f: 浮点数%s: 字符串
这种方式已不常用,更多信息请参考:printf 风格的字符串格式化
#format 方法
format 方法比 % 更加灵活,它使用花括号 {} 作为占位符,例如:
print("Name: {}, Age: {}".format("Jerry", 18)) # 按参数顺序替换
print("Name: {1}, Age: {0}".format(19, "Tom", )) # 按指定顺序替换
print("Name: {name}, Age: {age}".format(name="Tuffy", age=8)) # 按名称替换
占位符中可以使用索引:
score_list:dict[str,int] = {
'Tom': 88,
'Jerry': 99,
'Spike': 66
}
print("成绩如下 Tom:{0[Tom]} Jerry:{0[Jerry]} Spike:{0[Spike]}".format(score_list))
format 通过冒以号(:)开始的 格式规格 编辑格式,例如:
# 打印九九乘法表
for x in range(1, 10):
for y in range(1, 10):
print(' {:2} '.format(x * y), end='') # 最小宽度为 2 个字符
print('')
格式规格内可以嵌套变量:
# 宽度可以是变量
print("'{:{width}}'".format('txt', width=7)) # 最小宽度为 width 个字符
其它常用的格式规格:
# 对齐
print("'{:<5}'".format('txt')) # 最小宽度为5,左对齐
print("'{:>5}'".format('txt')) # 最小宽度为5,右对齐
print("'{:^5}'".format('txt')) # 最小宽度为5,居中
# 保留 n 位小数
print("圆周率的近似值是 {:.2f}".format(3.1415926)) # 保留两位小数
更多具体的格式规格请参考 format 函数。
#格式字符串字面量 f-strings
格式字符串的字面量使用 f'xxxx' 或 f"xxxx" 的形式表示,并使花括号({})进行格式化,花括号内可以执行代码,例如:
score_list:dict[str,int] = {
'Tom': 88,
'Jerry': 99,
'Spike': 66
}
print(f"成绩如下 Tom:{score_list['Tom']} Jerry:{score_list['Jerry']} Spike:{score_list['Spike']}")
格式字符串和 format 一样通过冒以号(:)开始的 格式规格 编辑格式,更多具体的格式规格请参考 format 函数。
#原始字符串 raw strings
原始字符串的字面量使用 r'xxxx' 或 r"xxxx" 的形式表示,在原始字符串中没有转义字符,即 \n 表示字符串 \n 本身而非换行。
print(r'hello \n world')
常用于正则表达式等其它具备转义字符的场合,避免需要写多重转义。
正则表达式将在后面进行学习
#多行字符串
多行字符串使用三对引号(' 和 "均可)表示,例如:
print('''
## 多行字符串
多行字符串使用三对引号(`'`和`"`均可)表示,例如:
''')
多行字符串也常被当作多行注释使用,例如:
'''
没有赋值给变量,也不参与运算
因此相当于注释
'''
print("hello world")
多行字符串也可以添加 b、f、r 前缀来表示 bytes、格式字符串和原始字符串。