5. 内建的类型

优质
小牛编辑
140浏览
2023-12-01

5. 内建的类型

以下各节描述内置于解释器的标准类型。

历史上(直到2.2版的发布),Python 的内置类型不同于用户定义的类型,因为不可能用内置类型作为面向对象继承的基类。这种限制不再存在。

主要的内置类型为数字、 序列、 映射、 文件、 类、 实例和异常。

某些操作被几种对象类型支持;特别需要注意的是,几乎所有对象都可以比较、测试真值、转换为字符串(其实就是用repr()函数,或略有差异的str()函数来转换)。后者在对象使用print()函数写出时隐式地调用。

5.1. 真值的测试

任何对象都可以测试真值,用于if或while的条件或下面布尔运算的操作数。下面的值被视为假:

  • None

  • False

  • 任何数值类型的零,例如,0、 0 L、 0.0、 0j。

  • 任何空的序列,例如, ''、 ()、 []。

  • 任何空的映射,例如,{}。

  • 用户定义的类的实例,如果该类定义一个nonzero()len()的方法,在该方法返回整数零或布尔值False时。[1]

所有其他值都被视为真 — 所以许多类型的对象永远为真。

结果为布尔值的运算和内建函数总是返回0或False表示假以及1或True表示真,除非另有说明。(重要的例外:布尔操作符or和and始终返回它们的一个操作数。)

5.2. 布尔操作 — and, or, not

这些是布尔操作,按升序优先排序:

操作结果
xory如果x为假,那么返回y,否则返回x(1)
xandy如果x为假,那么返回x,否则返回y(2)
notx如果x为假,那么返回True,否则返回False(3)

注:

  1. 这是一个短路操作符,因此只有第一个参数为False时才计算第二个参数。
  2. 这是一个短路操作符,因此只有第一个参数为True时才计算第二个参数。
  3. not比非布尔操作符的优先级低,因此nota==b解释为not(a==b),a==notb是一个语法错误。

5.3. 比较操作

所有对象都支持比较操作。它们都具有相同的优先级(高于布尔操作)。比较可以任意链接;例如,x<y< =z相当于x<yandy< =z,只是y只计算一次(但这两种情况在x<y是假时都不会计算z)。

下表汇总了比较操作:

操作含义
<严格地小于
<=小于或等于
>严格地大于
>=大于或等于
==等于
!=不等于(1)
is对象的ID
isnot不同的对象ID

注:

  1. !=也可以写成<>,但这只是用于保持向后兼容性的用法。新的代码应该一直使用!=。

不同类型的对象,不同的数值和字符串类型除外,比较结果永远不会相等;这类对象排序的结果永远一致但是顺序却是随机的(使得异构数组的排序可以生成一致的结果)。此外,某些类型(例如,文件对象)只支持退化的比较概念,该类型的任何两个对象都不相等。同样,这类对象排序的顺序是随机的但是会永远是一致的。当任何一个操作数是复数时,<、 =、 >和> =运算符会引发TypeError异常。

类的非同一个实例比较时通常不相等,除非该类定义eq()cmp()方法。

一个类的实例通常不能与同一个类的其它实例或者其他类型的对象排序,除非该类定义足够丰富的比较方法(ge()le()gt()lt())或cmp()方法。

CPython 的实现细节:除数值以外不同类型的对象按它们的类型名称进行排序;不支持合适比较的相同类型的对象按它们的地址进行排序。

还有两个具有相同优先级的操作in和notin只支持序列类型 (见下文)。

5.4. 数值类型 — int, float, long, complex

有四种不同的数值类型:普通整数长整数浮点数复数。此外,布尔值是普通整数的一个子类型。普通整数(也被只叫做整数)使用C中的long实现,其精度至少为32位(sys.maxint始终设置为当前平台最大的普通整数值,最小值是-sys.maxint-1)。长整数具有无限的精度。浮点数字通常使用C中的double实现;有关你的程序所运行的机器上的浮点数精度及其内部表示形式的信息在sys.float_info中可以获得。复数有实部和虚部,各是一个浮点数。若要从复数z中提取这些部分,请使用z.real和z.imag。(标准库包括额外的数值类型,fractions支持有理数,decimal支持用户自定义精度的浮点数。)

数值通过数字字面值或内建的函数和操作的结果创建。普通的整数字面值(包括二进制、十六进制和八进制数字)产生普通整数,除非它们指定的值太大以致不能用一个普通的整数表示,在这种情况下它们产生一个长整型。带有'L'或'l'后缀的整数字面值产生长整数(偏向使用'L',因为1l看起来太像十一)。包含小数点或指数符号的数字字面值产生浮点数。将'j'或'J'附加到数字字面值的尾部产生实部为零的复数。复数字面值是实部和虚部的和。

Python完全支持混合的算法:当二元算术运算符的操作数是不同的数值类型时,“较窄”类型的操作数会拓宽成另外一个操作数的类型,其中整数窄于长整数窄于浮点数窄于复数。比较混合型数字之间使用相同的规则。[2]构造函数int()long()float()complex()可用于产生的一种特定类型的数值。

所有内置的数值类型都支持以下操作。运算符的优先级请参阅幂运算符和后面几节。

操作结果
x+yxy
x-yxy的差
x*yxy的积
x/yxy的商(1)
x//yxy的(整除)商(4)(5)
x%yx/y的余数(4)
-xx
+xx保持不变
abs(x)x的绝对值或大小(3)
int(x)x转换成整数(2)
long(x)x转换成长整数(2)
float(x)x转换成浮点数(6)
complex(re,im)实部为re,虚部为im的一个复数。im默认为零。
c.conjugate()复数c的共轭。(用实数表示)
divmod(x,y)元组(x//y,x%y)(3)(4)
pow(x,y)xy次方(3)(7)
x**yxy次方(7)

注:

  1. 对于(普通或长)整数除法,结果是一个整数。结果总是向负无穷舍入:1/2是0,(-1)/2是-1,1/(-2)是-1,(-1)/(-2)是0。请注意如果任何一个操作数是长整数,结果都会是一个长整数,与值大小无关。

  2. 使用int()long()函数转换浮点数会向零截断,类似相关的函数math.trunc()函数。使用函数math.floor()以向下取整和math.ceil()以向上取整。

  3. 完整的说明请参阅内置函数

  4. 从2.3版开始弃用:整除运算符、取模运算符和divmod()函数不再为复数定义。相反,如果合适,可以使用abs()函数转换为浮点数。

  5. 也被称为整数除法。结果的值完全是一个整数,虽然结果的类型不一定是整型。

  6. 浮点数还接受可带有可选前缀 "+"或"-"的字符串"nan"和"inf"来表示非数字(NaN))和正/负无穷。

在2.6版中新增。

  1. Python定义pow(0,0)和0**0为1,这对于编程语言很常见。

所有的numbers.Real类型(intlongfloat)还包含以下的操作:

操作结果
math.trunc(x)x截取成整数
round(x[,n])x舍入到n位,舍入ties away from零。如果n省略,默认为0。
math.floor(x)<= x的最大浮点整数
math.ceil(x)>= x的最小浮点整数