通用序列操作

大多数序列类型,包括可变类型和不可变类型都支持下表中的操作。 collections.abc.Sequence ABC 被提供用来更容易地在自定义序列类型上正确地实现这些操作。

此表按优先级升序列出了序列操作。 在表格中,st 是具有相同类型的序列,n, i, jk 是整数而 x 是任何满足 s 所规定的类型和值限制的任意对象。

innot in 操作具有与比较操作相同的优先级。 + (拼接) 和 * (重复) 操作具有与对应数值运算相同的优先级。 [3]

运算 结果: 备注
x in s 如果 s 中的某项等于 x 则结果为 True,否则为 False (1)
x not in s 如果 s 中的某项等于 x 则结果为 False,否则为 True (1)
s + t st 相拼接 (6)(7)
s * nn * s 相当于 s 与自身进行 n 次拼接 (2)(7)
s[i] s 的第 i 项,起始为 0 (3)
s[i:j] sij 的切片 (3)(4)
s[i:j:k] sij 步长为 k 的切片 (3)(5)
len(s) s 的长度
min(s) s 的最小项
max(s) s 的最大项
s.index(x[, i[, j]]) xs 中首次出现项的索引号(索引号在 i 或其后且在 j 之前) (8)
s.count(x) xs 中出现的总次数

相同类型的序列也支持比较。 特别地,tuple 和 list 的比较是通过比较对应元素的字典顺序。 这意味着想要比较结果相等,则每个元素比较结果都必须相等,并且两个序列长度必须相同。 (完整细节请参阅语言参考的 比较运算 部分。)

可变序列的正向和逆向迭代器使用一个索引来访问值。 即使底层序列被改变该索引也将持续向前(或向后)步进。 迭代器只有在遇到 IndexError 或 a StopIteration 时才会终结(或是当索引降至零以下)。

注释:

  • 虽然 innot in 操作在通常情况下仅被用于简单的成员检测,某些专门化序列 (例如 str, bytesbytearray) 也使用它们进行子序列检测:
  1. >>> "gg" in "eggs"
  2. True
  • 小于 0 的 n 值会被当作 0 来处理 (生成一个与 s 同类型的空序列)。 请注意序列 s 中的项并不会被拷贝;它们会被多次引用。 这一点经常会令 Python 编程新手感到困扰;例如:
  1. >>> lists = [[]] * 3
  2. >>> lists
  3. [[], [], []]
  4. >>> lists[0].append(3)
  5. >>> lists
  6. [[3], [3], [3]]

具体的原因在于 [[]] 是一个包含了一个空列表的单元素列表,所以 [[]] * 3 结果中的三个元素都是对这一个空列表的引用。 修改 lists 中的任何一个元素实际上都是对这一个空列表的修改。 你可以用以下方式创建以不同列表为元素的列表:

  1. >>> lists = [[] for i in range(3)]
  2. >>> lists[0].append(3)
  3. >>> lists[1].append(5)
  4. >>> lists[2].append(7)
  5. >>> lists
  6. [[3], [5], [7]]

进一步的解释可以在 FAQ 条目 如何创建多维列表? 中查看。

  • 如果 i 或 j 为负值,则索引顺序是相对于序列 s 的末尾: 索引号会被替换为 len(s) + ilen(s) + j。 但要注意 -0 仍然为 0

  • s 从 i 到 j 的切片被定义为所有满足 i <= k < j 的索引号 k 的项组成的序列。 如果 i 或 j 大于 len(s),则使用 len(s)。 如果 i 被省略或为 None,则使用 0。 如果 j 被省略或为 None,则使用 len(s)。 如果 i 大于等于 j,则切片为空。

  • s 从 i 到 j 步长为 k 的切片被定义为所有满足 0 <= n < (j-i)/k 的索引号 x = i + n*k 的项组成的序列。 换句话说,索引号为 i, i+k, i+2*k, i+3*k,以此类推,当达到 j 时停止 (但一定不包括 j)。 当 k 为正值时,i 和 j 会被减至不大于 len(s)。 当 k 为负值时,i 和 j 会被减至不大于 len(s) - 1。 如果 i 或 j 被省略或为 None,它们会成为“终止”值 (是哪一端的终止值则取决于 k 的符号)。 请注意,k 不可为零。 如果 k 为 None,则当作 1 处理。

  • 拼接不可变序列总是会生成新的对象。 这意味着通过重复拼接来构建序列的运行时开销将会基于序列总长度的乘方。 想要获得线性的运行时开销,你必须改用下列替代方案之一:

    • 如果拼接 str 对象,你可以构建一个列表并在最后使用 str.join() 或是写入一个 io.StringIO 实例并在结束时获取它的值

    • 如果拼接 bytes 对象,你可以类似地使用 bytes.join()io.BytesIO,或者你也可以使用 bytearray 对象进行原地拼接。 bytearray 对象是可变的,并且具有高效的重分配机制

    • 如果拼接 tuple 对象,请改为扩展 list

    • 对于其它类型,请查看相应的文档

  • 某些序列类型 (例如 range) 仅支持遵循特定模式的项序列,因此并不支持序列拼接或重复。

  • 当 x 在 s 中找不到时 index 会引发 ValueError。 不是所有实现都支持传入额外参数 i 和 j。 这两个参数允许高效地搜索序列的子序列。 传入这两个额外参数大致相当于使用 s[i:j].index(x),但是不会复制任何数据,并且返回的索引是相对于序列的开头而非切片的开头。

不可变序列类型

不可变序列类型普遍实现而可变序列类型未实现的唯一操作就是对 hash() 内置函数的支持。

这种支持允许不可变类型,例如 tuple 实例被用作 dict 键,以及存储在 setfrozenset 实例中。

尝试对包含有不可哈希值的不可变序列进行哈希运算将会导致 TypeError

可变序列类型

以下表格中的操作是在可变序列类型上定义的。 collections.abc.MutableSequence ABC 被提供用来更容易地在自定义序列类型上正确实现这些操作。

表格中的 s 是可变序列类型的实例,t 是任意可迭代对象,而 x 是符合对 s 所规定类型与值限制的任何对象 (例如,bytearray 仅接受满足 0 <= x <= 255 值限制的整数)。

运算 结果: 备注
s[i] = x s 的第 i 项替换为 x
s[i:j] = t sij 的切片替换为可迭代对象 t 的内容
del s[i:j] 等同于 s[i:j] = []
s[i:j:k] = t s[i:j:k] 的元素替换为 t 的元素 (1)
del s[i:j:k] 从列表中移除 s[i:j:k] 的元素
s.append(x) x 添加到序列的末尾 (等同于 s[len(s):len(s)] = [x])
s.clear() s 中移除所有项 (等同于 del s[:]) (5)
s.copy() 创建 s 的浅拷贝 (等同于 s[:]) (5)
s.extend(t)s += t t 的内容扩展 s (基本上等同于 s[len(s):len(s)] = t)
s *= n 使用 s 的内容重复 n 次来对其进行更新 (6)
s.insert(i, x) 在由 i 给出的索引位置将 x 插入 s (等同于 s[i:i] = [x])
s.pop()s.pop(i) 提取在 i 位置上的项,并将其从 s 中移除 (2)
s.remove(x) s 中移除第一个 s[i] 等于 x 的条目 (3)
s.reverse() 就地将列表中的元素逆序。 (4)

注释:

  • 如果 k 不等于 1,则 t 必须与它所替换的切片具有相同的长度。

  • 可选参数 i 默认为 -1,因此在默认情况下会移除并返回最后一项。

  • 当在 s 中找不到 x 时 remove() 操作会引发 ValueError

  • 当反转大尺寸序列时 reverse() 方法会原地修改该序列以保证空间经济性。 为提醒用户此操作是通过间接影响进行的,它并不会返回反转后的序列。

  • 包括 clear()copy() 是为了与不支持切片操作的可变容器 (例如 dictset) 的接口保持一致。 copy() 不是 collections.abc.MutableSequence ABC 的一部分,但大多数具体的可变序列类都提供了它。

Added in version 3.3: clear()copy() 方法。

  • n 值为一个整数,或是一个实现了 __index__() 的对象。 n 值为零或负数将清空序列。 序列中的项不会被拷贝;它们会被多次引用,正如 通用序列操作 中有关 s * n 的说明。

列表

列表是可变序列,通常用于存放同类项目的集合(其中精确的相似程度将根据应用而变化)。

  • class list([iterable])
  • 可以用多种方式构建列表:

    • 使用一对方括号来表示空列表: []

    • 使用方括号,其中的项以逗号分隔: [a], [a, b, c]

    • 使用列表推导式: [x for x in iterable]

    • 使用类型的构造器: list()list(iterable)

构造器将构造一个列表,其中的项与 iterable 中的项具有相同的的值与顺序。 iterable 可以是序列、支持迭代的容器或其它可迭代对象。 如果 iterable 已经是一个列表,将创建并返回其副本,类似于 iterable[:]。 例如,list('abc') 返回 ['a', 'b', 'c']list( (1, 2, 3) ) 返回 [1, 2, 3]。 如果没有给出参数,构造器将创建一个空列表 []

其它许多操作也会产生列表,包括 sorted() 内置函数。

列表实现了所有 一般可变 序列的操作。 列表还额外提供了以下方法:

  • sort(*, key=None, reverse=False)
  • 此方法会对列表进行原地排序,只使用 < 来进行各项间比较。 异常不会被屏蔽 —— 如果有任何比较操作失败,整个排序操作将失败(而列表可能会处于被部分修改的状态)。

sort() 接受两个仅限以关键字形式传入的参数 (仅限关键字参数):

key 指定带有一个参数的函数,用于从每个列表元素中提取比较键 (例如 key=str.lower)。 对应于列表中每一项的键会被计算一次,然后在整个排序过程中使用。 默认值 None 表示直接对列表项排序而不计算一个单独的键值。

可以使用 functools.cmp_to_key() 将 2.x 风格的 cmp 函数转换为 key 函数。

reverse 为一个布尔值。 如果设为 True,则每个列表元素将按反向顺序比较进行排序。

当顺序大尺寸序列时此方法会原地修改该序列以保证空间经济性。 为提醒用户此操作是通过间接影响进行的,它并不会返回排序后的序列(请使用 sorted() 显示地请求一个新的已排序列表实例)。

sort() 方法确保是稳定的。 如果一个排序确保不会改变比较结果相等的元素的相对顺序就称其为稳定的 —- 这有利于进行多重排序(例如先按部门、再接薪级排序)。

有关排序示例和简要排序教程,请参阅 排序的技术

在一个列表被排序期间,尝试改变甚至进行检测也会造成未定义的影响。 Python 的 C 实现会在排序期间将列表显示为空,如果发现列表在排序期间被改变将会引发 ValueError

元组

元组是不可变序列,通常用于储存异构数据的多项集(例如由 enumerate() 内置函数所产生的二元组)。 元组也被用于需要同构数据的不可变序列的情况(例如允许存储到 setdict 的实例)。

  • class tuple([iterable])
  • 可以用多种方式构建元组:

    • 使用一对圆括号来表示空元组: ()

    • 使用一个后缀的逗号来表示单元组: a,(a,)

    • 使用以逗号分隔的多个项: a, b, c or (a, b, c)

    • 使用内置的 tuple(): tuple()tuple(iterable)

构造器将构造一个元组,其中的项与 iterable 中的项具有相同的值与顺序。 iterable 可以是序列、支持迭代的容器或其他可迭代对象。 如果 iterable 已经是一个元组,会不加改变地将其返回。 例如,tuple('abc') 返回 ('a', 'b', 'c')tuple( [1, 2, 3] ) 返回 (1, 2, 3)。 如果没有给出参数,构造器将创建一个空元组 ()

请注意决定生成元组的其实是逗号而不是圆括号。 圆括号只是可选的,生成空元组或需要避免语法歧义的情况除外。 例如,f(a, b, c) 是在调用函数时附带三个参数,而 f((a, b, c)) 则是在调用函数时附带一个三元组。

元组实现了所有 一般 序列的操作。

对于通过名称访问相比通过索引访问更清晰的异构数据多项集,collections.namedtuple() 可能是比简单元组对象更为合适的选择。

range 对象

range 类型表示不可变的数字序列,通常用于在 for 循环中循环指定的次数。

  • class range(stop)
  • class range(start, stop[, step])
  • range 构造器的参数必须为整数(可以是内置的 int 或任何实现了 __index__() 特殊方法的对象)。 如果省略 step 参数,则默认为 1。 如果省略 start 参数,则默认为 0。 如果 step 为零,则会引发 ValueError

如果 step 为正值,确定 range r 内容的公式为 r[i] = start + step*i 其中 i >= 0r[i] < stop

如果 step 为负值,确定 range 内容的公式仍然为 r[i] = start + step*i,但限制条件改为 i >= 0r[i] > stop.

如果 r[0] 不符合值的限制条件,则该 range 对象为空。 range 对象确实支持负索引,但是会将其解读为从正索引所确定的序列的末尾开始索引。

元素绝对值大于 sys.maxsize 的 range 对象是被允许的,但某些特性 (例如 len()) 可能引发 OverflowError

一些 range 对象的例子:

  1. >>> list(range(10))
  2. [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  3. >>> list(range(1, 11))
  4. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  5. >>> list(range(0, 30, 5))
  6. [0, 5, 10, 15, 20, 25]
  7. >>> list(range(0, 10, 3))
  8. [0, 3, 6, 9]
  9. >>> list(range(0, -10, -1))
  10. [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
  11. >>> list(range(0))
  12. []
  13. >>> list(range(1, 0))
  14. []

range 对象实现了 一般 序列的所有操作,但拼接和重复除外(这是由于 range 对象只能表示符合严格模式的序列,而重复和拼接通常都会违反这样的模式)。

  • start
  • start 形参的值 (如果该形参未提供则为 0)

  • stop

  • stop 形参的值

  • step

  • step 形参的值 (如果该形参未提供则为 1)

range 类型相比常规 listtuple 的优势在于一个 range 对象总是占用固定数量的(较小)内存,不论其所表示的范围有多大(因为它只保存了 start, stopstep 值,并会根据需要计算具体单项或子范围的值)。

range 对象实现了 collections.abc.Sequence ABC,提供如包含检测、元素索引查找、切片等特性,并支持负索引 (参见 序列类型 —- list, tuple, range):

  1. >>> r = range(0, 20, 2)
  2. >>> r
  3. range(0, 20, 2)
  4. >>> 11 in r
  5. False
  6. >>> 10 in r
  7. True
  8. >>> r.index(10)
  9. 5
  10. >>> r[5]
  11. 10
  12. >>> r[:5]
  13. range(0, 10, 2)
  14. >>> r[-1]
  15. 18

使用 ==!= 检测 range 对象是否相等是将其作为序列来比较。 也就是说,如果两个 range 对象表示相同的值序列就认为它们是相等的。 (请注意比较结果相等的两个 range 对象可能会具有不同的 start, stopstep 属性,例如 range(0) == range(2, 1, 3)range(0, 3, 2) == range(0, 4, 2)。)

在 3.2 版本发生变更: 实现 Sequence ABC。 支持切片和负数索引。 使用 int 对象在固定时间内进行成员检测,而不是逐一迭代所有项。

在 3.3 版本发生变更: 定义 '==' 和 '!=' 以根据 range 对象所定义的值序列来进行比较(而不是根据对象的标识)。

增加了 start, stopstep 属性。

参见

文本序列类型 —- str

在 Python 中处理文本数据是使用 str 对象,也称为 字符串。 字符串是由 Unicode 码位构成的不可变 序列。 字符串字面值有多种不同的写法:

  • 单引号: '允许包含有 "双" 引号'

  • 双引号: "允许嵌入 '单' 引号"

  • 三重引号: '''三重单引号''', """三重双引号"""

使用三重引号的字符串可以跨越多行 —— 其中所有的空白字符都将包含在该字符串字面值中。

作为单一表达式组成部分,之间只由空格分隔的多个字符串字面值会被隐式地转换为单个字符串字面值。 也就是说,("spam " "eggs") == "spam eggs"

请参阅 字符串与字节串字面值 了解有关各种字符串字面值形式的更多信息,包括所支持的 转义序列,以及禁用大多数转义序列处理的 r ("raw") 前缀。

字符串也可以通过使用 str 构造器从其他对象创建。

由于不存在单独的“字符”类型,对字符串做索引操作将产生一个长度为 1 的字符串。 也就是说,对于一个非空字符串 s, s[0] == s[0:1]

不存在可变的字符串类型,但是 str.join()io.StringIO 可以被被用来根据多个片段高效率地构建字符串。

在 3.3 版本发生变更: 为了与 Python 2 系列的向下兼容,再次允许字符串字面值使用 u 前缀。 它对字符串字面值的含义没有影响,并且不能与 r 前缀同时出现。

  • class str(object='')
  • class str(object=b'', encoding='utf-8', errors='strict')
  • 返回 object 的 字符串 版本。 如果未提供 object 则返回空字符串。 在其他情况下 str() 的行为取决于 encoding 或 errors 是否有给出,具体见下。

如果 encoding 或 errors 均未给出,则 str(object) 将返回 type(object).__str__(object),这是 object 的“非正式”而适合显示的字符串表示形式。 对于字符串对象,这就是该字符串本身。 如果 object 没有 __str__() 方法,则 str() 将回退为返回 repr(object)

如果 encoding 或 errors 至少给出其中之一,则 object 应该是一个 bytes-like object (例如 bytesbytearray)。 在此情况下,如果 object 是一个 bytes (或 bytearray) 对象,则 str(bytes, encoding, errors) 等价于 bytes.decode(encoding, errors)。 否则的话,会在调用 bytes.decode() 之前获取缓冲区对象下层的 bytes 对象。 请参阅 二进制序列类型 —- bytes, bytearray, memoryview缓冲协议 了解有关缓冲区对象的信息。

将一个 bytes 对象传入 str() 而不给出 encoding 或 errors 参数的操作属于第一种情况, 将返回非正式的字符串表示(另请参阅 Python 的 -b 命令行选项)。 例如:

  1. >>> str(b'Zoot!')
  2. "b'Zoot!'"

有关 str 类及其方法的更多信息,请参阅下面的 文本序列类型 —- str字符串的方法 小节。 要输出格式化字符串,请参阅 f 字符串格式字符串语法 小节。 此外还可以参阅 文本处理服务 小节。

字符串的方法

字符串实现了所有 一般 序列的操作,还额外提供了以下列出的一些附加方法。

字符串还支持两种字符串格式化样式,一种提供了很大程度的灵活性和可定制性 (参阅 str.format(), 格式字符串语法自定义字符串格式化) 而另一种是基于 C printf 样式的格式化,它可处理的类型范围较窄,并且更难以正确使用,但对于它可处理的情况往往会更为快速 (printf 风格的字符串格式化)。

标准库的 文本处理服务 部分涵盖了许多其他模块,提供各种文本相关工具(例如包含于 re 模块中的正则表达式支持)。

  • str.capitalize()
  • 返回原字符串的副本,其首个字符大写,其余为小写。

在 3.8 版本发生变更: 第一个字符现在被放入了 titlecase 而不是 uppercase。 这意味着复合字母类字符将只有首个字母改为大写,而再不是全部字符大写。

  • str.casefold()
  • 返回原字符串消除大小写的副本。 消除大小写的字符串可用于忽略大小写的匹配。

消除大小写类似于转为小写,但是更加彻底一些,因为它会移除字符串中的所有大小写变化形式。 例如,德语小写字母 'ß' 相当于 "ss"。 由于它已经是小写了,lower() 不会对 'ß' 做任何改变;而 casefold() 则会将其转换为 "ss"

大小写折叠算法在 Unicode 标准第 3.13 节 &#39;Default Case Folding&#39; 中描述 &lt;[https://www.unicode.org/versions/Unicode15.1.0/ch03.pdf](https://www.unicode.org/versions/Unicode15.1.0/ch03.pdf)&gt;__。

Added in version 3.3.

  • str.center(width[, fillchar])
  • 返回长度为 width 的字符串,原字符串在其正中。 使用指定的 fillchar 填充两边的空位(默认使用 ASCII 空格符)。 如果 width 小于等于 len(s) 则返回原字符串的副本。
  • str.count(sub[, start[, end]])
  • 返回子字符串 sub 在 [start, end] 范围内非重叠出现的次数。 可选参数 start 与 end 会被解读为切片表示法。

如果 sub 为空,则返回字符之间的空字符串数,即字符串的长度加一。

  • str.encode(encoding='utf-8', errors='strict')
  • 返回编码为 bytes 的字符串。

encoding 默认为 'utf-8' ;请参阅 标准编码 了解其他可能的值。

errors 控制如何处理编码错误。 如为 'strict' (默认值),则会引发 UnicodeError。 其他可能的值有 'ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace' 以及通过 codecs.register_error() 注册的任何其他名称。 请参阅 错误处理方案 了解详情。

出于性能原因,除非真正发生了编码错误,启用了 Python 开发模式 或使用了 调试编译版 否则不会检查 errors 值的有效性。

在 3.1 版本发生变更: 加入了对关键字参数的支持。

在 3.9 版本发生变更: 现在会在 Python 开发模式调试模式 下检查 errors 参数的值。

  • str.endswith(suffix[, start[, end]])
  • 如果字符串以指定的 suffix 结束返回 True,否则返回 False。 suffix 也可以为由多个供查找的后缀构成的元组。 如果有可选项 start,将从所指定位置开始检查。 如果有可选项 end,将在所指定位置停止比较。
  • str.expandtabs(tabsize=8)
  • 返回字符串的副本,其中所有的制表符会由一个或多个空格替换,具体取决于当前列位置和给定的制表符宽度。 每 tabsize 个字符设为一个制表位(默认值 8 时设定的制表位在列 0, 8, 16 依次类推)。 要展开字符串,当前列将被设为零并逐一检查字符串中的每个字符。 如果字符为制表符 (\t),则会在结果中插入一个或多个空格符,直到当前列等于下一个制表位。 (制表符本身不会被复制。) 如果字符为换行符 (\n) 或回车符 (\r),它会被复制并将当前列重设为零。 任何其他字符会被不加修改地复制并将当前列加一,不论该字符在被打印时会如何显示。
  1. >>> '01\t012\t0123\t01234'.expandtabs()
  2. '01 012 0123 01234'
  3. >>> '01\t012\t0123\t01234'.expandtabs(4)
  4. '01 012 0123 01234'
  • str.find(sub[, start[, end]])
  • 返回子字符串 sub 在 s[start:end] 切片内被找到的最小索引。 可选参数 start 与 end 会被解读为切片表示法。 如果 sub 未被找到则返回 -1

备注

find() 方法应该只在你需要知道 sub 所在位置时使用。 要检查 sub 是否为子字符串,请使用 in 操作符:

  1. >>> 'Py' in 'Python'
  2. True
  • str.format(args, *kwargs)
  • 执行字符串格式化操作。 调用此方法的字符串可以包含字符串字面值或者以花括号 {} 括起来的替换域。 每个替换域可以包含一个位置参数的数字索引,或者一个关键字参数的名称。 返回的字符串副本中每个替换域都会被替换为对应参数的字符串值。
  1. >>> "The sum of 1 + 2 is {0}".format(1+2)
  2. 'The sum of 1 + 2 is 3'

请参阅 格式字符串语法 了解有关可以在格式字符串中指定的各种格式选项的说明。

备注

当使用 n 类型 (例如: '{:n}'.format(1234)) 来格式化数字 (int, float, complex, decimal.Decimal 及其子类) 的时候,该函数会临时性地将 LC_CTYPE 区域设置为 LC_NUMERIC 区域以解码 localeconv()decimal_pointthousands_sep 字段,如果它们是非 ASCII 字符或长度超过 1 字节的话,并且 LC_NUMERIC 区域会与 LC_CTYPE 区域不一致。 这个临时更改会影响其他线程。

在 3.7 版本发生变更: 当使用 n 类型格式化数字时,该函数在某些情况下会临时性地将 LC_CTYPE 区域设置为 LC_NUMERIC 区域。

  • str.format_map(mapping, /)
  • 类似于 str.format(**mapping),不同之处在于 mapping 会被直接使用而不是复制到一个 dict。 适宜使用此方法的一个例子是当 mapping 为 dict 的子类的情况:
  1. >>> class Default(dict):
  2. ... def __missing__(self, key):
  3. ... return key
  4. ...
  5. >>> '{name} was born in {country}'.format_map(Default(name='Guido'))
  6. 'Guido was born in country'

Added in version 3.2.

  • str.index(sub[, start[, end]])
  • 类似于 find(),但在找不到子字符串时会引发 ValueError
  • str.isalnum()
  • 如果字符串中的所有字符都是字母或数字且至少有一个字符,则返回 True , 否则返回 False 。 如果 c.isalpha()c.isdecimal()c.isdigit() ,或 c.isnumeric() 之中有一个返回 True ,则字符 c 是字母或数字。
  • str.isascii()
  • 如果字符串为空或字符串中的所有字符都是 ASCII ,返回 True ,否则返回 False 。ASCII 字符的码点范围是 U+0000-U+007F 。

Added in version 3.7.

  • str.isdecimal()
  • 如果字符串中的所有字符都是十进制字符且该字符串至少有一个字符,则返回 True , 否则返回 False 。十进制字符指那些可以用来组成10进制数字的字符,例如 U+0660 ,即阿拉伯字母数字0 。 严格地讲,十进制字符是 Unicode 通用类别 "Nd" 中的一个字符。
  • str.isdigit()
  • 如果字符串中的所有字符都是数字,并且至少有一个字符,返回 True ,否则返回 False 。 数字包括十进制字符和需要特殊处理的数字,如兼容性上标数字。这包括了不能用来组成 10 进制数的数字,如 Kharosthi 数。 严格地讲,数字是指属性值为 Numeric_Type=Digit 或 Numeric_Type=Decimal 的字符。
  • str.isidentifier()
  • 如果字符串是有效的标识符,返回 True ,依据语言定义, 标识符和关键字 节。

keyword.iskeyword() 可被用来测试字符串 s 是否为保留的标识符,如 defclass

示例:

  1. >>> from keyword import iskeyword
  2.  
  3. >>> 'hello'.isidentifier(), iskeyword('hello')
  4. (True, False)
  5. >>> 'def'.isidentifier(), iskeyword('def')
  6. (True, True)
  • str.islower()
  • 如果字符串中至少有一个区分大小写的字符 [4] 且此类字符均为小写则返回 True ,否则返回 False
  • str.isnumeric()
  • 如果字符串中至少有一个字符且所有字符均为数值字符则返回 True ,否则返回 False 。 数值字符包括数字字符,以及所有在 Unicode 中设置了数值特性属性的字符,例如 U+2155, VULGAR FRACTION ONE FIFTH。 正式的定义为:数值字符就是具有特征属性值 Numeric_Type=Digit, Numeric_Type=Decimal 或 Numeric_Type=Numeric 的字符。
  • str.isprintable()
  • 如果字符串中所有字符均为可打印字符或字符串为空则返回 True ,否则返回 False 。 不可打印字符是在 Unicode 字符数据库中被定义为 "Other" 或 "Separator" 的字符,例外情况是 ASCII 空格字符 (0x20) 被视作可打印字符。 (请注意在此语境下可打印字符是指当对一个字符串唤起 repr() 时不必被转义的字符。 它们与字符串写入 sys.stdoutsys.stderr 时所需的处理无关。)
  • str.isspace()
  • 如果字符串中只有空白字符且至少有一个字符则返回 True ,否则返回 False

空白 字符是指在 Unicode 字符数据库 (参见 unicodedata) 中主要类别为 Zs ("Separator, space") 或所属双向类为 WS, BS 的字符。

  • str.istitle()
  • 如果字符串中至少有一个字符且为标题字符串则返回 True ,例如大写字符之后只能带非大写字符而小写字符必须有大写字符打头。 否则返回 False
  • str.isupper()
  • 如果字符串中至少有一个区分大小写的字符 [4] 且此类字符均为大写则返回 True ,否则返回 False
  1. >>> 'BANANA'.isupper()
  2. True
  3. >>> 'banana'.isupper()
  4. False
  5. >>> 'baNana'.isupper()
  6. False
  7. >>> ' '.isupper()
  8. False
  • str.join(iterable)
  • 返回一个由 iterable 中的字符串拼接而成的字符串。 如果 iterable 中存在任何非字符串值包括 bytes 对象则会引发 TypeError。 调用该方法的字符串将作为元素之间的分隔。
  • str.ljust(width[, fillchar])
  • 返回长度为 width 的字符串,原字符串在其中靠左对齐。 使用指定的 fillchar 填充空位 (默认使用 ASCII 空格符)。 如果 width 小于等于 len(s) 则返回原字符串的副本。
  • str.lower()
  • 返回原字符串的副本,其所有区分大小写的字符 [4] 均转换为小写。

所使用的小写算法 在 Unicode 标准 3.13 节 'Default Case Folding' 中描述 [https://www.unicode.org/versions/Unicode15.1.0/ch03.pdf]。

  • str.lstrip([chars])
  • 返回原字符串的副本,移除其中的前导字符。 chars 参数为指定要移除字符的字符串。 如果省略或为 None,则 chars 参数默认移除空白符。 实际上 chars 参数并非指定单个前缀;而是会移除参数值的所有组合:
  1. >>> ' spacious '.lstrip()
  2. 'spacious '
  3. >>> 'www.example.com'.lstrip('cmowz.')
  4. 'example.com'

参见 str.removeprefix() ,该方法将删除单个前缀字符串,而不是全部给定集合中的字符。 例如:

  1. >>> 'Arthur: three!'.lstrip('Arthur: ')
  2. 'ee!'
  3. >>> 'Arthur: three!'.removeprefix('Arthur: ')
  4. 'three!'
  • static str.maketrans(x[, y[, z]])
  • 此静态方法返回一个可供 str.translate() 使用的转换对照表。

如果只有一个参数,则它必须是一个将 Unicode 码位序号(整数)或字符(长度为 1 的字符串)映射到 Unicode 码位序号、(任意长度的)字符串或 None 的字典。 字符键将会被转换为码位序号。

如果有两个参数,则它们必须是两个长度相等的字符串,并且在结果字典中,x 中每个字符将被映射到 y 中相同位置的字符。 如果有第三个参数,它必须是一个字符串,其中的字符将在结果中被映射到 None

  • str.partition(sep)
  • 在 sep 首次出现的位置拆分字符串,返回一个 3 元组,其中包含分隔符之前的部分、分隔符本身,以及分隔符之后的部分。 如果分隔符未找到,则返回的 3 元组中包含字符本身以及两个空字符串。
  • str.removeprefix(prefix, /)
  • 如果字符串以 prefix 字符串开头,返回 string[len(prefix):]。 否则,返回原始字符串的副本:
  1. >>> 'TestHook'.removeprefix('Test')
  2. 'Hook'
  3. >>> 'BaseTestCase'.removeprefix('Test')
  4. 'BaseTestCase'

Added in version 3.9.

  • str.removesuffix(suffix, /)
  • 如果字符串以 suffix 字符串结尾,并且 suffix 非空,返回 string[:-len(suffix)]。 否则,返回原始字符串的副本:
  1. >>> 'MiscTests'.removesuffix('Tests')
  2. 'Misc'
  3. >>> 'TmpDirMixin'.removesuffix('Tests')
  4. 'TmpDirMixin'

Added in version 3.9.

  • str.replace(old, new, count=-1)
  • 返回字符串的副本,其中出现的所有子字符串 old 都将被替换为 new。 如果给出了 count,则只替换前 count 次出现。 如果 count 未指定或为 -1,则全部替换。

在 3.13 版本发生变更: 现在可支持 count 关键字参数。

  • str.rfind(sub[, start[, end]])
  • 返回子字符串 sub 在字符串内被找到的最大(最右)索引,这样 sub 将包含在 s[start:end] 当中。 可选参数 start 与 end 会被解读为切片表示法。 如果未找到则返回 -1
  • str.rindex(sub[, start[, end]])
  • 类似于 rfind(),但在子字符串 sub 未找到时会引发 ValueError
  • str.rjust(width[, fillchar])
  • 返回长度为 width 的字符串,原字符串在其中靠右对齐。 使用指定的 fillchar 填充空位 (默认使用 ASCII 空格符)。 如果 width 小于等于 len(s) 则返回原字符串的副本。
  • str.rpartition(sep)
  • 在 sep 最后一次出现的位置拆分字符串,返回一个 3 元组,其中包含分隔符之前的部分、分隔符本身,以及分隔符之后的部分。 如果分隔符未找到,则返回的 3 元组中包含两个空字符串以及字符串本身。
  • str.rsplit(sep=None, maxsplit=-1)
  • 返回一个由字符串内单词组成的列表,使用 sep 作为分隔字符串。 如果给出了 maxsplit,则最多进行 maxsplit 次拆分,从 最右边 开始。 如果 sep 未指定或为 None,任何空白字符串都会被作为分隔符。 除了从右边开始拆分,rsplit() 的其他行为都类似于下文所述的 split()
  • str.rstrip([chars])
  • 返回原字符串的副本,移除其中的末尾字符。 chars 参数为指定要移除字符的字符串。 如果省略或为 None,则 chars 参数默认移除空白符。 实际上 chars 参数并非指定单个后缀;而是会移除参数值的所有组合:
  1. >>> ' spacious '.rstrip()
  2. ' spacious'
  3. >>> 'mississippi'.rstrip('ipz')
  4. 'mississ'

要删除单个后缀字符串,而不是全部给定集合中的字符,请参见 str.removesuffix() 方法。 例如:

  1. >>> 'Monty Python'.rstrip(' Python')
  2. 'M'
  3. >>> 'Monty Python'.removesuffix(' Python')
  4. 'Monty'
  • str.split(sep=None, maxsplit=-1)
  • 返回一个由字符串内单词组成的列表,使用 sep 作为分隔字符串。 如果给出了 maxsplit,则最多进行 maxsplit 次拆分(因此,列表最多会有 maxsplit+1 个元素)。 如果 maxsplit 未指定或为 -1,则不限制拆分次数(进行所有可能的拆分)。

如果给出了 sep,则连续的分隔符不会被组合在一起而是会被视为分隔空字符串 (例如 '1,,2'.split(',') 将返回 ['1', '', '2'])。 sep 参数可能是由多个字符组成的单个分隔符 (要使用多个分隔符进行拆分,请使用 re.split())。 使用指定的分隔符拆分一个空字符串将返回 ['']

例如:

  1. >>> '1,2,3'.split(',')
  2. ['1', '2', '3']
  3. >>> '1,2,3'.split(',', maxsplit=1)
  4. ['1', '2,3']
  5. >>> '1,2,,3,'.split(',')
  6. ['1', '2', '', '3', '']
  7. >>> '1<>2<>3<4'.split('<>')
  8. ['1', '2', '3<4']

如果 sep 未指定或为 None,则会应用另一种拆分算法:连续的空格会被视为单个分隔符,其结果将不包含开头或末尾的空字符串,如果字符串包含前缀或后缀空格的话。 因此,使用 None 拆分空字符串或仅包含空格的字符串将返回 []

例如:

  1. >>> '1 2 3'.split()
  2. ['1', '2', '3']
  3. >>> '1 2 3'.split(maxsplit=1)
  4. ['1', '2 3']
  5. >>> ' 1 2 3 '.split()
  6. ['1', '2', '3']
  • str.splitlines(keepends=False)
  • 返回由原字符串中各行组成的列表,在行边界的位置拆分。 结果列表中不包含行边界,除非给出了 keepends 且为真值。

此方法会以下列行边界进行拆分。 特别地,行边界是 universal newlines 的一个超集。

表示符

描述

\n

换行

\r

回车

\r\n

回车 + 换行

\v\x0b

行制表符

\f\x0c

换表单

\x1c

文件分隔符

\x1d

组分隔符

\x1e

记录分隔符

\x85

下一行 (C1 控制码)

\u2028

行分隔符

\u2029

段分隔符

在 3.2 版本发生变更: \v\f 被添加到行边界列表

例如:

  1. >>> 'ab c\n\nde fg\rkl\r\n'.splitlines()
  2. ['ab c', '', 'de fg', 'kl']
  3. >>> 'ab c\n\nde fg\rkl\r\n'.splitlines(keepends=True)
  4. ['ab c\n', '\n', 'de fg\r', 'kl\r\n']

不同于 split(),当给出了分隔字符串 sep 时,对于空字符串此方法将返回一个空列表,而末尾的换行不会令结果中增加额外的行:

  1. >>> "".splitlines()
  2. []
  3. >>> "One line\n".splitlines()
  4. ['One line']

作为比较,split('\n') 的结果为:

  1. >>> ''.split('\n')
  2. ['']
  3. >>> 'Two lines\n'.split('\n')
  4. ['Two lines', '']
  • str.startswith(prefix[, start[, end]])
  • 如果字符串以指定的 prefix 开始则返回 True,否则返回 False。 prefix 也可以为由多个供查找的前缀构成的元组。 如果有可选项 start,将从所指定位置开始检查。 如果有可选项 end,将在所指定位置停止比较。
  • str.strip([chars])
  • 返回原字符串的副本,移除其中的前导和末尾字符。 chars 参数为指定要移除字符的字符串。 如果省略或为 None,则 chars 参数默认移除空白符。 实际上 chars 参数并非指定单个前缀或后缀;而是会移除参数值的所有组合:
  1. >>> ' spacious '.strip()
  2. 'spacious'
  3. >>> 'www.example.com'.strip('cmowz.')
  4. 'example'

最外侧的前导和末尾 chars 参数值将从字符串中移除。 开头端的字符的移除将在遇到一个未包含于 chars 所指定字符集的字符时停止。 类似的操作也将在结尾端发生。 例如:

  1. >>> comment_string = '#....... Section 3.2.1 Issue #32 .......'
  2. >>> comment_string.strip('.#! ')
  3. 'Section 3.2.1 Issue #32'
  • str.swapcase()
  • 返回原字符串的副本,其中大写字符转换为小写,反之亦然。 请注意 s.swapcase().swapcase() == s 并不一定为真值。
  • str.title()
  • 返回原字符串的标题版本,其中每个单词第一个字母为大写,其余字母为小写。

例如:

  1. >>> 'Hello world'.title()
  2. 'Hello World'

该算法使用一种简单的与语言无关的定义,将连续的字母组合视为单词。 该定义在多数情况下都很有效,但它也意味着代表缩写形式与所有格的撇号也会成为单词边界,这可能导致不希望的结果:

  1. >>> "they're bill's friends from the UK".title()
  2. "They'Re Bill'S Friends From The Uk"

string.capwords() 函数没有此问题,因为它只用空格来拆分单词。

作为替代,可以使用正则表达式来构造针对撇号的变通处理:

  1. >>> import re
  2. >>> def titlecase(s):
  3. ... return re.sub(r"[A-Za-z]+('[A-Za-z]+)?",
  4. ... lambda mo: mo.group(0).capitalize(),
  5. ... s)
  6. ...
  7. >>> titlecase("they're bill's friends.")
  8. "They're Bill's Friends."
  • str.translate(table)
  • 返回原字符串的副本,其中每个字符按给定的转换表进行映射。 转换表必须是一个通过 __getitem__() 来实现索引操作的对象,通常为 mappingsequence。 当以 Unicode 码位序号(整数)为索引时,转换表对象可以做以下任何一种操作:返回 Unicode 码位序号或字符串,将字符映射为一个或多个其他字符;返回 None,将字符从返回的字符串中删除;或引发 LookupError 异常,将字符映射为其自身。

你可以使用 str.maketrans() 基于不同格式的字符到字符映射来创建一个转换映射表。

另请参阅 codecs 模块以了解定制字符映射的更灵活方式。

  • str.upper()
  • 返回原字符串的副本,其中所有区分大小写的字符 [4] 均转换为大写。 请注意如果 s 包含不区分大小写的字符或者如果结果字符的 Unicode 类别不是 "Lu" (Letter, uppercase) 而是 "Lt" (Letter, titlecase) 则 s.upper().isupper() 有可能为 False

所使用的大写转换算法 在 Unicode 标准的第 3.13 节 'Default Case Folding' 中描述 [https://www.unicode.org/versions/Unicode15.1.0/ch03.pdf]。

  • str.zfill(width)
  • 返回原字符串的副本,在左边填充 ASCII '0' 数码使其长度变为 width。 正负值前缀 ('+'/'-') 的处理方式是在正负符号 之后 填充而非在之前。 如果 width 小于等于 len(s) 则返回原字符串的副本。

例如:

  1. >>> "42".zfill(5)
  2. '00042'
  3. >>> "-42".zfill(5)
  4. '-0042'

printf 风格的字符串格式化

备注

此处介绍的格式化操作具有多种怪异特性,可能导致许多常见错误(例如无法正确显示元组和字典)。 使用较新的 格式化字符串字面值str.format() 接口或 模板字符串 有助于避免这样的错误。 这些替代方案中的每一种都更好地权衡并提供了简单、灵活以及可扩展性优势。

字符串具有一种特殊的内置操作即 % (求模) 运算符。 这也被称为字符串的 格式化插值 运算符。 对于给定的 format % values (其中 format 是一个字符串),在 format 中的 % 转换标记符将被替换为零个或多个 values 中的元素。 其效果类似于在 C 语言中使用 sprintf() 函数。 例如:

  1. >>> print('%s has %d quote types.' % ('Python', 2))
  2. Python has 2 quote types.

如果 format 要求一个单独参数,则 values 可以为一个非元组对象。 [5] 否则的话,values 必须或者是一个包含项数与格式字符串中指定的转换符项数相同的元组,或者是一个单独映射对象(例如字典)。

转换标记符包含两个或更多字符并具有以下组成,且必须遵循此处规定的顺序:

  • '%' 字符,用于标记转换符的起始。

  • 映射键(可选),由加圆括号的字符序列组成 (例如 (somename))。

  • 转换旗标(可选),用于影响某些转换类型的结果。

  • 最小字段宽度(可选)。 如果指定为 '*' (星号),则实际宽度会从 values 元组的下一元素中读取,要转换的对象则为最小字段宽度和可选的精度之后的元素。

  • 精度(可选),以在 '.' (点号) 之后加精度值的形式给出。 如果指定为 '*' (星号),则实际精度会从 values 元组的下一元素中读取,要转换的对象则为精度之后的元素。

  • 长度修饰符(可选)。

  • 转换类型。

当右边的参数为一个字典(或其他映射类型)时,字符串中的格式 必须 包含加圆括号的映射键,对应 '%' 字符之后字典中的每一项。 映射键将从映射中选取要格式化的值。 例如:

  1. >>> print('%(language)s has %(number)03d quote types.' %
  2. ... {'language': "Python", "number": 2})
  3. Python has 002 quote types.

在此情况下格式中不能出现 * 标记符(因其需要一个序列类的参数列表)。

转换旗标为:

旗标 含意
'#' 值的转换将使用“替代形式”(具体定义见下文)。
'0' 转换将为数字值填充零字符。
'-' 转换值将靠左对齐(如果同时给出 '0' 转换,则会覆盖后者)。
' ' (空格) 符号位转换产生的正数(或空字符串)前将留出一个空格。
'+' 符号字符 ('+''-') 将显示于转换结果的开头(会覆盖 "空格" 旗标)。

可以给出长度修饰符 (h, lL),但会被忽略,因为对 Python 来说没有必要 — 所以 %ld 等价于 %d

转换类型为:

转换符 含意 备注
'd' 有符号十进制整数。
'i' 有符号十进制整数。
'o' 有符号八进制数。 (1)
'u' 过时类型 — 等价于 'd' (6)
'x' 有符号十六进制数(小写)。 (2)
'X' 有符号十六进制数(大写)。 (2)
'e' 浮点指数格式(小写)。 (3)
'E' 浮点指数格式(大写)。 (3)
'f' 浮点十进制格式。 (3)
'F' 浮点十进制格式。 (3)
'g' 浮点格式。 如果指数小于 -4 或不小于精度则使用小写指数格式,否则使用十进制格式。 (4)
'G' 浮点格式。 如果指数小于 -4 或不小于精度则使用大写指数格式,否则使用十进制格式。 (4)
'c' 单个字符(接受整数或单个字符的字符串)。
'r' 字符串(使用 repr() 转换任何 Python 对象)。 (5)
's' 字符串(使用 str() 转换任何 Python 对象)。 (5)
'a' 字符串(使用 ascii() 转换任何 Python 对象)。 (5)
'%' 不转换参数,在结果中输出一个 '%' 字符。

注释:

  • 此替代形式会在第一个数码之前插入标示八进制数的前缀 ('0o')。

  • 此替代形式会在第一个数码之前插入 '0x''0X' 前缀(取决于是使用 'x' 还是 'X' 格式)。

  • 此替代形式总是会在结果中包含一个小数点,即使其后并没有数码。

小数点后的数码位数由精度决定,默认为 6。

  • 此替代形式总是会在结果中包含一个小数点,末尾各位的零不会如其他情况下那样被移除。

小数点前后的有效数码位数由精度决定,默认为 6。

由于 Python 字符串显式指明长度,%s 转换不会将 '\0' 视为字符串的结束。

在 3.1 版本发生变更: 绝对值超过 1e50 的 %f 转换不会再被替换为 %g 转换。

二进制序列类型 —- bytes, bytearray, memoryview

操作二进制数据的核心内置类型是 bytesbytearray。 它们由 memoryview 提供支持,该对象使用 缓冲区协议 来访问其他二进制对象所在内存,不需要创建对象的副本。

array 模块支持高效地存储基本数据类型,例如 32 位整数和 IEEE754 双精度浮点值。

bytes 对象

bytes 对象是由单个字节构成的不可变序列。 由于许多主要二进制协议都基于 ASCII 文本编码,因此 bytes 对象提供了一些仅在处理 ASCII 兼容数据时可用,并且在许多特性上与字符串对象紧密相关的方法。

  • class bytes([source[, encoding[, errors]]])
  • 首先,表示 bytes 字面值的语法与字符串字面值的大致相同,只是添加了一个 b 前缀:

    • 单引号: b'同样允许嵌入 "双" 引号'

    • 双引号: b"仍然允许嵌入 '单' 引号"

    • 三重引号: b'''三重单引号''', b"""三重双引号"""

bytes 字面值中只允许 ASCII 字符(无论源代码声明的编码格式为何)。 任何超出 127 的二进制值必须使用相应的转义序列形式加入 bytes 字面值。

像字符串字面值一样,bytes 字面值也可以使用 r 前缀来禁用转义序列处理。 请参阅 字符串与字节串字面值 了解有关各种 bytes 字面值形式的详情,包括所支持的转义序列。

虽然 bytes 字面值和表示法是基于 ASCII 文本的,但 bytes 对象的行为实际上更像是不可变的整数序列,序列中的每个值的大小被限制为 0 <= x < 256 (如果违反此限制将引发 ValueError)。 这种限制是有意设计用以强调以下事实,虽然许多二进制格式都包含基于 ASCII 的元素,可以通过某些面向文本的算法进行有用的操作,但情况对于任意二进制数据来说通常却并非如此(盲目地将文本处理算法应用于不兼容 ASCII 的二进制数据格式往往将导致数据损坏)。

除了字面值形式,bytes 对象还可以通过其他几种方式来创建:

  • 指定长度的以零值填充的 bytes 对象: bytes(10)

  • 通过由整数组成的可迭代对象: bytes(range(20))

  • 通过缓冲区协议复制现有的二进制数据: bytes(obj)

另请参阅 bytes 内置类型。

由于两个十六进制数码精确对应一个字节,因此十六进制数是描述二进制数据的常用格式。 相应地,bytes 类型具有从此种格式读取数据的附加类方法:

  • classmethod fromhex(string)
  • bytes 类方法返回一个解码给定字符串的 bytes 对象。 字符串必须由表示每个字节的两个十六进制数码构成,其中的 ASCII 空白符会被忽略。
  1. >>> bytes.fromhex('2Ef0 F1f2 ')
  2. b'.\xf0\xf1\xf2'

在 3.7 版本发生变更: bytes.fromhex() 现在会忽略所有 ASCII 空白符而不只是空格符。

存在一个反向转换函数,可以将 bytes 对象转换为对应的十六进制表示。

  • hex([sep[, bytes_per_sep]])
  • 返回一个字符串对象,该对象包含实例中每个字节的两个十六进制数字。
  1. >>> b'\xf0\xf1\xf2'.hex()
  2. 'f0f1f2'

如果你希望令十六进制数字符串更易读,你可以指定单个字符分隔符作为 sep 形参包含于输出中。 默认情况下,该分隔符会放在每个字节之间。 第二个可选的 bytes_per_sep 形参控制间距。 正值会从右开始计算分隔符的位置,负值则是从左开始。

  1. >>> value = b'\xf0\xf1\xf2'
  2. >>> value.hex('-')
  3. 'f0-f1-f2'
  4. >>> value.hex('_', 2)
  5. 'f0_f1f2'
  6. >>> b'UUDDLRLRAB'.hex(' ', -4)
  7. '55554444 4c524c52 4142'

Added in version 3.5.

在 3.8 版本发生变更: bytes.hex() 现在支持可选的 sep 和 bytes_per_sep 形参以在十六进制输出的字节之间插入分隔符。

由于 bytes 对象是由整数构成的序列(类似于元组),因此对于一个 bytes 对象 bb[0] 将为一个整数,而 b[0:1] 将为一个长度为 1 的 bytes 对象。 (这与文本字符串不同,索引和切片所产生的将都是一个长度为 1 的字符串)。

bytes 对象的表示使用字面值格式 (b'…'),因为它通常都要比像 bytes([46, 46, 46]) 这样的格式更好用。 你总是可以使用 list(b) 将 bytes 对象转换为一个由整数构成的列表。

bytearray 对象

bytearray 对象是 bytes 对象的可变对应物。

  • class bytearray([source[, encoding[, errors]]])
  • bytearray 对象没有专属的字面值语法,它们总是通过调用构造器来创建:

    • 创建一个空实例: bytearray()

    • 创建一个指定长度的以零值填充的实例: bytearray(10)

    • 通过由整数组成的可迭代对象: bytearray(range(20))

    • 通过缓冲区协议复制现有的二进制数据: bytearray(b'Hi!')

由于 bytearray 对象是可变的,该对象除了 bytes 和 bytearray 操作 中所描述的 bytes 和 bytearray 共有操作之外,还支持 可变 序列操作。

另请参见 bytearray 内置类型。

由于两个十六进制数码精确对应一个字节,因此十六进制数是描述二进制数据的常用格式。 相应地,bytearray 类型具有从此种格式读取数据的附加类方法:

  • classmethod fromhex(string)
  • bytearray 类方法返回一个解码给定字符串的 bytearray 对象。 字符串必须由表示每个字节的两个十六进制数码构成,其中的 ASCII 空白符会被忽略。
  1. >>> bytearray.fromhex('2Ef0 F1f2 ')
  2. bytearray(b'.\xf0\xf1\xf2')

在 3.7 版本发生变更: bytearray.fromhex() 现在会忽略所有 ASCII 空白符而不只是空格符。

存在一个反向转换函数,可以将 bytearray 对象转换为对应的十六进制表示。

  • hex([sep[, bytes_per_sep]])
  • 返回一个字符串对象,该对象包含实例中每个字节的两个十六进制数字。
  1. >>> bytearray(b'\xf0\xf1\xf2').hex()
  2. 'f0f1f2'

Added in version 3.5.

在 3.8 版本发生变更: 与 bytes.hex() 相似, bytearray.hex() 现在支持可选的 sep 和 bytes_per_sep 参数以在十六进制输出的字节之间插入分隔符。

由于 bytearray 对象是由整数构成的序列(类似于列表),因此对于一个 bytearray 对象 bb[0] 将为一个整数,而 b[0:1] 将为一个长度为 1 的 bytearray 对象。 (这与文本字符串不同,索引和切片所产生的将都是一个长度为 1 的字符串)。

bytearray 对象的表示使用 bytes 对象字面值格式 (bytearray(b'…')),因为它通常都要比 bytearray([46, 46, 46]) 这样的格式更好用。 你总是可以使用 list(b) 将 bytearray 对象转换为一个由整数构成的列表。

bytes 和 bytearray 操作

bytes 和 bytearray 对象都支持 通用 序列操作。 它们不仅能与相同类型的操作数,也能与任何 bytes-like object 进行互操作。 由于这样的灵活性,它们可以在操作中自由地混合而不会导致错误。 但是,操作结果的返回值类型可能取决于操作数的顺序。

备注

bytes 和 bytearray 对象的方法不接受字符串作为其参数,就像字符串的方法不接受 bytes 对象作为其参数一样。 例如,你必须使用以下写法:

  1. a = "abc"
  2. b = a.replace("a", "f")

和:

  1. a = b"abc"
  2. b = a.replace(b"a", b"f")

某些 bytes 和 bytearray 操作假定使用兼容 ASCII 的二进制格式,因此在处理任意二进数数据时应当避免使用。 这些限制会在下文中说明。

备注

使用这些基于 ASCII 的操作来处理未以基于 ASCII 的格式存储的二进制数据可能会导致数据损坏。

bytes 和 bytearray 对象的下列方法可以用于任意二进制数据。

  • bytes.count(sub[, start[, end]])
  • bytearray.count(sub[, start[, end]])
  • 返回子序列 sub 在 [start, end] 范围内非重叠出现的次数。 可选参数 start 与 end 会被解读为切片表示法。

要搜索的子序列可以是任意 bytes-like object 或是 0 至 255 范围内的整数。

如果 sub 为空,则返回字符之间的空切片的数量即字节串对象的长度加一。

在 3.3 版本发生变更: 也接受 0 至 255 范围内的整数作为子序列。

  • bytes.removeprefix(prefix, /)
  • bytearray.removeprefix(prefix, /)
  • 如果二进制数据以 prefix 字符串开头,返回 bytes[len(prefix):]。 否则,返回原始二进制数据的副本:
  1. >>> b'TestHook'.removeprefix(b'Test')
  2. b'Hook'
  3. >>> b'BaseTestCase'.removeprefix(b'Test')
  4. b'BaseTestCase'

prefix 可以是任意 bytes-like object

备注

此方法的 bytearray 版本 并非 原地操作 —— 它总是产生一个新对象,即便没有做任何改变。

Added in version 3.9.

  • bytes.removesuffix(suffix, /)
  • bytearray.removesuffix(suffix, /)
  • 如果二进制数据以 suffix 字符串结尾,并且 suffix 非空,返回 bytes[:-len(suffix)]。 否则,返回原始二进制数据的副本:
  1. >>> b'MiscTests'.removesuffix(b'Tests')
  2. b'Misc'
  3. >>> b'TmpDirMixin'.removesuffix(b'Tests')
  4. b'TmpDirMixin'

suffix 可以是任意 bytes-like object

备注

此方法的 bytearray 版本 并非 原地操作 —— 它总是产生一个新对象,即便没有做任何改变。

Added in version 3.9.

  • bytes.decode(encoding='utf-8', errors='strict')
  • bytearray.decode(encoding='utf-8', errors='strict')
  • 返回解码为 str 的字节串。

encoding 默认为 'utf-8' ;请参阅 标准编码 了解其他可能的值。

errors 控制如何处理编码错误。 如为 'strict' (默认值),则会引发 UnicodeError。 其他可能的值有 'ignore', 'replace' 以及通过 codecs.register_error() 注册的任何其他名称。 请参阅 错误处理方案 了解详情。

出于性能原因,除非真正发生了编码错误,启用了 Python 开发模式 或使用了 调试编译版 否则不会检查 errors 值的有效性。

备注

将 encoding 参数传给 str 允许直接解码任何 bytes-like object,无须创建临时的 bytesbytearray 对象。

在 3.1 版本发生变更: 加入了对关键字参数的支持。

在 3.9 版本发生变更: 现在会在 Python 开发模式调试模式 下检查 errors 参数的值。

  • bytes.endswith(suffix[, start[, end]])
  • bytearray.endswith(suffix[, start[, end]])
  • 如果二进制数据以指定的 suffix 结束则返回 True,否则返回 False。 suffix 也可以为由多个供查找的后缀构成的元组。 如果有可选项 start,将从所指定位置开始检查。 如果有可选项 end,将在所指定位置停止比较。

要搜索的后缀可以是任意 bytes-like object

  • bytes.find(sub[, start[, end]])
  • bytearray.find(sub[, start[, end]])
  • 返回子序列 sub 在数据中被找到的最小索引,sub 包含于切片 s[start:end] 之内。 可选参数 start 与 end 会被解读为切片表示法。 如果 sub 未被找到则返回 -1

要搜索的子序列可以是任意 bytes-like object 或是 0 至 255 范围内的整数。

备注

find() 方法应该只在你需要知道 sub 所在位置时使用。 要检查 sub 是否为子串,请使用 in 操作符:

  1. >>> b'Py' in b'Python'
  2. True

在 3.3 版本发生变更: 也接受 0 至 255 范围内的整数作为子序列。

  • bytes.index(sub[, start[, end]])
  • bytearray.index(sub[, start[, end]])
  • 类似于 find(),但在找不到子序列时会引发 ValueError

要搜索的子序列可以是任意 bytes-like object 或是 0 至 255 范围内的整数。

在 3.3 版本发生变更: 也接受 0 至 255 范围内的整数作为子序列。

  • bytes.join(iterable)
  • bytearray.join(iterable)
  • 返回一个由 iterable 中的二进制数据序列拼接而成的 bytes 或 bytearray 对象。 如果 iterable 中存在任何非 字节类对象 包括存在 str 对象值则会引发 TypeError。 提供该方法的 bytes 或 bytearray 对象的内容将作为元素之间的分隔。
  • static bytes.maketrans(from, to)
  • static bytearray.maketrans(from, to)
  • 此静态方法返回一个可用于 bytes.translate() 的转换对照表,它将把 from 中的每个字符映射为 to 中相同位置上的字符;from 与 to 必须都是 字节类对象 并且具有相同的长度。

Added in version 3.1.

  • bytes.partition(sep)
  • bytearray.partition(sep)
  • 在 sep 首次出现的位置拆分序列,返回一个 3 元组,其中包含分隔符之前的部分、分隔符本身或其 bytearray 副本,以及分隔符之后的部分。 如果分隔符未找到,则返回的 3 元组中包含原序列以及两个空的 bytes 或 bytearray 对象。

要搜索的分隔符可以是任意 bytes-like object

  • bytes.replace(old, new[, count])
  • bytearray.replace(old, new[, count])
  • 返回序列的副本,其中出现的所有子序列 old 都将被替换为 new。 如果给出了可选参数 count,则只替换前 count 次出现。

要搜索的子序列及其替换序列可以是任意 bytes-like object

备注

此方法的 bytearray 版本 并非 原地操作 —— 它总是产生一个新对象,即便没有做任何改变。

  • bytes.rfind(sub[, start[, end]])
  • bytearray.rfind(sub[, start[, end]])
  • 返回子序列 sub 在序列内被找到的最大(最右)索引,这样 sub 将包含在 s[start:end] 当中。 可选参数 start 与 end 会被解读为切片表示法。 如果未找到则返回 -1

要搜索的子序列可以是任意 bytes-like object 或是 0 至 255 范围内的整数。

在 3.3 版本发生变更: 也接受 0 至 255 范围内的整数作为子序列。

  • bytes.rindex(sub[, start[, end]])
  • bytearray.rindex(sub[, start[, end]])
  • 类似于 rfind(),但在子序列 sub 未找到时会引发 ValueError

要搜索的子序列可以是任意 bytes-like object 或是 0 至 255 范围内的整数。

在 3.3 版本发生变更: 也接受 0 至 255 范围内的整数作为子序列。

  • bytes.rpartition(sep)
  • bytearray.rpartition(sep)
  • 在 sep 最后一次出现的位置拆分序列,返回一个 3 元组,其中包含分隔符之前的部分,分隔符本身或其 bytearray 副本,以及分隔符之后的部分。 如果分隔符未找到,则返回的 3 元组中包含两个空的 bytes 或 bytearray 对象以及原序列的副本。

要搜索的分隔符可以是任意 bytes-like object

  • bytes.startswith(prefix[, start[, end]])
  • bytearray.startswith(prefix[, start[, end]])
  • 如果二进制数据以指定的 prefix 开头则返回 True,否则返回 False。 prefix 也可以为由多个供查找的前缀构成的元组。 如果有可选项 start,将从所指定位置开始检查。 如果有可选项 end,将在所指定位置停止比较。

要搜索的前缀可以是任意 bytes-like object

  • bytes.translate(table, /, delete=b'')
  • bytearray.translate(table, /, delete=b'')
  • 返回原 bytes 或 bytearray 对象的副本,移除其中所有在可选参数 delete 中出现的 bytes,其余 bytes 将通过给定的转换表进行映射,该转换表必须是长度为 256 的 bytes 对象。

你可以使用 bytes.maketrans() 方法来创建转换表。

对于仅需移除字符的转换,请将 table 参数设为 None:

  1. >>> b'read this short text'.translate(None, b'aeiou')
  2. b'rd ths shrt txt'

在 3.6 版本发生变更: 现在支持将 delete 作为关键字参数。

以下 bytes 和 bytearray 对象的方法的默认行为会假定使用兼容 ASCII 的二进制格式,但通过传入适当的参数仍然可用于任意二进制数据。 请注意本小节中所有的 bytearray 方法都 不是 原地执行操作,而是会产生新的对象。

  • bytes.center(width[, fillbyte])
  • bytearray.center(width[, fillbyte])
  • 返回原对象的副本,在长度为 width 的序列内居中,使用指定的 fillbyte 填充两边的空位(默认使用 ASCII 空格符)。 对于 bytes 对象,如果 width 小于等于 len(s) 则返回原序列的副本。

备注

此方法的 bytearray 版本 并非 原地操作 —— 它总是产生一个新对象,即便没有做任何改变。

  • bytes.ljust(width[, fillbyte])
  • bytearray.ljust(width[, fillbyte])
  • 返回原对象的副本,在长度为 width 的序列中靠左对齐。 使用指定的 fillbyte 填充空位(默认使用 ASCII 空格符)。 对于 bytes 对象,如果 width 小于等于 len(s) 则返回原序列的副本。

备注

此方法的 bytearray 版本 并非 原地操作 —— 它总是产生一个新对象,即便没有做任何改变。

  • bytes.lstrip([chars])
  • bytearray.lstrip([chars])
  • 返回原序列的副本,移除指定的前导字节。 chars 参数为指定要移除字节值集合的二进制序列 —— 这个名称表明此方法通常是用于 ASCII 字符。 如果省略或为 None,则 chars 参数默认移除 ASCII 空白符。 chars 参数并非指定单个前缀;而是会移除参数值的所有组合:
  1. >>> b' spacious '.lstrip()
  2. b'spacious '
  3. >>> b'www.example.com'.lstrip(b'cmowz.')
  4. b'example.com'

要移除的二进制序列可以是任意 bytes-like object 。 要删除单个前缀字符串,而不是全部给定集合中的字符,请参见 str.removeprefix() 方法。 例如:

  1. >>> b'Arthur: three!'.lstrip(b'Arthur: ')
  2. b'ee!'
  3. >>> b'Arthur: three!'.removeprefix(b'Arthur: ')
  4. b'three!'

备注

此方法的 bytearray 版本 并非 原地操作 —— 它总是产生一个新对象,即便没有做任何改变。

  • bytes.rjust(width[, fillbyte])
  • bytearray.rjust(width[, fillbyte])
  • 返回原对象的副本,在长度为 width 的序列中靠右对齐。 使用指定的 fillbyte 填充空位(默认使用 ASCII 空格符)。 对于 bytes 对象,如果 width 小于等于 len(s) 则返回原序列的副本。

备注

此方法的 bytearray 版本 并非 原地操作 —— 它总是产生一个新对象,即便没有做任何改变。

  • bytes.rsplit(sep=None, maxsplit=-1)
  • bytearray.rsplit(sep=None, maxsplit=-1)
  • 将二进制序列拆分为相同类型的子序列,使用 sep 作为分隔符。 如果给出了 maxsplit,则最多进行 maxsplit 次拆分,从 最右边 开始。 如果 sep 未指定或为 None,任何只包含 ASCII 空白符的子序列都会被作为分隔符。 除了从右边开始拆分,rsplit() 的其他行为都类似于下文所述的 split()
  • bytes.rstrip([chars])
  • bytearray.rstrip([chars])
  • 返回原序列的副本,移除指定的末尾字节。 chars 参数为指定要移除字节值集合的二进制序列 —— 这个名称表明此方法通常是用于 ASCII 字符。 如果省略或为 None,则 chars 参数默认移除 ASCII 空白符。 chars 参数并非指定单个后缀;而是会移除参数值的所有组合:
  1. >>> b' spacious '.rstrip()
  2. b' spacious'
  3. >>> b'mississippi'.rstrip(b'ipz')
  4. b'mississ'

要移除的二进制序列可以是任意 bytes-like object 。 要删除单个后缀字符串,而不是全部给定集合中的字符,请参见 str.removesuffix() 方法。 例如:

  1. >>> b'Monty Python'.rstrip(b' Python')
  2. b'M'
  3. >>> b'Monty Python'.removesuffix(b' Python')
  4. b'Monty'

备注

此方法的 bytearray 版本 并非 原地操作 —— 它总是产生一个新对象,即便没有做任何改变。

  • bytes.split(sep=None, maxsplit=-1)
  • bytearray.split(sep=None, maxsplit=-1)
  • 将二进制序列拆分为相同类型的子序列,使用 sep 作为分隔符。 如果给出了 maxsplit 且非负值,则最多进行 maxsplit 次拆分(因此,列表最多会有 maxsplit+1 个元素)。 如果 maxsplit 未指定或为 -1,则不限制拆分次数(进行所有可能的拆分)。

如果给出了 sep,则连续的分隔符不会被组合在一起而是会被视为分隔空子序列 (例如 b'1,,2'.split(b',') 将将返回 [b'1', b'', b'2'])。 sep 参数可能是由多个序列组成的单个分隔符。 使用指定的分隔符拆分一个空序列将返回 [b''][bytearray(b'')],具体取决于被拆分对象的类型。 sep 参数可以是任何 bytes-like object

例如:

  1. >>> b'1,2,3'.split(b',')
  2. [b'1', b'2', b'3']
  3. >>> b'1,2,3'.split(b',', maxsplit=1)
  4. [b'1', b'2,3']
  5. >>> b'1,2,,3,'.split(b',')
  6. [b'1', b'2', b'', b'3', b'']
  7. >>> b'1<>2<>3<4'.split(b'<>')
  8. [b'1', b'2', b'3<4']

如果 sep 未指定或为 None,则会应用另一种拆分算法:连续的 ASCII 空白符会被视为单个分隔符,其结果将不包含序列开头或末尾的空白符。 因此,在不指定分隔符的情况下对空序列或仅包含 ASCII 空白符的序列进行拆分将返回 []

例如:

  1. >>> b'1 2 3'.split()
  2. [b'1', b'2', b'3']
  3. >>> b'1 2 3'.split(maxsplit=1)
  4. [b'1', b'2 3']
  5. >>> b' 1 2 3 '.split()
  6. [b'1', b'2', b'3']
  • bytes.strip([chars])
  • bytearray.strip([chars])
  • 返回原序列的副本,移除指定的开头和末尾字节。 chars 参数为指定要移除字节值集合的二进制序列 —— 这个名称表明此方法通常是用于 ASCII 字符。 如果省略或为 None,则 chars 参数默认移除 ASCII 空白符。 chars 参数并非指定单个前缀或后缀;而是会移除参数值的所有组合:
  1. >>> b' spacious '.strip()
  2. b'spacious'
  3. >>> b'www.example.com'.strip(b'cmowz.')
  4. b'example'

要移除的字节值二进制序列可以是任意 bytes-like object

备注

此方法的 bytearray 版本 并非 原地操作 —— 它总是产生一个新对象,即便没有做任何改变。

以下 bytes 和 bytearray 对象的方法会假定使用兼容 ASCII 的二进制格式,不应当被应用于任意二进制数据。 请注意本小节中所有的 bytearray 方法都 不是 原地执行操作,而是会产生新的对象。

  • bytes.capitalize()
  • bytearray.capitalize()
  • 返回原序列的副本,其中每个字节将都将被解读为一个 ASCII 字符,并且第一个字节的字符大写而其余的小写。 非 ASCII 字节值将保持原样不变。

备注

此方法的 bytearray 版本 并非 原地操作 —— 它总是产生一个新对象,即便没有做任何改变。

  • bytes.expandtabs(tabsize=8)
  • bytearray.expandtabs(tabsize=8)
  • 返回序列的副本,其中所有的 ASCII 制表符会由一个或多个 ASCII 空格替换,具体取决于当前列位置和给定的制表符宽度。 每 tabsize 个字节设为一个制表位(默认值 8 时设定的制表位在列 0, 8, 16 依次类推)。 要展开序列,当前列位置将被设为零并逐一检查序列中的每个字节。 如果字节为 ASCII 制表符 (b'\t'),则并在结果中插入一个或多个空格符,直到当前列等于下一个制表位。 (制表符本身不会被复制。) 如果当前字节为 ASCII 换行符 (b'\n') 或回车符 (b'\r'),它会被复制并将当前列重设为零。 任何其他字节会被不加修改地复制并将当前列加一,不论该字节值在被打印时会如何显示:
  1. >>> b'01\t012\t0123\t01234'.expandtabs()
  2. b'01 012 0123 01234'
  3. >>> b'01\t012\t0123\t01234'.expandtabs(4)
  4. b'01 012 0123 01234'

备注

此方法的 bytearray 版本 并非 原地操作 —— 它总是产生一个新对象,即便没有做任何改变。

  • bytes.isalnum()
  • bytearray.isalnum()
  • 如果序列中所有字节都是字母类 ASCII 字符或 ASCII 十进制数码并且序列非空则返回 True ,否则返回 False 。 字母类 ASCII 字符就是字节值包含在序列 b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' 中的字符。 ASCII 十进制数码就是字节值包含在序列 b'0123456789' 中的字符。

例如:

  1. >>> b'ABCabc1'.isalnum()
  2. True
  3. >>> b'ABC abc1'.isalnum()
  4. False
  • bytes.isalpha()
  • bytearray.isalpha()
  • 如果序列中所有字节都是字母类 ASCII 字符并且序列不非空则返回 True ,否则返回 False 。 字母类 ASCII 字符就是字节值包含在序列 b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' 中的字符。

例如:

  1. >>> b'ABCabc'.isalpha()
  2. True
  3. >>> b'ABCabc1'.isalpha()
  4. False
  • bytes.isascii()
  • bytearray.isascii()
  • 如果序列为空或序列中所有字节都是 ASCII 字节则返回 True ,否则返回 False 。 ASCII 字节的取值范围是 0-0x7F。

Added in version 3.7.

  • bytes.isdigit()
  • bytearray.isdigit()
  • 如果序列中所有字节都是 ASCII 十进制数码并且序列非空则返回 True ,否则返回 False 。 ASCII 十进制数码就是字节值包含在序列 b'0123456789' 中的字符。

例如:

  1. >>> b'1234'.isdigit()
  2. True
  3. >>> b'1.23'.isdigit()
  4. False
  • bytes.islower()
  • bytearray.islower()
  • 如果序列中至少有一个小写的 ASCII 字符并且没有大写的 ASCII 字符则返回 True ,否则返回 False

例如:

  1. >>> b'hello world'.islower()
  2. True
  3. >>> b'Hello world'.islower()
  4. False

小写 ASCII 字符就是字节值包含在序列 b'abcdefghijklmnopqrstuvwxyz' 中的字符。 大写 ASCII 字符就是字节值包含在序列 b'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 中的字符。

  • bytes.isspace()
  • bytearray.isspace()
  • 如果序列中所有字节都是 ASCII 空白符并且序列非空则返回 True ,否则返回 False 。 ASCII 空白符就是字节值包含在序列 b' \t\n\r\x0b\f' (空格, 制表, 换行, 回车, 垂直制表, 进纸) 中的字符。
  • bytes.istitle()
  • bytearray.istitle()
  • 如果序列为 ASCII 标题大小写形式并且序列非空则返回 True ,否则返回 False 。 请参阅 bytes.title() 了解有关“标题大小写”的详细定义。

例如:

  1. >>> b'Hello World'.istitle()
  2. True
  3. >>> b'Hello world'.istitle()
  4. False
  • bytes.isupper()
  • bytearray.isupper()
  • 如果序列中至少有一个大写字母 ASCII 字符并且没有小写 ASCII 字符则返回 True ,否则返回 False

例如:

  1. >>> b'HELLO WORLD'.isupper()
  2. True
  3. >>> b'Hello world'.isupper()
  4. False

小写 ASCII 字符就是字节值包含在序列 b'abcdefghijklmnopqrstuvwxyz' 中的字符。 大写 ASCII 字符就是字节值包含在序列 b'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 中的字符。

  • bytes.lower()
  • bytearray.lower()
  • 返回原序列的副本,其所有大写 ASCII 字符均转换为对应的小写形式。

例如:

  1. >>> b'Hello World'.lower()
  2. b'hello world'

小写 ASCII 字符就是字节值包含在序列 b'abcdefghijklmnopqrstuvwxyz' 中的字符。 大写 ASCII 字符就是字节值包含在序列 b'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 中的字符。

备注

此方法的 bytearray 版本 并非 原地操作 —— 它总是产生一个新对象,即便没有做任何改变。

  • bytes.splitlines(keepends=False)
  • bytearray.splitlines(keepends=False)
  • 返回由原二进制序列中各行组成的列表,在 ASCII 行边界符的位置拆分。 此方法使用 universal newlines 方式来分行。 结果列表中不包含换行符,除非给出了 keepends 且为真值。

例如:

  1. >>> b'ab c\n\nde fg\rkl\r\n'.splitlines()
  2. [b'ab c', b'', b'de fg', b'kl']
  3. >>> b'ab c\n\nde fg\rkl\r\n'.splitlines(keepends=True)
  4. [b'ab c\n', b'\n', b'de fg\r', b'kl\r\n']

不同于 split(),当给出了分隔符 sep 时,对于空字符串此方法将返回一个空列表,而末尾的换行不会令结果中增加额外的行:

  1. >>> b"".split(b'\n'), b"Two lines\n".split(b'\n')
  2. ([b''], [b'Two lines', b''])
  3. >>> b"".splitlines(), b"One line\n".splitlines()
  4. ([], [b'One line'])
  • bytes.swapcase()
  • bytearray.swapcase()
  • 返回原序列的副本,其所有小写 ASCII 字符均转换为对应的大写形式,反之亦反。

例如:

  1. >>> b'Hello World'.swapcase()
  2. b'hELLO wORLD'

小写 ASCII 字符就是字节值包含在序列 b'abcdefghijklmnopqrstuvwxyz' 中的字符。 大写 ASCII 字符就是字节值包含在序列 b'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 中的字符。

不同于 str.swapcase(),在二进制版本下 bin.swapcase().swapcase() == bin 始终成立。 大小写转换在 ASCII 中是对称的,即使其对于任意 Unicode 码位来说并不总是成立。

备注

此方法的 bytearray 版本 并非 原地操作 —— 它总是产生一个新对象,即便没有做任何改变。

  • bytes.title()
  • bytearray.title()
  • 返回原二进制序列的标题版本,其中每个单词以一个大写 ASCII 字符为开头,其余字母为小写。 不区别大小写的字节值将保持原样不变。

例如:

  1. >>> b'Hello world'.title()
  2. b'Hello World'

小写 ASCII 字符就是字节值包含在序列 b'abcdefghijklmnopqrstuvwxyz' 中的字符。 大写 ASCII 字符就是字节值包含在序列 b'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 中的字符。 所有其他字节值都不区分大小写。

该算法使用一种简单的与语言无关的定义,将连续的字母组合视为单词。 该定义在多数情况下都很有效,但它也意味着代表缩写形式与所有格的撇号也会成为单词边界,这可能导致不希望的结果:

  1. >>> b"they're bill's friends from the UK".title()
  2. b"They'Re Bill'S Friends From The Uk"

可以使用正则表达式来构建针对撇号的特别处理:

  1. >>> import re
  2. >>> def titlecase(s):
  3. ... return re.sub(rb"[A-Za-z]+('[A-Za-z]+)?",
  4. ... lambda mo: mo.group(0)[0:1].upper() +
  5. ... mo.group(0)[1:].lower(),
  6. ... s)
  7. ...
  8. >>> titlecase(b"they're bill's friends.")
  9. b"They're Bill's Friends."

备注

此方法的 bytearray 版本 并非 原地操作 —— 它总是产生一个新对象,即便没有做任何改变。

  • bytes.upper()
  • bytearray.upper()
  • 返回原序列的副本,其所有小写 ASCII 字符均转换为对应的大写形式。

例如:

  1. >>> b'Hello World'.upper()
  2. b'HELLO WORLD'

小写 ASCII 字符就是字节值包含在序列 b'abcdefghijklmnopqrstuvwxyz' 中的字符。 大写 ASCII 字符就是字节值包含在序列 b'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 中的字符。

备注

此方法的 bytearray 版本 并非 原地操作 —— 它总是产生一个新对象,即便没有做任何改变。

  • bytes.zfill(width)
  • bytearray.zfill(width)
  • 返回原序列的副本,在左边填充 b'0' 数码使序列长度为 width。 正负值前缀 (b'+'/ b'-') 的处理方式是在正负符号 之后 填充而非在之前。 对于 bytes 对象,如果 width 小于等于 len(seq) 则返回原序列。

例如:

  1. >>> b"42".zfill(5)
  2. b'00042'
  3. >>> b"-42".zfill(5)
  4. b'-0042'

备注

此方法的 bytearray 版本 并非 原地操作 —— 它总是产生一个新对象,即便没有做任何改变。