python数值分为3种类型_Python数值类型
数值类型
decimal是整数数据类型python的数值类型包括常规的类型:整数(没有⼩数部分的数字)、浮点数(通俗地说,就是有⼩数部分的数字)以及其它数值类型(复数、分数、有理数、⽆理数、集合、进制数等)。除了⼗进制整数,还有⼆进制数、⼋进制数、⼗六进制数。
类型 ⽰例
---------------------------------------
整数 1234, -24, 0
浮点数 1.23, 1., .2, 3.14e-10
⼋进制 0o177, 0O177
⼗六进制 0x9ff, 0X9ff
⼆进制 0b1010, 0B1010
需要说明的⼏点事项:
python 3.x中的整数不区分⼀般整数和长整型整数,3.x版本中的整数⽀持⽆穷精度
任何时候浮点数都是不精确的。当带有⼩数点或科学计数的标记符号e或E,就表⽰这是浮点数
当浮点数参与表达式的运算时,会以浮点数的规则进⾏运算,也就是整数会转换成浮点数类型
python中的浮点数精度和C语⾔的双精度浮点数精度相同
整数除了⼗进制整数外,还可以写成⼆进制、⼋进制、⼗六进制甚⾄是其它进制的整数,它们的转换⽅式见后⽂
当⼀个整数以0b或0B开头,其后都是0、1时,默认识别为⼆进制整数
当⼀个整数以0o或0O开头(数值零和⼤、⼩写的字母o),其后都是0-7之间的数值时,默认识别为8进制整数
当⼀个整数以0x或0X开始,其后都是[0-9a-fA-F]之间的字符时,默认识别为⼗六进制
python中的数值类型是不可变对象,不可变意味着不可原处修改。假如a = 3333,那么现在内存中会
有⼀个内存块保存数值对象3333,如果修改它,⽐如对它加上1操作a += 1,python将创建⼀个新的内存块⽤来保存新的数值对象3334,⽽不是在3333那个内存块中直接修改为3334,所以那个原始的数值3333就被丢弃了,它会等待垃圾回收器去回收。关于可变、不可变对象,后⾯的⽂章将会经常提到,请先留意这两个词。
数值基本运算
⽀持最基本的数学运算符号:+ - * / % **、取正负+x -x,地板除法//,除法和取模divmod(x, y):
>>> 123 + 345
468
>>> 345 - 123
222
>>> 1.5 * 4
6.0
>>> 2/5
0.4
>>> 2 % 3
2
>>> 3 ** 2
9
>>> 3.00 ** 2
9.0
>>> 3 ** 100
515377520732011331036461129765621272702107522001
>>> a = 3; b = -3
>>> -a, -b
(-3, 3)
>>> divmod(5, 2)
(2, 1)
可见,python的数值计算⽅式⾮常直接,且python 3.x中会⾃动为整数提供⽆穷精度。正如上⾯最后⼀个计算表达式(3**100),它将所有数字都显⽰出来了。就算是计算3**10000,3**1000000,python也不会报错,不过3的100万次⽅,显然需要花上⼀段时间来计算。这和其它编程语⾔有所区别,例如java中计算Math.pow(3,10000)将返回Infinity,表⽰⽆穷⼤。
⼜是⼏个注意事项:
python中的除法运算/得到的结果总是浮点数(例如9/3=3.0),后⾯还有⼀种地板除法(floor)不⼀样。
当数值部分有⼩数时,会⾃动转换为浮点数类型进⾏运算,⽽且会⾃动忽略参与运算的⼩数尾部的0。
加号+和乘号*也能处理字符串:
+可以连接字符串,例如"abc" + "def"得到abcdef
*可以重复字符串次数,例如"a"*3得到"aaa","ab"*3得到"ababab"
其它数学运算⽅法
除了上⾯的基础算术运算符,还⽀持很多数值类型的运算符,例如:取反(~)、位移(>>)、位与(&)、位异或(^)、逻辑与(and)、逻辑或(or)。
除此之外,还有⼏个python的内置数学函数:
pow():求幂,如pow(2,3)=8
abs():求绝对值,如abs(-3)=3
round():四舍五⼊,如round(3.5)=4
int():取整(截去⼩数部分),如int(3.5)=3
float():转换成浮点数,如float(3)=3.0
oct():⼗进制整数转换成⼋进制
hex():⼗进制整数转换成⼗六进制整数
bin():⼗进制整数转换成⼆进制
...等等...
还有专门的数学模块math、取随机数的模块random等。
浮点数
由于硬件的原因,使得计算机对于浮点数的处理总是不精确的。
例如,按照数学运算时,1.1-0.9=0.2,但实际得到的结果为:
>>> 1.1-0.9
0.20000000000000007
它以⾼精度的极限趋近的值来显⽰。上⾯的趋近结果⼤于按照数学运算结果,但并不总是如此,例如下⾯的运算则是⼩于数学运算的结果:
>>> 3.3-3.2
0.09999999999999964
由于浮点数不精确,所以尽量不要对两个浮点数数进⾏等值==和不等值!=⽐较.如果⾮要⽐较,应该通过它们的减法求绝对值,再与⼀个⾜够⼩(不会影响结果)的值做不等⽐较。
例如:
>>> (3.2-2.8) == 0.4
False
>>> abs((3.2-2.8)-0.4) < 0.0002
True
最后,浮点数并⾮总是输出很长精度的值。正如前⾯的运算:
>>> 3.2+3.2
6.4
>>> 3/10
0.3
浮点数有两个特殊⽅法,⼀个是is_integer(),⽤来测试这个浮点数是否是整数,另⼀个是as_integer_ratio(),可以将浮点数转换成分⼦分母组成的元组,不过这个⽅法并⾮总是如你所想的那样友好。例如:
>>> (3.0).is_integer()
True
>>> (3.2).is_integer()
False
>>> (2.5).as_integer_ratio()
(5, 2)
>>> (2.6).as_integer_ratio()
(5854679515581645, 2251799813685248)
浮点数总是不精确的,⽽且不能指定⼩数位数。但在python中,有⼀个专门的⼩数模块decimal,它可以提供精确的⼩数运算,还有⼀个分数模块fractions,也能提供精确的⼩数运算。
真除法、Floor除法和⼩数位截断
/:实现的是真除法。在python中,它总是返回浮点数值。
//:实现的是floor地板除法,它会去掉除法运算后的⼩数位,以便得到⼩于运算结果的最⼤整数。如果参与运算的有⼩数,则返回浮点数,否则返回整数
在math模块中,有地板函数math.floor()和天花板函数il()。它们的意义可以根据现实中地板、空⽓、天花板的⾼低位置来考虑。地板位于空⽓之下,地板运算的返回值是⽐空⽓⼩的最⼤整数,天花板位于空⽓之上,天花板运算的的返回值是⽐空⽓⼤的最⼩整数
round(x, N)是四舍五⼊,可以指定四舍五⼊到哪个⼩数位
实际上int()函数⾃⾝就是字节截断⼩数的
看下⾯的⽰例。
真除法总是返回浮点数。
>>> 9/3
3.0
>>> 10/4
2.5
>>> 10/4.0
2.5
>>> -9/2
-4.5
>>> -9/2.0
-4.5
floor除法返回浮点数还是整数取决于参与运算的数是否包含浮点数。
>>> 9 // 3
3
>>> 10 // 4
2
>>> 10 // 4.0
2.0
对于正数的运算结果,floor除法是直接去除⼩数位的。对于负数结果,它是取⽐运算结果更⼩的负整数。。
例如,负数结果的floor除法:
>>> -9 // 3
-3
>>> -10 // 4
-3
>>> -10 // 3
-4
-10 / 4的结果是-2.5,floor要取⽐它⼩的最⼤整数,也就是-3。-10 / 3的结果是-3.3,floor要取⽐它⼩的最⼤整数,也就是-4。
除了真除法和floor除法,还有四舍五⼊round()和unc()两种截断⼩数的⽅式。例如:
>>> round(10/4)
2
>>> round(-5.2/2)
-3
>>> import math # import表⽰导⼊某个模块
>>> unc(5/2)
2
>>> unc(-5.2/2)
-2
int()也可以直接截断⼩数。
>>> int(3.6)
3
>>> int(-3.6)
-3
数值类型的转换
int()可以将字符串或浮点数转换成整数,也可以⽤于进制数转换
float()可以将字符串或整数转换成浮点数
实际上它们表⽰根据给定参数在内存中构造⼀个整数、浮点数对象,所以可以⽤来作为类型转换⼯具。⽽且,前⾯已经说过,int()可以⽤来截断⼩数位。
>>> int(3.5) # 浮点数 -> 整数
3
>>> int(-3.6) # 浮点数 -> 整数
-3
>>> int('3') # 字符串 -> 整数
3
>>> float(3) # 整数 -> 浮点数
3.0
>>> float('3') # 字符串 -> 浮点数
3.0
int()还可⽤于进制数转换,见下⽂。
⼩数类型(Decimal)
⼩数模块decimal,它有⼀个函数Decimal(),它是精确的,是可以指定⼩数位数的。
如果没有python基础,这⾥能看懂多少算多少,反正⼩数⽤的也不多。