Types: 4. Numeric Types — int, float, long, complex
4. Numeric Types — int, float, long, complex
有四种不同的数字类型:普通整数
,长整数
,浮点数
和复数
。另外,布尔也是普通整数
的一个子类型。在C 中实现纯整数
(也称为整数
)long
,它使它们具有至少32位的精度(sys.maxint
总是设置为当前平台的最大纯整数
值,最小值为-sys.maxint - 1
)。长整数
具有无限精度。浮点数
通常double
在C中实现; 有关运行程序的机器的浮点数
的精度和内部表示的信息可在sys.float_info
。复数
有一个实部和虚部,每个部分都是一个浮点数
。要从复数
z中
提取这些零件,请使用z.real
和z.imag
。(标准库包含额外的数字类型,fractions
用于保存有理数据,并decimal
保存具有用户可定义精度的浮点数
。)
数字由数字文字或内置函数和运算符的结果创建。未经修饰的整数文字(包括二进制,十六进制和八进制数字)会产生纯整数,除非它们表示的值太大而不能表示为普通整数,在这种情况下,它们会产生长整数。一个整数文字'L'
或'l'
后缀产量长整型('L'
是首选,因为1l
看起来太的十一!)。包含小数点或指数符号的数字文字会生成浮点数字。追加'j'
或'J'
数字文字会产生一个虚数(一个具有零实数部分的复数),您可以将其添加到整数或浮点数以获得具有实部和虚部的复数。
Python完全支持混合算术:当二进制算术运算符具有不同数值类型的操作数时,具有“窄”类型的操作数会扩展到另一个操作数,其中纯整数比窄整数窄于浮点比窄比复杂。混合类型的数字之间的比较使用相同的规则。[2]的构造int()
,long()
,float()
,和complex()
可以用于产生特定类型的号码。
所有内置的数字类型都支持以下操作。有关运营商的优先事项,请参阅电力运营商和后续章节。
手术 | 结果 | 笔记 |
---|---|---|
x + y | x与y之和 | |
x - y | x与y的差 | |
x * y | x与y的乘积 | |
x / y | x与y的商数 | (1) |
x // y | x与y的商的整数部分 | (4)(5) |
x%y | x / y的余数部分 | (4) |
-X | x的负数 | |
+ X | x的正数 | |
ABS(x)的 | 绝对值 | (3) |
int(x)的 | x转换为整数 | (2) |
long(x)的 | x转换为长整数 | (2) |
float(x)的 | x转换为浮点 | (6) |
complex(RE,IM) | 与实数部分相关的复数,虚数部分im。默认为零。 | |
c.conjugate() | 复数c的共轭。(实际身份) | |
divmod(x,y) | 返回tuple(x//y,x%y) | (3)(4) |
pow(x,y) | x到权力y | (3)(7) |
x ** y | x到权力y | (7) |
笔记:
- 对于(纯或长)整数除法,结果是一个整数。结果总是向负无穷大舍入:1/2是0,(-1)/ 2是-1,1 /( - 2)是-1,(-1)/( - 2)是0.请注意,如果任一操作数是长整型,则结果为长整数,无论数值如何。
- 像使用相关函数一样,使用
int()
或long()
截断为零的浮点数转换math.trunc()
。使用该功能math.floor()
向下滚动并向math.ceil()
上滚动。
- 有关完整说明,请参阅内置函数。
- 自从版本2.3开始弃用:楼层划分运算符,模运算符和
divmod()
函数不再为复数定义。相反,abs()
如果适用,则使用该函数将其转换为浮点数。
- 也被称为整数除法。结果值是一个整数,虽然结果的类型不一定是int。
- 对于非数字(NaN)和正或负无穷,float还接受带有可选前缀“+”或“ - ”的字符串“nan”和“inf”。2.6版本中的新功能。
- Python定义
pow(0, 0)
和0 ** 0
将会1
像编程语言一样常见。
所有numbers.Real
类型(int
,long
和float
)还包括以下操作:
Operation | 结果 |
---|---|
math.trunc(x)的 | x截断为Integral |
round(x,n) | x四舍五入为n位数,从零开始取整。如果省略n,则默认为0。 |
math.floor(x)的 | 作为float <= x的最大整数 |
math.ceil(x)的 | 作为float> = x的最小整数 |
4.1。整数类型的按位运算
按位运算只对整数有意义。负数被视为它们的2的补码值(假定在操作过程中没有溢出发生的位数足够大)。
二进制按位运算的优先级均低于数值运算并高于比较; 一元运算~
与其他一元运算(+
和-
)具有相同的优先级。
此表列出按升序优先级排序的按位运算:
Operation | 结果 | 笔记 |
---|---|---|
x | 和 | 按位或x和y | |
x ^ y | 按位排他或x和y | |
x&y | 按位和x和y | |
x << n | x左移n位 | (1)(2) |
x >> n | x右移n位 | (1)(3) |
〜X | x的位反转 | |
注释:
- 负转移次数是非法的,并导致a
ValueError
被提出。
- 左移
n
位相当于乘以pow(2, n)
。如果结果超出纯整数范围,则返回一个长整数。
- 右移
n
位相当于除以pow(2, n)
。
4.2。整数类型的其他方法
整数类型实现numbers.Integral
抽象基类。另外,他们还提供了另一种方法:
int.bit_length()long.bit_length()
返回表示二进制整数所需的位数,不包括符号和前导零:
>>> n = -37
>>> bin(n)
'-0b100101'
>>> n.bit_length()
6
更确切地说,如果x不为零,则x.bit_length()是唯一的正整数k这样2**(k-1) <= abs(x) < 2**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
2.7版本的新功能。
4.3。其他方法浮动
浮点类型实现numbers.Real
抽象基类。float还有以下附加方法。
float.as_integer_ratio()
返回一对整数,其比例与原始浮点数完全相等,并带有一个正的分母。提高OverflowError
无穷大和ValueError
NaNs。
2.6版本中的新功能。
float.is_integer()
返回True
如果浮子实例是有限的与积分值,并False
以其他方式:
>>> (-2.0).is_integer()
True
>>> (3.2).is_integer()
False
2.6版本中的新功能。
两种方法支持与十六进制字符串的转换。由于Python的浮点数在内部存储为二进制数,因此将浮点数转换为十进制
字符串或从十进制
字符串转换浮点数通常会导致一个小的舍入误差 相反,十六进制字符串允许精确表示和指定浮点数。这在调试和数值工作时非常有用。
float.hex()
将浮点数的表示形式返回为十六进制字符串。对于有限的浮点数,这种表示将总是包括前导0x
和尾随p
以及指数。
2.6版本中的新功能。
float.fromhex(s)
Clas
s
方法返回由十六进制字符串s
表示的float 。字符串s
可能有前导和尾随空白。
2.6版本中的新功能。
请注意,这float.hex()
是一种实例方法,而它float.fromhex()
是一种类方法。
十六进制字符串采用以下形式:
[sign] ['0x'] integer ['.' fraction] ['p' exponent]
其中可选sign
可以是+
或者-
,integer
并且fraction
是十六进制数字的字符串,并且exponent
是具有可选前导符号的十进制整数。大小写不重要,整数或小数中至少有一个十六进制数字。此语法与C99标准的6.4.4.2节中指定的语法类似,也与Java 1.5之后的语法类似。特别是,输出float.hex()
可用作C或Java代码中的十六进制浮点字面值,并且由C的%a
格式字符或Java 产生的十六进制字符串Double.toHexString
被接受float.fromhex()
。
请注意,指数是用十进制而不是十六进制编写的,它给出了乘以系数的2的幂。例如,十六进制字符串0x3.a7p10
表示浮点数(3 + 10./16 + 7./16**2) * 2.0**10
,或者3740.0
:
>>> float.fromhex('0x3.a7p10')
3740.0
将反向转换应用于3740.0
给出代表相同数字的不同十六进制字符串:
>>> float.hex(3740.0)
'0x1.d380000000000p+11'