Python数据类型之字符串和字节
4.1 字符串
4.1.1 字符串定义与基本操作
字符串是一种不可变的序列。顾名思义,字符串就是一组字符组成的序列,每个字符就是序列中的一个元素。
字符串可以包含零个或多个字符,字符需要使用引号界定。引号可以是:
- 单引号
- 双引号
- 三引号
创建字符串:
str = "Hello World"
其中,单引号与双引号是完全等价的,而三引号可以在字符串内部换行。如果单(双)引号也需要换行,可以使用续行符“\”,三引号中使用续行符,则不会产生换行。
多个字符串常量也可以“无缝”的组合在一起。例如:
str = “Hello”“World”
字符串的操作:
- 索引
- 切片
- 运算
- 遍历每个字符
4.1.2 转义序列
转义是当由于技术等原因、无法直接在代码中写出所要的字符时采用的,以多个字符的有序组合来表示原本需要的字符的手段,而转义序列(escape sequence)指在转义时使用的有序字符组合。
Python转义序列表:
4.1.3 字符串相关方法
count(sub[, start[, end]])
find / index(sub[, start[, end]])
rfind/ rindex(sub[, start[, end]])
format(*args, **kwargs)
join(iterable)
replace(old, new[, count])
lstrip / rstrip / strip([chars])
split / rsplit(sep=None, maxsplit=-1)
splitlines([keepends])
startswith (prefix[, start[, end]])
endswith (suffix[, start[, end]])
upper / lower()
capitalize()
partition / rpartition(sep)
isalpha()
isnumeric()
isdigit()
isdecimal()
isidentifier()
islower / isupper()
isspace()
其中isnumeric
,isdigit
与isdecimal
三者之间的区别如下:
- 三者之间是包含关系,
isnumeric
范围最大,isdigit
其次,isdecimal
最小。
4.2 字节
4.2.1 定义与基本操作
bytes
是一系列字节组成的序列,是不可改变的。bytes
每个元素的值在[0, 255]范围内(无符号单字节)。
4.2.2 相关方法
bytes
的方法与str
相似,可参考str
的方法。
4.3. 字符集与编码
字符集,就是一组字符组成的集合。常见的字符集有ASCII
,BIG5
,Unicode
,GBK
等。
不同的字符集,包含的字符个数也可能是不相等的。在存储字符时,我们需要将字符转换成二进制值,称为编码,同样,在读取保存的二进制值时,我们需要将二进制值还原成字符,称为解码。可以说,字符集,就是规定了字符与二进制之间如何进行转换的规则,即编码与解码的规则。
因此,我们如果对某一个文本文件采用了一种编码方式保存,在解析该文件内容时,就需要采用相同的编码方式解码,否则就很可能造成乱码的现象,原因就是编码与解码的方式不统一造成的。
4.3.1 Unicode与UTF-8
在Python
中,字符串str
类型使用的字符集是Unicode
字符集,该字符集是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。例如,ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)
字符集只能支持一些西方字符,不支持汉字,日文等语言字符。 目前Unicode
字符集包含1114112个编码值(0x0 ~ 0x10FFFF)。
然而,由于Unicode
取值范围的广泛性,这可能会对存储带来一些问题。对于码值小的字符,只需要使用1个字节存储就够了,但是,对于码值大的字符,却需要使用更多的字节去存储。如果使用定长的方式存储,这势必会造成存储空间的浪费。因此,后来人们创建了UTF-8
的编码方式。UTF-8(8-bit Unicode Transformation Format)
是针对Unicode
设定的可变长度字符编码,是对Unicode
字符集的一种通用转换格式。UTF-8
编码使用1 ~ 4个字节来表示Unicode(0x000000 ~ 0x10FFFF)
区间的值。
如下表:
取值 | 占用空间(字节) |
---|---|
0x000000 ~ 0x00007F | 1 |
0x000080 ~ 0x0007FF | 2 |
0x000800 ~ 0x00FFFF | 3 |
0x010000 ~ 0x1FFFFF | 4 |
Python3
默认文件的编码方式为UTF-8
编码(Python2
默认为ASCII
)。
4.3.2 str与bytes
我们可以在str
(字符串)与bytes
(字节)之间进行转换。通过调用str
的encode
方法可以返回字符串编码之后的结果(bytes
类型)。同样,通过调用bytes
类型的decode
方法,可以将字节序列解码,转换回编码之前的字符串(str
类型)。
此外也可以通过bytes
与str
函数,来实现编码与解码的操作。
4.4 格式化输出
有时候,多个字符串进行拼接会显得过于繁琐,这在数字与字符串拼接时更加明显,因为我们不得不使用str
进行转换才行。而且,有时候我们可能需要对输出格式进行严格的控制,例如,小数点后保留几位,字符占用的宽度等。此时,我们就可以对字符串进行格式化,以输出我们期望的形式。
在Python
中,我们可以采用两种方式进行字符串的格式化:
- 旧式格式化——使用“%”的形式。
- 新式格式化——使用
str
类的format
方法 - 最新格式化——使用格式化字符串常量
4.4.1 旧式格式化——使用“%”的形式
在字符串对象后,可以使用%来进行格式化,格式如下:
格式化字符串%(值的元组或字典)
格式化字符串中的占位符格式为:
% [(关键字)][转换标记][最小宽度][.精度]转换格式
其中,%与转换类型是必选的,其他是可选的。说明如下:
- %:指出这是占位符的开始。
- 关键字:用于匹配字典中的键,使用键所对应的值替换。
转换格式:
格式 | 说明 |
---|---|
d,i,u | 有符号十进制格式。 |
o | 有符号八进制格式。 |
x | 有符号十六进制格式。 |
X | 有符号十六进制格式。 |
f | 浮点格式,精度默认为6。 |
F | 浮点格式,精度默认为6。 |
e | 科学计数法格式,精度默认为6。 |
E | 科学计数法格式,精度默认为6。 |
g | 假设将数值转换成指数格式。 |
G | 假设将数值转换成指数格式。 |
c | 单字符格式,可以是单个字符或者整数值。 |
a | 将Python对象使用ascii函数转换成字符串格式。 |
s | 将Python对象使用str函数转换成字符串格式。 |
r | 将Python对象使用repr函数转换成字符串格式。 |
% | 转换成普通的%字符。 |
其中:
- 对于
f
和F
,NaN
与无穷大会显示为nan
与inf
. - 对于
g
和G
,如果数值指数值小于-4或者大于等于精度值(默认为6),则使用科学计数法格式,否则使用浮点格式(指数使用e和E)。
4.4.2 新式格式化——使用str类的format方法
从Python2.6(Python2版本)
与Python3.0(Python3版本)
起,str
可以使用format
方法来进行格式化,相比于以前的%形式,这种方式称为新式格式化。
形式为:
格式化字符串.format(替换值)
格式化字符串使用{}
作为占位符,然后使用format
方法的参数进行替换。占位符的格式如下:
{[字段名][:格式说明]}
以上部分都是可选的。
与%格式化相同,format
方法的格式化也提供动态模板的方式,就是使用嵌套的{}来指定动态模板设置即可。动态模板设置建议使用关键字参数的形式,这样有利于程序的可读性。