Python支持多种数字类型:整型,长整型,布尔型,双精度浮点型,十进制浮点型和复数
Python的标准整型类型等价于C语言的有符号长整型。整型一般以十进制表示,但是Python也支持八进制和十六进制来表示整型。八进制整型数以数字‘0’开始,十六进制整型数以“0x”或者“0X”开始。
Python中整型和长整型正在逐步统一为一种类型。
Python2.2以前标准整型类型对象超出取值范围会溢出,但Python2.2开始就没有这种错误了;Python2.3还会有个警告,到了Python2.4彻底没有了警告,会将整型自动转为长整型。
Python中的浮点类型类似C语言中的double类型,是双精度类型,可以用十进制或者科学计数法表示。类似这种:
9.384e-23 等价于 9.384乘以10的负23次幂
4.3e25 等价于 4.3乘以10的25次幂
Python语言中关于复数的概念:
- 虚数不能单独存在,它们总是和一个值为0.0的实数部分一起来构成一个复数
- 复数由实数部分和虚数部分构成
- 表示复数的语法:real+imagj
- 实数部分和虚数部分都是浮点型
- 虚数部分必须有后缀j或者J
属性 | 描述 |
---|---|
num.real | 该复数的实部 |
num.imag | 该复数的虚部 |
num.conjugate() | 返回该复数的共轭复数 |
复数属性
属性 | 描述 |
---|---|
num.real | 该复数的实部 |
num.imag | 该复数的虚部 |
num.conjugate() | 返回该复数的共轭复数 |
注:共轭复数,就是两个复数相加只剩实部的一对复数
Python数字类型强制转换原则:
- 如果有一个操作数是复数,另一个操作数被转为复数
- 否则,如果有一个操作数是浮点型,另一个操作数被转为浮点型
- 否则,如果有一个操作数是长整型,另一个操作数被转为长整型
- 否则,两者必然都是普通的整型,无须类型转换
数字类型之间的转换是自动进行的,无须程序员自己处理。
数字类型都支持标准操作符(对象值比较操作符(>,<,==等),对象身份比较操作符(is, is not),逻辑操作符(and,or,not))
算术操作符
Python支持单目操作符正号(+)和负号(-);双目操作符+、-、*、/、%和**,分别表示加法,减法,乘法,除法,取余和幂运算。从Python2.2起,还增加了一种新的整除操作符//
Python的除法规则:传统除法,真正的除法,地板除
传统除法:如果是整型,传统除法会舍去小数部分,返回一个整型(也叫地板除)。如果操作数之一是浮点型,则执行真正的除法,Python默认的除法规则就是传统除法
>>> 1 / 2
0
>>> 1.0 / 2.0
0.5
真正的除法:不管操作数是什么数字类型,返回的都是真实的商。现阶段可以通过from __future__ import division
开启
>>> from __future__ import division
>>> 1 / 2
0.5
>>> 1.0 / 2.0
0.5
地板除:从Python2.2版本新增了//操作符,以执行地板除;地板除不管操作数为何种数字类型,总是舍去小数部分,返回数字序列中比真正的商小的最接近的数字。
>>> 1 // 2
0
>>> 1.0 // 2.0
0
>>> -1 // 2
-1
操作符 | 2.1.x及更早的版本 | 2.2及更新版本(No import division) | 2.2及更新版本(import of division) |
---|---|---|---|
/ | 传统除 | 传统除 | 真正除 |
// | 无 | 地板除 | 地板除 |
除法操作符的行为差异
操作符 | 2.1.x及更早的版本 | 2.2及更新版本(No import division) | 2.2及更新版本(import of division) |
---|---|---|---|
/ | 传统除 | 传统除 | 真正除 |
// | 无 | 地板除 | 地板除 |
浮点型取余公式:x - (math.floor(x/y) * y)
复数型取余公式:x - (math.floor((x/y).real) * y)
幂运算符和单目操作符之间的优先级关系比较特别:幂运算操作符比其左侧操作数的单目操作符优先级高,比其右侧的单目操作符的优先级低
>>> 3 ** 2
9
>>> -3 ** 2 # ** 优先级高于左侧的 -
-9
>>> (-3) ** 2 # 加括号提高-的优先级
9
>>> 4.0 ** -1.0 # ** 优先级低于右侧的-
0.25
其实就是幂运算符的优先级高于单目操作符,只是单目操作符在右侧时必须先和数字结合才能进行幂运算,所以在右侧时单目操作符的优先级才会高于幂操作符
Python 算术操作符总结 见P85
Python的位操作只适用于整型,包括取反(~),按位与(&),或(|),异或(^),以及左移(<<)和右移(>>)
Python这样处理位运算:
- 负数会被当成正数的二进制补码处理
- 左移和右移N位等同于无益出检查的2的N次幂运算:2**N
- 对于长整型来说,位操作符使用一种经修改的二进制补码形式,使得符号位可以无限向左扩展。
取反(~)运算的优先级与数字单目操作符相同,是所有位操作符中最高的。左移和右移运算的优先级次之,但低于加减法运算。与,或,异或运算的优先级最低。
取反公式 ~x = -(x+1)
左移公式 x << y = x * (2**y)
右移公式 x >> y = x / (2**y)
工厂函数 | 操作 |
---|---|
bool(obj) | 返回obj对象的布尔值,也就是obj.__nonzero__()方法的返回值 |
int(obj,base=10) | 返回一个字符串或者数字对象的整型表示,base为可选的进制参数 |
long(obj,base=10) | 返回一个字符串或者数字对象的长整型表示,base为可选的进制参数 |
float(obj) | 返回一个字符串或者数字对象的浮点型表示 |
complex(str) or complex(real, imag=0.0) | 返回一个字符串的复数表示,或者根据给定的实数(以及一个可选的虚数部分)生成一个复数对象 |
数值工厂函数
工厂函数 | 操作 |
---|---|
bool(obj) | 返回obj对象的布尔值,也就是obj.__nonzero__()方法的返回值 |
int(obj,base=10) | 返回一个字符串或者数字对象的整型表示,base为可选的进制参数 |
long(obj,base=10) | 返回一个字符串或者数字对象的长整型表示,base为可选的进制参数 |
float(obj) | 返回一个字符串或者数字对象的浮点型表示 |
complex(str) or complex(real, imag=0.0) | 返回一个字符串的复数表示,或者根据给定的实数(以及一个可选的虚数部分)生成一个复数对象 |
Python还有5个内建函数用于数字运算:abs(),coerce(),divmod(),pow()和round()
abs()返回给定参数的绝对值,如果参数是个复数,那么返回math.sqrt(num.real**2 + num.imag**2) 注 math.sqrt平方根
coerce()用来做类型转换,返回一个包含类型转换完毕的两个数字元素的元组
>>> coerce(1,2)
(1,2)
>>> coerce(1.3, 134L)
(1.3, 134.0)
>>> coerce(1j, 134L)
(1j, (134+0j))
转换规则和Python解释器一致
divmod()内建函数把除法和取余运算结合起来,返回一个包含商和余数的元组。对于整型,它的返回值就是地板除和取余操作的结果。对于浮点型,返回的商部分是math.floor(num1/num2);对于复数,商部分是math.floor((num1/num2).real)
pow()和幂操作符(**)的作用相同,不过pow()函数可以接受第三个参数用于和幂运算的结果进行取余运算(pow(x,y,z)),并且性能比pow(x,y) % z更好
round()函数用于对浮点型进行四舍五入运算。它有一个可选的小数位数参数。如果不提供小数位参数,它返回与第一个参数最接近的整型(但仍然是浮点型)。第二个参数告诉round()函数将结果精确到小数点后指定位
>>> round(3)
3.0
>>> round(3.45)
3.0
>>> round(3.49999999)
3.0
>>> round(3.49999999, 1)
3.5
int(), round(), math.floor()这三个函数的区别
- int() 直接截去小数部分 (返回值为整型)
- math.floor() 得到最接近原数但小于原数的整型 (返回值为浮点型)
- round() 得到最接近原数的整型 (返回值为浮点型)
详细的例子见P91
函数 | 操作 |
---|---|
hex(num) | 将数字转换成十六进制数并以字符串的形式返回 |
oct(num) | 将数字转换成八进制数并以字符串的形式返回 |
chr(num) | 将ASCII值的数值转换成ASCII字符,范围只能是0<=num<=255 |
ord(char) | 接受一个ASCII或Unicode字符(长度为1的字符串),返回相应的ASCII值或Unicode值 |
unichr(num) | 接受Unicode值,返回其对应的Unicode字符,所接受的码值范围依赖于你的Python是构建于UCS-2还是UCS-4 |
仅适用于整型的内建函数
函数 | 操作 |
---|---|
hex(num) | 将数字转换成十六进制数并以字符串的形式返回 |
oct(num) | 将数字转换成八进制数并以字符串的形式返回 |
chr(num) | 将ASCII值的数值转换成ASCII字符,范围只能是0<=num<=255 |
ord(char) | 接受一个ASCII或Unicode字符(长度为1的字符串),返回相应的ASCII值或Unicode值 |
unichr(num) | 接受Unicode值,返回其对应的Unicode字符,所接受的码值范围依赖于你的Python是构建于UCS-2还是UCS-4 |
函数 | 描述 |
---|---|
randint(a, b) | 返回[a, b]之间的一个随机数 |
randrange() | 它接受和range()函数一样的参数,随机返回range([start,]stop[,step])结果中的一个 |
uniform() | 几乎和randint() 一样,不过它返回的是二者之间的一个浮点型(不包括上限) |
random() | 类似uniform(),只不过下限恒定等于0.0, 上限恒定等于1.0 |
choice() | 随机返回给序列的一个元素 |
当你的程序需要随机数功能时,random模块就能派上用场。该模块包含多个伪随机数发生器,它们均以当前的时间戳为随机种子。
函数 | 描述 |
---|---|
randint(a, b) | 返回[a, b]之间的一个随机数 |
randrange() | 它接受和range()函数一样的参数,随机返回range([start,]stop[,step])结果中的一个 |
uniform() | 几乎和randint() 一样,不过它返回的是二者之间的一个浮点型(不包括上限) |
random() | 类似uniform(),只不过下限恒定等于0.0, 上限恒定等于1.0 |
choice() | 随机返回给序列的一个元素 |