Python中基本内置类型由数字、序列、映射、类、实例和例外。一些集合类是可变的,因此那些可以增添、删除或排列这些类的方法不会奏效,只会返回None,用来示意函数调用者逻辑上的错误。但同时,几乎所有操作都支持几种典型的函数操作,比如说:比较、真值测试以及用str()或repr()函数转化为字符串。总而言之,了解Python内置的类型有助于编程者使用这门语言进行各类开发测试工作。
1.真值测试
所有的对象都支持真值测试,真值测试可以使用if或while语句,也可以使用布尔操作符进行。该语言默认,一个对象应该具有True的属性,除非该类在被调用时使用__bool__()方法返回了False或者使用__len__()方法返回了数字0。一般来讲,以下的内置对象呗认为具有False属性:
(1)被定义具有False属性的常量:None与False;
(2)任何数字类型中的0:0,0.0,0j,Decimal(0),Fraction(0);
(3)空的序列或集合:’’,(),[],{},set(),range(0)。
操作和内置函数通常返回0或False表示其具有False属性,返回1或True表示其具有True属性。但有一个及其重要的例外:布尔操作中的or和and总是返回它们自己所有的一个操作数以表明自己的布尔属性。
2.布尔操作:and、or与not
操作 | 实现流程 |
x or y | 如果x是真,直接返回x; 如果x是假,返回y(结合上文思考) |
x and y | 如果x为真,返回y; 如果x为假,直接返回x。 |
not x | 如果x为假,返回False; 如果x为真,返回True。 |
not是一个低优先级的操作(优先级低于非布尔操作),例如:not x==y 语句等价于 not (x==y),并且x == not y 这个用法会导致索引错误。
3.比较
Python中有八种比较操作,这些比较操作具有相同的优先级。,下表列出具体的操作符号:
操作 | 操作含义 |
< | 严格小于 |
<= | 小于或等于 |
> | 严格大于 |
>= | 大于或等于 |
== | 等于 |
!= | 不等于 |
is | 对象身份比较 |
is not | 忽略对象身份 |
除了不同类型的数字外,其它类型的对象永远不会相等。此外,某些类型(例如函数对象)仅支持简单的比较概念,即任何两种类型的对象都不相等。这些比较操作会在其比较两个不同类的对象时抛出TypeError错误。is和not操作符的行为是不可定制的;它们也可以应用于任何两个对象,并且不会引发异常。
in和not in这两个仅用于序列对象的操作与这些比较操作拥有相同的优先级。
4.数字类型——int、float与complex
数字类型有三个下级分支:整数,浮点数和复数。需要指出的是,布尔数是一个整数的子类型。整数具有无限精度,也就是说在Python中不限制整数的位数。浮点数通常在C中使用double实现;复数有一个实部和虚部,每个部分都是一个浮点数。要从复数z中提取这些零件,请使用z.real和z.imag。(标准库包含其他数字类型,保留有理数的分数以及用户可定义的精度保存浮点数的小数。)
数字由数字文字或内置函数和运算符的结果创建。未经修饰的整数文字(包括十六进制,八进制和二进制数字)将产生整数。包含小数点或指数符号的数字文字会生成浮点数字。将'j'或'J'附加到数字字面上会得到一个虚数(一个具有零实数部分的复数),您可以将其添加到整数或浮点数以获得具有实部和虚部的复数。
下表列出数字类型支持的操作:
操作 | 结果 |
x + y | x与y的和 |
x – y | x减y的差 |
x * y | x乘y的积 |
x / y | x除y的商 |
x // y | x除y的商向下求整 |
x % y | x除y的余数 |
-x | 非x |
+x | x不变 |
abs(x) | x的绝对值 |
int(x) | 将x转化为整型数 |
float(x) | 将x转化为浮点数 |
complex(re,im) | re为复数的实部,im为复数的虚部 |
c.conjugate() | 数字c的共轭数 |
divmod(x, y) | 等价于(x//y, x%y) |
pow(x, y) | 等价于x^y |
x ** y | 等价于x^y |
所有的实数类数字(整型和浮点数)都支持下述操作:
操作 | 结果 |
math.trunc(x) | 把x截断为整型数 |
round(x[, n]) | x四舍五入为n位数,四舍五入最后一位为偶数。如果省略n,则默认为0。 |
math.floor(x) | 小于等于x的最大整数 |
math.ceil(x) | 大于等于x的最小整数 |
math和cmath模块内由丰富的数字操作函数。
4.1 整数类型的按位运算
位操作仅对整型数敏感。位操作中,负数等价于它的补码值(假定有足够的位数以便在操作期间不发生溢出)。位操作的优先值高于所有的比较操作,但低于所有的数学操作。但是,~的优先级与+与-这两个数学操作的优先级相同。下表以升序优先级列出了所有位操作:
操作 | 结果 |
x | y | x与y按位或 |
x ^ y | x与y按位异或 |
x & y | x与y按位与 |
x << n | x左移n位 |
x >> n | x右移n位 |
^x | x按位非 |
4.2 整型数的额外方法
int.bit_length()
返回表示二进制整数所需的位数,不包括符号和前导零
int.to_bytes(length, byteorder, *,signed=False)
返回表示整数的字节数组。
classmethod int.from_bytes(bytes,byteorder, *, signed=False)
返回给定字节数组所表示的整数。
4.3 浮点数的额外方法
float. as_integer_ratio()
返回一对整数,其比例与原始浮点数完全相等,并带有一个正的分母。
float. is_integer()
如果float实例是有限整数值,则返回True,否则返回False.
float. hex()
将浮点数的表示形式返回为十六进制字符串。对于有限的浮点数,这种表示将始终包 含一个前导0x和一个尾随p和指数。
classmethod float. fromhex(s)
返回由十六进制字符串s表示的float。
4.4 散列数字类型(哈希数)
对于可能具有不同类型的数字x和y,只要x == y,就需要hash(x)== hash(y)。 为了便于跨多种数字类型(包括int,float,decimal.Decimal和fractions.Fraction)的实现和效率,Python的数字类型哈希基于为任何有理数定义的单个数学函数,因此适用于所有 int和fractions.Fraction的实例,以及所有有限的float和decimal.Decimal实例。 从本质上讲,这个函数是通过对一个固定素数P减模P给出的.P的值可作为sys.hash_info的模特属性提供给Python。