Python标准类型

以下是 Python 内置的标准类型,包括None、NotImplemented、 Ellipsis、 numbers.Number、numbers.Integral、序列等。扩展模块可以使用 C、Java 或其他语言编写,以定义更多的类型。未来版本的 Python 可能会增加更多的类型,例如有理数和高效存储的整型数组等,但这些新类型通常通过标准库提供。

一、None

None类型只有一种取值,是一个具有此值的单独对象,此对象通过内置名称 None 访问。在许多情况下它被用来表示空值,例如未显式指明返回值的函数将返回 None,逻辑值为假。

二、NotImplemented

NotImplemented类型是一个特殊的单例对象,它表示一个方法或运算符尚未实现。当一个方法或运算符没有明确地返回一个值时,可以返回NotImplemented。这通常用于表示一个操作应该由子类来实现。

在 3.9 版更改: 作为布尔值来解读 NotImplemented 已被弃用。 虽然它目前会被解读为真值,但将同时发出 DeprecationWarning。 它将在未来的 Python 版本中引发 TypeError。

三、Ellipsis

Ellipsis 是 Python 中的一个特殊常量,表示省略号。它只有一个值,即 ...。在需要表示一个长度未知的序列时,可以使用 Ellipsis。例如:

my_list = [1, 2, 3, ..., 100]

四、numbers.Number

此类对象由数字字面值创建,并会被作为算术运算符和算术内置函数的返回结果。注意数字对象是不可变的,一旦创建其值就不再改变。Python 中的数字当然非常类似数学中的数字,但也受限于计算机中的数字表示方法。

数字类的字符串表示形式,由 __repr__() 和 __str__() 算出,具有以下特征属性:

  • 它们是有效的数字字面值,当被传给它们的类构造器时,将会产生具有原数字值的对象;
  • 表示形式会在可能的情况下采用 10 进制;
  • 开头的零,除小数点前可能存在的单个零之外,将不会被显示;
  • 末尾的零,除小数点后可能存在的单个零之外,将不会被显示;
  • 正负号仅在当数字为负值时会被显示。

Python 区分整型数、浮点型数和复数:

1、numbers.Integral

此类对象表示数学中整数集合的成员 (包括正数和负数)。整型数可细分为两种类型:

  • 整型 (int)

此类对象表示任意大小的数字,仅受限于可用的内存 (包括虚拟内存)。在变换和掩码运算中会以二进制表示,负数会以 2 的补码表示,看起来像是符号位向左延伸补满空位。

  • 布尔型 (bool)

此类对象表示逻辑值 False 和 True。代表 False 和 True 值的两个对象是唯二的布尔对象。布尔类型是整型的子类型,两个布尔值在各种场合的行为分别类似于数值 0 和 1,例外情况只有在转换为字符串时分别返回字符串 "False" 或 "True"。

2、numbers.Real (float)

此类对象表示机器级的双精度浮点数。其所接受的取值范围和溢出处理将受制于底层的机器架构 (以及 C 或 Java 实现)。Python 不支持单精度浮点数;支持后者通常的理由是节省处理器和内存消耗,但这点节省相对于在 Python 中使用对象的开销来说太过微不足道,因此没有理由包含两种浮点数而令该语言变得复杂。

3、numbers.Complex (complex)

此类对象以一对机器级的双精度浮点数来表示复数值。有关浮点数的附带规则对其同样有效。一个复数值 z 的实部和虚部可通过只读属性 z.real 和 z.imag 来获取。

五、序列

此类对象表示以非负整数作为索引的有限有序集。内置函数 len() 可返回一个序列的条目数量。当一个序列的长度为 n 时,索引集包含数字 0, 1, ..., n-1。序列 a 的条目 i 可通过 a[i] 选择。

序列还支持切片: a[i:j] 选择索引号为 k 的所有条目,i <= k < j。当用作表达式时,序列的切片就是一个与序列类型相同的新序列。新序列的索引还是从 0 开始。

有些序列还支持带有第三个 "step" 形参的 "扩展切片": a[i:j:k] 选择 a 中索引号为 x 的所有条目,x = i + n*k, n >= 0 且 i <= x < j。

序列可根据其可变性来加以区分:

1、不可变序列

不可变序列类型的对象一旦创建就不能再改变。(如果对象包含对其他对象的引用,其中的可变对象就是可以改变的;但是,一个不可变对象所直接引用的对象集是不能改变的。)

以下类型属于不可变对象:

  • 字符串

字符串是由代表 Unicode 码位的值组成的序列。 取值范围在 U+0000 - U+10FFFF 之内的所有码位都可在字符串中使用。 Python 没有 char 类型;而是将字符串中的每个码位表示为一个长度为 1 的字符串对象。 内置函数 ord() 可将一个码位由字符串形式转换为取值范围在 0 - 10FFFF 之内的整数;chr() 可将一个取值范围在 0 - 10FFFF 之内的整数转换为长度为 1 的对应字符串对象。 str.encode() 可以使用给定的文本编码格式将 str 转换为 bytes,而 bytes.decode() 则可以被用来实现相反的解码操作。

  • 元组

一个元组中的条目可以是任意 Python 对象。包含两个或以上条目的元组由逗号分隔的表达式构成。只有一个条目的元组 ('单项元组') 可通过在表达式后加一个逗号来构成 (一个表达式本身不能创建为元组,因为圆括号要用来设置表达式分组)。一个空元组可通过一对内容为空的圆括号创建。

  • 字节串

字节串对象是不可变的数组。其中每个条目都是一个 8 位字节,以取值范围 0 <= x < 256 的整型数表示。字节串字面值 (例如 b'abc') 和内置的 bytes() 构造器可被用来创建字节串对象。字节串对象还可以通过 decode() 方法解码为字符串。

2、可变序列

可变序列在被创建后仍可被改变。下标和切片标注可被用作赋值和 del (删除) 语句的目标。

目前有两种内生可变序列类型:

  • 列表

列表中的条目可以是任意 Python 对象。列表由用方括号括起并由逗号分隔的多个表达式构成。(注意创建长度为 0 或 1 的列表无需使用特殊规则。)

  • 字节数组

字节数组对象属于可变数组。可以通过内置的 bytearray() 构造器来创建。除了是可变的 (因而也是不可哈希的),在其他方面字节数组提供的接口和功能都与不可变的 bytes 对象一致。

六、集合类型

此类对象表示由不重复且不可变对象组成的无序且有限的集合。因此它们不能通过下标来索引。但是它们可被迭代,也可用内置函数 len() 返回集合中的条目数。集合常见的用处是快速成员检测,去除序列中的重复项,以及进行交、并、差和对称差等数学运算。

对于集合元素所采用的不可变规则与字典的键相同。注意数字类型遵循正常的数字比较规则: 如果两个数字相等 (例如 1 和 1.0),则同一集合中只能包含其中一个。

目前有两种内生集合类型:

1、集合

此类对象表示可变集合。它们可通过内置的 set() 构造器创建,并且创建之后可以通过方法进行修改,例如 add()。

2、冻结集合

此类对象表示不可变集合。它们可通过内置的 frozenset() 构造器创建。由于 frozenset 对象不可变且 hashable,它可以被用作另一个集合的元素或是字典的键。

七、映射

此类对象表示由任意索引集合所索引的对象的集合。通过下标 a[k] 可在映射 a 中选择索引为 k 的条目;这可以在表达式中使用,也可作为赋值或 del 语句的目标。内置函数 len() 可返回一个映射中的条目数。

1、字典

目前只有一种内生映射类型,此类对象表示由几乎任意值作为索引的有限个对象的集合。不可作为键的值类型只有包含列表或字典或其他可变类型,通过值而非对象编号进行比较的值,其原因在于高效的字典实现需要使用键的哈希值以保持一致性。用作键的数字类型遵循正常的数字比较规则: 如果两个数字相等 (例如 1 和 1.0) 则它们均可来用来索引同一个字典条目。

字典会保留插入顺序,这意味着键将以它们被添加的顺序在字典中依次产生。 替换某个现有的键不会改变其顺序,但是移除某个键再重新插入则会将其添加到末尾而不会保留其原有位置。

字典是可变的;它们可通过 {...} 标注来创建。扩展模块 dbm.ndbm 和 dbm.gnu 提供了额外的映射类型示例,collections 模块也是如此。

在 3.7 版更改: 在 Python 3.6 版之前字典不会保留插入顺序。 在 CPython 3.6 中插入顺序会被保留,但这在当时被当作是一个实现细节而非确定的语言特性。

八、可调用类型

1、用户定义函数

用户定义函数对象可通过函数定义来创建。它被调用时应附带一个参数列表,其中包含的条目应与函数所定义的形参列表一致。

特殊属性:

属性 含意  
__doc__ 该函数的文档字符串,没有则为 None;不会被子类继承。 可写
__name__ 该函数的名称。 可写
__qualname__ 该函数的 qualified name。 可写
3.3 新版功能.
__module__ 该函数所属模块的名称,没有则为 None。 可写
__defaults__ 由具有默认值的参数的默认参数值组成的元组,如无任何参数具有默认值则为 None。 可写
__code__ 表示编译后的函数体的代码对象。 可写
__globals__ 对存放该函数中全局变量的字典的引用 --- 函数所属模块的全局命名空间。 只读
__dict__ 命名空间支持的函数属性。 可写
__closure__ None 或包含该函数可用变量的绑定的单元的元组。 只读
__annotations__ 包含形参标注的字典。 字典的键是形参名,而如果提供了 'return' 则是用于返回值标注。 可写
__kwdefaults__ 仅包含关键字参数默认值的字典。 可写
__type_params__ 一个包含类型形参的元组,它们将传给 泛型函数。 可写

大部分标有 "Writable" 的属性均会检查赋值的类型。

函数对象也支持获取和设置任意属性,例如这可以被用来给函数附加元数据。使用正规的属性点号标注获取和设置此类属性。注意当前实现仅支持用户定义函数属性。未来可能会增加支持内置函数属性。单元对象具有 cell_contents 属性。这可被用来获取以及设置单元的值。

广告合作
QQ群号:707632017

温馨提示:

1、本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。邮箱:2942802716#qq.com。(#改为@)

2、本站原创内容未经允许不得转裁,转载请注明出处“站长百科”和原文地址。

目录