#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、格式字符串和原始字符串。