python3之数字(python的数字类型)
----------
在python中,
数字并不是一个真正的对象类型,而是一组类似类型的分类。python不仅支持通常的数字类型(整数和浮点数),而且能够通过常量直接创建数字以及处理数字表达式。此外,python为更高级的工作提供了很多高级数字编程支持和对象。
python数字类型的完整工具包括:
1.整数和浮点数
2.复数
3.固定精度的十进制数
4.有理分数
5.集合
6.布尔类型
7.无穷的整数数度
8.各种数字内置函数和模块
数字常量
下表展示了python数字类型在程序中的显示方式(作为常量),如例:
数字 | 常量 |
1234,-24,0,999999999999 | 整数(无穷大小) |
1.23,1.,3.14e-10,4e210,4.0e+210 | 浮点数 |
0177,0x9ff,0b101010 | python2.6中的八进制、十六进制和二进制常量 |
0o177,0x9ff,0b101010 | python3.0中的八进制、十六进制和二进制常量 |
3+4j,3.0+4.0j,3J | 复数常量 |
a.整数和浮点数常量
整数以十进制数字的字符串写法出现,浮点数带一个小数点,也可以加上一个科学计数标志e或者E。如果编写一个带有小数点或幂的数字,python会将它变成一个浮点数对象,并且当这个对象用在表达式中时,将启用浮点数(而不是整数)的运算法则。
b.python2.6中的整数:一般整数和长整数
python2.6中有两种整数类型:一般整数(32位)和长整数(无穷精度),并且一个整数可以以l或者L结尾,从而强迫其成为长整数。由于当整数的值超过32位的时候会自动转换为长整数,我们不需要自己输入字母L,当需要额外的精度的时候,python会自动地转换为整数。
c.python3.0中的整数:一个单独的类型
在python3.0中,一般整数和长整数类型已经合二为一了,只有整数这一种,它自动地支持python2.6的单独的长整数类型所拥有的无穷精度。因此,整数在程序中不再用末尾的l或L表示,并且整数也不再会显示出这个字符。
d.十六进制数、八进制数和二进制数
整数可以编写为十进制(以10为基数)、十六进制数(以16为基数)、八进制数(以8为基数)和二进制数(以二为基数)形式。十六进制数以0x或0X开头,后面接十六进制的数字0~9和A~F。十六进制的数字编写成大写或小写都可以。八进制数常量以数字0o或0O开头(0和小写或大写的字母“O”),后面接着数字0~7构成的字符串。在python2.6及更早的版本中,八进制常量也可以写成前面只有一个0的形式,但在python3.0中不能这样。python2.6和python3.0中的新的二进制常量,以0b或0B开头,后面跟着二进制数字0~1。注意:内置函数hex(I)、oct(I)和bin(I)把一个整数转为这3种进制表示的字符串,并且int(str,base)根据每个给定的进制把一个运行时字符串转换为一个整数。
e.复数
python的复数常量写成实部+虚部的写法,这里虚部是以j或J结尾。其中,实部从技术上讲可有可无,所以可能会单独表示虚部。从内部看来,复数都是通过一对浮点数来表示的,但是对复数的所有的数字操作都会按照复数的运算法则进行。
f.编写其他的数字类型
还有一些上面例子中没有包含的基他的、更高级的数字类型。其中的一些通过调用导入的模块中的函数来创建,其它的一些拥有它们自己的常量语法(例如,集合)。
内置的数学工具和扩展
python还提供了一系列处理数字对象的工具:
表达式操作符,如:+、-、*、/、>>、**、&等。
内置数学函数, pow、abs、round、int、hex、bin等。
公用模块,random、math等。
python表达式操作符
操作符 | 描述 |
yield x | 生成器函数发送协议 |
lambda args: expression | 生成匿名函数 |
x if y else z | 三元选择表达式 |
x or y | 逻辑或(只有x为假,才会计算y) |
x and y | 逻辑与(只有x为真,才会计算y) |
not x | 逻辑非 |
x in y, x not in y | 成员关系(可迭代对象、集合) |
x is y, x is not y | 对象实体测试 |
x<y,x<=y,x>y,x>=y,x==y,x!=y | 大小比较,集合子集和超集相等性操作符 |
x|y | 位或、集合并集 |
x^y | 位异或,集合对称差 |
x&y | 位与,集合交集 |
x<<y,x>>y | 左移或右移y位 |
x+y,x-y | 加法/合并,减法,集合差集 |
x*y,x%y,x/y,x//y | 乘法/重复,余数/格式化,除法:真除法或floor除法 |
-x,+x | 一元减法,识别 |
~x | 按位求补(取反) |
x**y | 幂运算 |
x[i] | 索引(序列、映射及其他)点号取属性运算,函数调用 |
x[i:j:k] | 分片 |
x(...) | 调用(函数、方法、类及其他可调用的) |
x.attr | 属性引用 |
(...) | 无组,表达式,生成器表达式 |
[...] | 列表,列表解析 |
{...} | 字典、集合、集合和字典解析 |
混合操作所遵循的操作符优先级
当编写含有一个操作符以上的表达式时,python将按照所谓的优先级法则对其进行分组,这个分组决定了表达式中各部分的计算顺序。上表的顺序是根据操作符的优先级来排列的:
a.上表中,操作符
在表中越靠后的优先级越高,因此在混合表达式中要更加小心。
b.上表中,位于同一行的表达式在组合的时候通常
从左到右组合(除了幂运算,它是从右到左组合的,还有比较运算,是从左到右连接的)
括号分组的子表达式
如果用括号将表达式各部分进行分组的话,就可以完全忘掉优先级的事情了。当
使用括号划分子表达式的时候,就会超越python的优先级规则。python总会先行计算括号中的表达式,然后再将结果用在整个表达式中。如:(x+y)*z , x+(y*z)
混合类型自动升级
除了在表达式中混合操作符以外,
也能够混合数字的类型。例如,可以把一个整数与一个浮点数相加:40+3.14
但是这将引出另一个问题:它们的结果是什么类型?是整数还是浮点数?答案很简单:
在混合类型的表达式中,python首先将被操作的对象转换成其中最复杂的操作对象的型,然后再对相同类型的操作对象进行数学运算。python是这样划分数字类型的复杂度的:整数比浮点数简单,浮点数比复数简单。所以当一个整数与浮点数混合时,整数首先会升级转为浮点数的值,之后通过浮点数的运算法则得到浮点数的结果。再者,要记住所有这些混合类型转换仅仅在将数字类型(例如,一个整数和一个浮点数)混合到一个表达式中的时候才适用,这包括那些使用数字和比较操作符的表达式。