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是这样划分数字类型的复杂度的:整数比浮点数简单,浮点数比复数简单。所以当一个整数与浮点数混合时,整数首先会升级转为浮点数的值,之后通过浮点数的运算法则得到浮点数的结果。再者,要记住所有这些混合类型转换仅仅在将数字类型(例如,一个整数和一个浮点数)混合到一个表达式中的时候才适用,这包括那些使用数字和比较操作符的表达式。