以下部分描述了解释器中内置的标准类型。

主要内置类型有数字、序列、映射、类、实例和异常。

有些多项集类是可变的。 它们用于添加、移除或重排其成员的方法将原地执行,并不返回特定的项,绝对不会返回多项集实例自身而是返回 None

有些操作受多种对象类型的支持;特别地,实际上所有对象都可以比较是否相等、检测逻辑值,以及转换为字符串(使用 repr() 函数或略有差异的 str() 函数)。 后一个函数是在对象由 print() 函数输出时被隐式地调用的。

逻辑值检测

任何对象都可以进行逻辑值的检测,以便在 if while 作为条件或是作为下文所述布尔运算的操作数来使用。

一个对象在默认情况下均被视为真值,除非当该对象被调用时其所属类定义了 __bool__() 方法且返回 False 或是定义了 __len__() 方法且返回零。 1 下面基本完整地列出了会被视为假值的内置对象:

  • 被定义为假值的常量: None False

  • 任何数值类型的零: 0 , 0.0 , 0j , Decimal(0) , Fraction(0, 1)

  • 空的序列和多项集: '' , () , [] , {} , set() , range(0)

  • 产生布尔值结果的运算和内置函数总是返回 0 False 作为假值, 1 True 作为真值,除非另行说明。 (重要例外:布尔运算 or and 总是返回其中一个操作数。)

    布尔运算 --- and , or , not

    这些属于布尔运算,按优先级升序排列:

    比较运算

    在 Python 中有八种比较运算符。 它们的优先级相同(比布尔运算的优先级高)。 比较运算可以任意串连;例如, x < y <= z 等价于 x < y and y <= z ,前者的不同之处在于 y 只被求值一次(但在两种情况下当 x < y 结果为假值时 z 都不会被求值)。

    此表格汇总了比较运算:

    除不同的数字类型外,不同类型的对象不能进行相等比较。 == 运算符总有定义,但对于某些对象类型(例如,类对象),它等于 is 。其他 < <= > >= 运算符仅在有意义的地方定义。例如,当参与比较的参数之一为复数时,它们会抛出 TypeError 异常。

    具有不同标识的类的实例比较结果通常为不相等,除非类定义了 __eq__() 方法。

    一个类实例不能与相同类或的其他实例或其他类型的对象进行排序,除非该类定义了足够多的方法,包括 __lt__() , __le__() , __gt__() 以及 __ge__() (而如果你想实现常规意义上的比较操作,通常只要有 __lt__() __eq__() 就可以了)。

    is is not 运算符无法自定义;并且它们可以被应用于任意两个对象而不会引发异常。

    还有两种具有相同语法优先级的运算 in not in ,它们被 iterable 或实现了 __contains__() 方法的类型所支持。

    数字类型 --- int , float , complex

    存在三种不同的数字类型: 整数 , 浮点数 复数 。 此外,布尔值属于整数的子类型。 整数具有无限的精度。 浮点数通常使用 C 中的 double 来实现;有关你的程序运行所在机器上浮点数的精度和内部表示法可在 sys.float_info 中查看。 复数包含实部和虚部,分别以一个浮点数表示。 要从一个复数 z 中提取这两个部分,可使用 z.real z.imag 。 (标准库包含附加的数字类型,如表示有理数的 fractions.Fraction 以及以用户定制精度表示浮点数的 decimal.Decimal 。)

    数字是由数字字面值或内置函数与运算符的结果来创建的。 不带修饰的整数字面值(包括十六进制、八进制和二进制数)会生成整数。 包含小数点或幂运算符的数字字面值会生成浮点数。 在数字字面值末尾加上 'j' 'J' 会生成虚数(实部为零的复数),你可以将其与整数或浮点数相加来得到具有实部和虚部的复数。

    Python 完全支持混合运算:当一个二元算术运算符的操作数有不同数值类型时,"较窄"类型的操作数会拓宽到另一个操作数的类型,其中整数比浮点数窄,浮点数比复数窄。不同类型的数字之间的比较,同比较这些数字的精确值一样。 2

    构造函数 int() float() complex() 可以用来构造特定类型的数字。

    所有数字类型(复数除外)都支持下列运算(有关运算优先级,请参阅: 运算符优先级 ):

  • 也称为整数除法。 结果值是一个整数,但结果的类型不一定是 int。 运算结果总是向负无穷的方向舍入: 1//2 0 , (-1)//2 -1 , 1//(-2) -1 (-1)//(-2) 0

  • 不可用于复数。 而应在适当条件下使用 abs() 转换为浮点数。

  • 从浮点数转换为整数会被舍入或是像在 C 语言中一样被截断;请参阅 math.floor() math.ceil() 函数查看转换的完整定义。

  • float 也接受字符串 "nan" 和附带可选前缀 "+" 或 "-" 的 "inf" 分别表示非数字 (NaN) 以及正或负无穷。

  • Python 将 pow(0, 0) 0 ** 0 定义为 1 ,这是编程语言的普遍做法。

  • 接受的数字字面值包括数码 0 9 或任何等效的 Unicode 字符(具有 Nd 特征属性的代码点)。

    请参阅 http://www.unicode.org/Public/12.1.0/ucd/extracted/DerivedNumericType.txt 查看具有 Nd 特征属性的代码点的完整列表。

    所有 numbers.Real 类型 ( int float ) 还包括下列运算:

    整数类型的按位运算

    按位运算只对整数有意义。 计算按位运算的结果,就相当于使用无穷多个二进制符号位对二的补码执行操作。

    二进制按位运算的优先级全都低于数字运算,但又高于比较运算;一元运算 ~ 具有与其他一元算术运算 ( + and - ) 相同的优先级。

    此表格是以优先级升序排序的按位运算列表:

    更准确地说,如果 x 非零,则 x.bit_length() 是使得 2**(k-1) <= abs(x) < 2**k 的唯一正整数 k 。 同样地,当 abs(x) 小到足以具有正确的舍入对数时,则 k = 1 + int(log(abs(x), 2)) 。 如果 x 为零,则 x.bit_length() 返回 0

    def bit_length(self):
        s = bin(self)       # binary representation:  bin(-37) --> '-0b100101'
        s = s.lstrip('-0b') # remove leading zeros and minus sign
        return len(s)       # len('100101') --> 6
    

    3.1 新版功能.

    int.to_bytes(length, byteorder, *, signed=False)

    返回表示一个整数的字节数组。

    >>> (1024).to_bytes(2, byteorder='big')
    b'\x04\x00'
    >>> (1024).to_bytes(10, byteorder='big')
    b'\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00'
    >>> (-1024).to_bytes(10, byteorder='big', signed=True)
    b'\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00'
    >>> x = 1000
    >>> x.to_bytes((x.bit_length() + 7) // 8, byteorder='little')
    b'\xe8\x03'
    

    整数会使用 length 个字节来表示。 如果整数不能用给定的字节数来表示则会引发 OverflowError

    byteorder 参数确定用于表示整数的字节顺序。 如果 byteorder"big",则最高位字节放在字节数组的开头。 如果 byteorder"little",则最高位字节放在字节数组的末尾。 要请求主机系统上的原生字节顺序,请使用 sys.byteorder 作为字节顺序值。

    signed 参数确定是否使用二的补码来表示整数。 如果 signedFalse 并且给出的是负整数,则会引发 OverflowErrorsigned 的默认值为 False

    3.2 新版功能.

    classmethod int.from_bytes(bytes, byteorder, *, signed=False)

    返回由给定字节数组所表示的整数。

    >>> int.from_bytes(b'\x00\x10', byteorder='big')
    >>> int.from_bytes(b'\x00\x10', byteorder='little')
    >>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=True)
    -1024
    >>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=False)
    64512
    >>> int.from_bytes([255, 0, 0], byteorder='big')
    16711680
    

    bytes 参数必须为一个 bytes-like object 或是生成字节的可迭代对象。

    byteorder 参数确定用于表示整数的字节顺序。 如果 byteorder"big",则最高位字节放在字节数组的开头。 如果 byteorder"little",则最高位字节放在字节数组的末尾。 要请求主机系统上的原生字节顺序,请使用 sys.byteorder 作为字节顺序值。

    signed 参数指明是否使用二的补码来表示整数。

    3.2 新版功能.

    float.is_integer()

    如果 float 实例可用有限位整数表示则返回 True,否则返回 False:

    >>> (-2.0).is_integer()
    >>> (3.2).is_integer()
    False
    

    两个方法均支持与十六进制数字符串之间的转换。 由于 Python 浮点数在内部存储为二进制数,因此浮点数与 十进制数 字符串之间的转换往往会导致微小的舍入错误。 而十六进制数字符串却允许精确地表示和描述浮点数。 这在进行调试和数值工作时非常有用。

    float.hex()

    以十六进制字符串的形式返回一个浮点数表示。 对于有限浮点数,这种表示法将总是包含前导的 0x 和尾随的 p 加指数。

    请注意 float.hex() 是实例方法,而 float.fromhex() 是类方法。

    十六进制字符串采用的形式为:

    [sign] ['0x'] integer ['.' fraction] ['p' exponent]
    

    可选的 sign 可以是 +-integerfraction 是十六进制数码组成的字符串,exponent 是带有可选前导符的十进制整数。 大小写没有影响,在 integer 或 fraction 中必须至少有一个十六进制数码。 此语法类似于 C99 标准的 6.4.4.2 小节中所描述的语法,也是 Java 1.5 以上所使用的语法。 特别地,float.hex() 的输出可以用作 C 或 Java 代码中的十六进制浮点数字面值,而由 C 的 %a 格式字符或 Java 的 Double.toHexString 所生成的十六进制数字符串由为 float.fromhex() 所接受。

    请注意 exponent 是十进制数而非十六进制数,它给出要与系数相乘的 2 的幂次。 例如,十六进制数字符串 0x3.a7p10 表示浮点数 (3 + 10./16 + 7./16**2) * 2.0**103740.0:

    >>> float.fromhex('0x3.a7p10')
    3740.0
    

    3740.0 应用反向转换会得到另一个代表相同数值的十六进制数字符串:

    >>> float.hex(3740.0)
    '0x1.d380000000000p+11'
    

    数字类型的哈希运算

    对于可能为不同类型的数字 xy,要求 x == y 时必定 hash(x) == hash(y) (详情参见 __hash__() 方法的文档)。 为了便于在各种数字类型 (包括 int, float, decimal.Decimalfractions.Fraction) 上实现并保证效率,Python 对数字类型的哈希运算是基于为任意有理数定义统一的数学函数,因此该运算对 intfractions.Fraction 的全部实例,以及 floatdecimal.Decimal 的全部有限实例均可用。 从本质上说,此函数是通过以一个固定质数 P 进行 P 降模给出的。 P 的值在 Python 中可以 sys.hash_infomodulus 属性的形式被访问。

    CPython implementation detail: 目前所用的质数设定,在 C long 为 32 位的机器上 P = 2**31 - 1 而在 C long 为 64 位的机器上 P = 2**61 - 1

    详细规则如下所述:

  • 如果 x = m / n 是一个非负的有理数且 n 不可被 P 整除,则定义 hash(x)m * invmod(n, P) % P,其中 invmod(n, P) 是对 nP 取反。

  • 如果 x = m / n 是一个非负的有理数且 n 可被 P 整除(但 m 不能)则 n 不能对 P 降模,以上规则不适用;在此情况下则定义 hash(x) 为常数值 sys.hash_info.inf

  • 如果 x = m / n 是一个负的有理数则定义 hash(x)-hash(-x)。 如果结果哈希值为 -1 则将其替换为 -2

  • 特定值 sys.hash_info.inf, -sys.hash_info.infsys.hash_info.nan 被用作正无穷、负无穷和空值(所分别对应的)哈希值。 (所有可哈希的空值都具有相同的哈希值。)

  • 对于一个 complexz,会通过计算 hash(z.real) + sys.hash_info.imag * hash(z.imag) 将实部和虚部的哈希值结合起来,并进行降模 2**sys.hash_info.width 以使其处于 range(-2**(sys.hash_info.width - 1), 2**(sys.hash_info.width - 1)) 范围之内。 同样地,如果结果为 -1 则将其替换为 -2

  • 为了阐明上述规则,这里有一些等价于内置哈希算法的 Python 代码示例,可用于计算有理数、floatcomplex 的哈希值:

    import sys, math
    def hash_fraction(m, n):
        """Compute the hash of a rational number m / n.
        Assumes m and n are integers, with n positive.
        Equivalent to hash(fractions.Fraction(m, n)).
        P = sys.hash_info.modulus
        # Remove common factors of P.  (Unnecessary if m and n already coprime.)
        while m % P == n % P == 0:
            m, n = m // P, n // P
        if n % P == 0:
            hash_value = sys.hash_info.inf
        else:
            # Fermat's Little Theorem: pow(n, P-1, P) is 1, so
            # pow(n, P-2, P) gives the inverse of n modulo P.
            hash_value = (abs(m) % P) * pow(n, P - 2, P) % P
        if m < 0:
            hash_value = -hash_value
        if hash_value == -1:
            hash_value = -2
        return hash_value
    def hash_float(x):
        """Compute the hash of a float x."""
        if math.isnan(x):
            return sys.hash_info.nan
        elif math.isinf(x):
            return sys.hash_info.inf if x > 0 else -sys.hash_info.inf
        else:
            return hash_fraction(*x.as_integer_ratio())
    def hash_complex(z):
        """Compute the hash of a complex number z."""
        hash_value = hash_float(z.real) + sys.hash_info.imag * hash_float(z.imag)
        # do a signed reduction modulo 2**sys.hash_info.width
        M = 2**(sys.hash_info.width - 1)
        hash_value = (hash_value & (M - 1)) - (hash_value & M)
        if hash_value == -1:
            hash_value = -2
        return hash_value
    

    迭代器类型

    Python 支持在容器中进行迭代的概念。 这是通过使用两个单独方法来实现的;它们被用于允许用户自定义类对迭代的支持。 将在下文中详细描述的序列总是支持迭代方法。

    容器对象要提供迭代支持,必须定义一个方法:

    container.__iter__()

    返回一个迭代器对象。 该对象需要支持下文所述的迭代器协议。 如果容器支持不同的迭代类型,则可以提供额外的方法来专门地请求不同迭代类型的迭代器。 (支持多种迭代形式的对象的例子有同时支持广度优先和深度优先遍历的树结构。) 此方法对应于 Python/C API 中 Python 对象类型结构体的 tp_iter 槽位。

    迭代器对象自身需要支持以下两个方法,它们共同组成了 迭代器协议:

    iterator.__iter__()

    返回迭代器对象本身。 这是同时允许容器和迭代器配合 forin 语句使用所必须的。 此方法对应于 Python/C API 中 Python 对象类型结构体的 tp_iter 槽位。

    iterator.__next__()

    从容器中返回下一项。 如果已经没有项可返回,则会引发 StopIteration 异常。 此方法对应于 Python/C API 中 Python 对象类型结构体的 tp_iternext 槽位。

    Python 定义了几种迭代器对象以支持对一般和特定序列类型、字典和其他更特别的形式进行迭代。 除了迭代器协议的实现,特定类型的其他性质对迭代操作来说都不重要。

    一旦迭代器的 __next__() 方法引发了 StopIteration,它必须一直对后续调用引发同样的异常。 不遵循此行为特性的实现将无法正常使用。

    生成器类型

    Python 的 generator 提供了一种实现迭代器协议的便捷方式。 如果容器对象 __iter__() 方法被实现为一个生成器,它将自动返回一个迭代器对象(从技术上说是一个生成器对象),该对象提供 __iter__()__next__() 方法。 有关生成器的更多信息可以参阅 yield 表达式的文档

    序列类型 --- list, tuple, range

    有三种基本序列类型:list, tuple 和 range 对象。 为处理 二进制数据文本字符串 而特别定制的附加序列类型会在专门的小节中描述。

    通用序列操作

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

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

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

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

  • 虽然 innot in 操作在通常情况下仅被用于简单的成员检测,某些专门化序列 (例如 str, bytesbytearray) 也使用它们进行子序列检测:

    >>> "gg" in "eggs"
    
  • 小于 0n 值会被当作 0 来处理 (生成一个与 s 同类型的空序列)。 请注意序列 s 中的项并不会被拷贝;它们会被多次引用。 这一点经常会令 Python 编程新手感到困扰;例如:

    >>> lists = [[]] * 3
    >>> lists
    [[], [], []]
    >>> lists[0].append(3)
    >>> lists
    [[3], [3], [3]]
    

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 不可变序列类型

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

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

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

    可变序列类型

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

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

  • t 必须与它所替换的切片具有相同的长度。

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

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

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

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

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

    有关排序示例和简要排序教程,请参阅 排序指南

    CPython implementation detail: 在一个列表被排序期间,尝试改变甚至进行检测也会造成未定义的影响。 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 对象的例子:

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

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

    start

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

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

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

    >>> r = range(0, 20, 2)
    range(0, 20, 2)
    >>> 11 in r
    False
    >>> 10 in r
    >>> r.index(10)
    >>> r[5]
    >>> r[:5]
    range(0, 10, 2)
    >>> r[-1]
    

    使用 ==!= 检测 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 对象所定义的值序列来进行比较(而不是根据对象的标识)。

    3.3 新版功能: start, stopstep 属性。

  • linspace recipe 演示了如何实现一个延迟求值版本的适合浮点数应用的 range 对象。

  • 文本序列类型 --- 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() 的行为取决于 encodingerrors 是否有给出,具体见下。

    如果 encodingerrors 均未给出,str(object) 返回 object.__str__(),这是 object 的“非正式”或格式良好的字符串表示。 对于字符串对象,这是该字符串本身。 如果 object 没有 __str__() 方法,则 str() 将回退为返回 repr(object)

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

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

    >>> str(b'Zoot!')
    "b'Zoot!'"
    

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

    字符串的方法

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

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

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

    str.capitalize()

    返回原字符串的副本,其首个字符大写,其余为小写。

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

    str.casefold()

    返回原字符串消除大小写的副本。 消除大小写的字符串可用于忽略大小写的匹配。

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

    消除大小写算法的描述请参见 Unicode 标准的 3.13 节。

    3.3 新版功能.

    str.encode(encoding="utf-8", errors="strict")

    返回原字符串编码为字节串对象的版本。 默认编码为 'utf-8'。 可以给出 errors 来设置不同的错误处理方案。 errors 的默认值为 'strict',表示编码错误会引发 UnicodeError。 其他可用的值为 'ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace' 以及任何其他通过 codecs.register_error() 注册的值,请参阅 错误处理方案 小节。 要查看可用的编码列表,请参阅 标准编码 小节。

    在 3.1 版更改: 加入了对关键字参数的支持。

    str.expandtabs(tabsize=8)

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

    >>> '01\t012\t0123\t01234'.expandtabs()
    '01      012     0123    01234'
    >>> '01\t012\t0123\t01234'.expandtabs(4)
    '01  012 0123    01234'
    str.find(sub[, start[, end]])
    

    返回子字符串 subs[start:end] 切片内被找到的最小索引。 可选参数 startend 会被解读为切片表示法。 如果 sub 未被找到则返回 -1

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

    >>> 'Py' in 'Python'
    str.format(*args, **kwargs)
    

    执行字符串格式化操作。 调用此方法的字符串可以包含字符串字面值或者以花括号 {} 括起来的替换域。 每个替换域可以包含一个位置参数的数字索引,或者一个关键字参数的名称。 返回的字符串副本中每个替换域都会被替换为对应参数的字符串值。

    >>> "The sum of 1 + 2 is {0}".format(1+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 的子类的情况:

    >>> class Default(dict):
    ...     def __missing__(self, key):
    ...         return key
    >>> '{name} was born in {country}'.format_map(Default(name='Guido'))
    'Guido was born in country'
    

    3.2 新版功能.

    str.isascii()

    如果字符串为空或字符串中的所有字符都是 ASCII ,返回 True ,否则返回 False 。ASCII 字符的码点范围是 U+0000-U+007F 。

    3.7 新版功能.

    str.isidentifier()

    如果字符串是有效的标识符,返回 True ,依据语言定义, 标识符和关键字 节。

    调用 keyword.iskeyword() 来检测字符串 s 是否为保留标识符,例如 defclass

    >>> from keyword import iskeyword
    >>> 'hello'.isidentifier(), iskeyword('hello')
    True, False
    >>> 'def'.isidentifier(), iskeyword('def')
    True, True
    str.lstrip([chars])
    

    返回原字符串的副本,移除其中的前导字符。 chars 参数为指定要移除字符的字符串。 如果省略或为 None,则 chars 参数默认移除空白符。 实际上 chars 参数并非指定单个前缀;而是会移除参数值的所有组合:

    >>> '   spacious   '.lstrip()
    'spacious   '
    >>> 'www.example.com'.lstrip('cmowz.')
    'example.com'
    static str.maketrans(x[, y[, z]])
    

    此静态方法返回一个可供 str.translate() 使用的转换对照表。

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

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

    str.rstrip([chars])

    返回原字符串的副本,移除其中的末尾字符。 chars 参数为指定要移除字符的字符串。 如果省略或为 None,则 chars 参数默认移除空白符。 实际上 chars 参数并非指定单个后缀;而是会移除参数值的所有组合:

    >>> '   spacious   '.rstrip()
    '   spacious'
    >>> 'mississippi'.rstrip('ipz')
    'mississ'
    str.split(sep=None, maxsplit=-1)
    

    返回一个由字符串内单词组成的列表,使用 sep 作为分隔字符串。 如果给出了 maxsplit,则最多进行 maxsplit 次拆分(因此,列表最多会有 maxsplit+1 个元素)。 如果 maxsplit 未指定或为 -1,则不限制拆分次数(进行所有可能的拆分)。

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

    >>> '1,2,3'.split(',')
    ['1', '2', '3']
    >>> '1,2,3'.split(',', maxsplit=1)
    ['1', '2,3']
    >>> '1,2,,3,'.split(',')
    ['1', '2', '', '3', '']
    

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

    >>> '1 2 3'.split()
    ['1', '2', '3']
    >>> '1 2 3'.split(maxsplit=1)
    ['1', '2 3']
    >>> '   1   2   3   '.split()
    ['1', '2', '3']
    str.splitlines([keepends])
    

    返回由原字符串中各行组成的列表,在行边界的位置拆分。 结果列表中不包含行边界,除非给出了 keepends 且为真值。

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

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

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

    >>> "".splitlines()
    >>> "One line\n".splitlines()
    ['One line']
    

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

    >>> ''.split('\n')
    >>> 'Two lines\n'.split('\n')
    ['Two lines', '']
    str.strip([chars])
    

    返回原字符串的副本,移除其中的前导和末尾字符。 chars 参数为指定要移除字符的字符串。 如果省略或为 None,则 chars 参数默认移除空白符。 实际上 chars 参数并非指定单个前缀或后缀;而是会移除参数值的所有组合:

    >>> '   spacious   '.strip()
    'spacious'
    >>> 'www.example.com'.strip('cmowz.')
    'example'
    

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

    >>> comment_string = '#....... Section 3.2.1 Issue #32 .......'
    >>> comment_string.strip('.#! ')
    'Section 3.2.1 Issue #32'
    

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

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

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

    >>> import re
    >>> def titlecase(s):
    ...     return re.sub(r"[A-Za-z]+('[A-Za-z]+)?",
    ...                   lambda mo: mo.group(0).capitalize(),
    ...                   s)
    >>> titlecase("they're bill's friends.")
    "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 节。

    str.zfill(width)

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

    >>> "42".zfill(5)
    '00042'
    >>> "-42".zfill(5)
    '-0042'
    

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

    字符串对象有一个独特的内置运算: % 运算符 (取模)。 这也被称为字符串 formattinginterpolation 运算符。 如果给定 format % values (其中 format 是字符串),format% 的转换规范将被 values 中的零个或多个元素替换。 其效果类似于在 C 语言中使用 sprintf()

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

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

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

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

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

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

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

  • 长度修饰符(可选)。

  • 转换类型。

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

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

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

    转换旗标为:

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

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

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

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

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

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

  • 如果精度为 N,输出将截短为 N 个字符。

  • 参见 PEP 237

  • 由于 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 空白符会被忽略。

    >>> bytes.fromhex('2Ef0 F1f2  ')
    b'.\xf0\xf1\xf2'
    

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

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

    hex([sep[, bytes_per_sep]])

    返回一个字符串对象,该对象包含实例中每个字节的两个十六进制数字。

    >>> b'\xf0\xf1\xf2'.hex()
    'f0f1f2'
    

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

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

    3.5 新版功能.

    在 3.8 版更改: bytes.hex() 现在支持可选的 sepbytes_per_sep 形参以在十六进制输出的字节之间插入分隔符。

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

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

    针对 Python 2.x 用户的说明:在 Python 2.x 系列中,允许 8 位字符串( 2.x 所提供的最接近内置二进制数据类型的对象)与 Unicode 字符串进行各种隐式转换。 这是为了实现向下兼容的变通做法,以适应 Python 最初只支持 8 位文本而 Unicode 文本是后来才被加入这一事实。 在 Python 3.x 中,这些隐式转换已被取消 —— 8 位二进制数据与 Unicode 文本间的转换必须显式地进行,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 空白符会被忽略。

    >>> bytearray.fromhex('2Ef0 F1f2  ')
    bytearray(b'.\xf0\xf1\xf2')
    

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

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

    hex([sep[, bytes_per_sep]])

    返回一个字符串对象,该对象包含实例中每个字节的两个十六进制数字。

    >>> bytearray(b'\xf0\xf1\xf2').hex()
    'f0f1f2'
    

    3.5 新版功能.

    在 3.8 版更改: bytes.hex() 相似, bytearray.hex() 现在支持可选的 sepbytes_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 对象作为其参数一样。 例如,你必须使用以下写法:

    a = "abc"
    b = a.
    
    
    
    
        
    replace("a", "f")
    
    a = b"abc"
    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] 范围内非重叠出现的次数。 可选参数 startend 会被解读为切片表示法。

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

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

    bytes.decode(encoding="utf-8", errors="strict") bytearray.decode(encoding="utf-8", errors="strict")

    返回从给定 bytes 解码出来的字符串。 默认编码为 'utf-8'。 可以给出 errors 来设置不同的错误处理方案。 errors 的默认值为 'strict',表示编码错误会引发 UnicodeError。 其他可用的值为 'ignore', 'replace' 以及任何其他通过 codecs.register_error() 注册的名称,请参阅 错误处理方案 小节。 要查看可用的编码列表,请参阅 标准编码 小节。

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

    在 3.1 版更改: 加入了对关键字参数的支持。

    bytes.endswith(suffix[, start[, end]]) bytearray.endswith(suffix[, start[, end]])

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

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

    bytes.find(sub[, start[, end]]) bytearray.find(sub[, start[, end]])

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

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

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

    >>> b'Py' in b'Python'
    bytes.index(sub[, start[, end]])
    bytearray.index(sub[, start[, end]])
    

    类似于 find(),但在找不到子序列时会引发 ValueError

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

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

    static bytearray.maketrans(from, to)

    此静态方法返回一个可用于 bytes.translate() 的转换对照表,它将把 from 中的每个字符映射为 to 中相同位置上的字符;fromto 必须都是 字节类对象 并且具有相同的长度。

    3.1 新版功能.

    bytearray.partition(sep)

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

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

    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] 当中。 可选参数 startend 会被解读为切片表示法。 如果未找到则返回 -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 范围内的整数作为子序列。

    bytearray.rpartition(sep)

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

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

    bytes.startswith(prefix[, start[, end]]) bytearray.startswith(prefix[, start[, end]])

    如果二进制数据以指定的 prefix 开头则返回 True,否则返回 Falseprefix 也可以为由多个供查找的前缀构成的元组。 如果有可选项 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:

    >>> b'read this short text'.translate(None, b'aeiou')
    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 版本 并非 原地操作 —— 它总是产生一个新对象,即便没有做任何改变。

    bytearray.ljust(width[, fillbyte])

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

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

    bytearray.lstrip([chars])

    返回原序列的副本,移除指定的前导字节。 chars 参数为指定要移除字节值集合的二进制序列 —— 这个名称表明此方法通常是用于 ASCII 字符。 如果省略或为 None,则 chars 参数默认移除 ASCII 空白符。 chars 参数并非指定单个前缀;而是会移除参数值的所有组合:

    >>> b'   spacious   '.lstrip()
    b'spacious   '
    >>> b'www.example.com'.lstrip(b'cmowz.')
    b'example.com'
    

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

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

    bytearray.rjust(width[, fillbyte])

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

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

    bytearray.rstrip([chars])

    返回原序列的副本,移除指定的末尾字节。 chars 参数为指定要移除字节值集合的二进制序列 —— 这个名称表明此方法通常是用于 ASCII 字符。 如果省略或为 None,则 chars 参数默认移除 ASCII 空白符。 chars 参数并非指定单个后缀;而是会移除参数值的所有组合:

    >>> b'   spacious   '.rstrip()
    b'   spacious'
    >>> b'mississippi'.rstrip(b'ipz')
    b'mississ'
    

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

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

    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'1<>2<>3'.split(b'<>') 将返回 [b'1', b'2', b'3'])。 使用指定的分隔符拆分空序列将返回 [b''][bytearray(b'')],具体取决于被拆分对象的类型。 sep 参数可以是任意 bytes-like object

    >>> b'1,2,3'.split(b',')
    [b'1', b'2', b'3']
    >>> b'1,2,3'.split(b',', maxsplit=1)
    [b'1', b'2,3']
    >>> b'1,2,,3,'.split(b',')
    [b'1', b'2', b'', b'3', b'']
    

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

    >>> b'1 2 3'.split()
    [b'1', b'2', b'3']
    >>> b'1 2 3'.split(maxsplit=1)
    [b'1', b'2 3']
    >>> b'   1   2   3   '.split()
    [b'1', b'2', b'3']
    bytearray.strip([chars])
    

    返回原序列的副本,移除指定的开头和末尾字节。 chars 参数为指定要移除字节值集合的二进制序列 —— 这个名称表明此方法通常是用于 ASCII 字符。 如果省略或为 None,则 chars 参数默认移除 ASCII 空白符。 chars 参数并非指定单个前缀或后缀;而是会移除参数值的所有组合:

    >>> b'   spacious   '.strip()
    b'spacious'
    >>> b'www.example.com'.strip(b'cmowz.')
    b'example'
    

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

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

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

    bytes.capitalize() bytearray.capitalize()

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

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

    bytearray.expandtabs(tabsize=8)

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

    >>> b'01\t012\t0123\t01234'.expandtabs()
    b'01      012     0123    01234'
    >>> b'01\t012\t0123\t01234'.expandtabs(4)
    b'01  012 0123    01234'
    

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

    bytearray.isalnum()

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

    >>> b'ABCabc1'.isalnum()
    >>> b'ABC abc1'.isalnum()
    False
    bytearray.isalpha()
    

    如果序列中所有字节都是字母类 ASCII 字符并且序列不非空则返回 True ,否则返回 False 。 字母类 ASCII 字符就是字节值包含在序列 b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' 中的字符。

    >>> b'ABCabc'.isalpha()
    >>> b'ABCabc1'.isalpha()
    False
    bytearray.isascii()
    

    如果序列为空或序列中所有字节都是 ASCII 字节则返回

  •