python的数值类型包括常规的类型:整数(没有小数部分的数字)、浮点数(通俗地说,就是有小数部分的数字)以及其它数值类型(复数、分数、有理数、无理数、集合、进制数等)。除了十进制整数,还有二进制数、八进制数、十六进制数。java
类型 示例 --------------------------------------- 整数 1234, -24, 0 浮点数 1.23, 1., .2, 3.14e-10 八进制 0o177, 0O177 十六进制 0x9ff, 0X9ff 二进制 0b1010, 0B1010
须要说明的几点事项:python
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)
:dom
>>> 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,表示无穷大。编程语言
又是几个注意事项:函数
/
获得的结果老是浮点数(例如9/3=3.0
),后面还有一种地板除法(floor)不同。+
和乘号*
也能处理字符串:
+
能够链接字符串,例如"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等。线程
因为硬件的缘由,使得计算机对于浮点数的处理老是不精确的。code
例如,按照数学运算时,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,也能提供精确的小数运算。
/
:实现的是真除法。在python中,它老是返回浮点数值。//
:实现的是floor地板除法,它会去掉除法运算后的小数位,以便获得小于运算结果的最大整数。若是参与运算的有小数,则返回浮点数,不然返回整数看下面的示例。
真除法老是返回浮点数。
>>> 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()和math.trunc()两种截断小数的方式。例如:
>>> round(10/4) 2 >>> round(-5.2/2) -3 >>> import math # import表示导入某个模块 >>> math.trunc(5/2) 2 >>> math.trunc(-5.2/2) -2
int()也能够直接截断小数。
>>> int(3.6) 3 >>> int(-3.6) -3
实际上它们表示根据给定参数在内存中构造一个整数、浮点数对象,因此能够用来做为类型转换工具。并且,前面已经说过,int()能够用来截断小数位。
>>> int(3.5) # 浮点数 -> 整数 3 >>> int(-3.6) # 浮点数 -> 整数 -3 >>> int('3') # 字符串 -> 整数 3 >>> float(3) # 整数 -> 浮点数 3.0 >>> float('3') # 字符串 -> 浮点数 3.0
int()还可用于进制数转换,见下文。
小数模块decimal,它有一个函数Decimal(),它是精确的,是能够指定小数位数的。
若是没有python基础,这里能看懂多少算多少,反正小数用的也很少。
例如,使用浮点数计算
>>> 0.1 * 3 - 0.3 5.551115123125783e-17
它本该等于0,但结果倒是无限接近于0,由于计算机硬件用于存储数值位数的空间有限。
使用decimal模块的Decimal()能够构造精确的小数。例如:
>>> import decimal >>> decimal.Decimal('0.1') * 3 - decimal.Decimal('0.3') Decimal('0.0')
注意,Decimal()的参数都是字符串,若是不加引号,它仍是会解释成浮点数。
>>> decimal.Decimal(0.1) Decimal('0.1000000000000000055511151231257827021181583404541015625')
Decimal()的运算的结果会取最长的小数位数。
>>> decimal.Decimal('0.1') * 3 - decimal.Decimal('0.300') Decimal('0.000')
能够设置decimal的精度,也就是小数位数。有两种范围的精度:全局范围、局部范围。
例如,没有设置精度时,会保留不少位数的小数。
>>> import decimal >>> decimal.Decimal(1) / decimal.Decimal(7) Decimal('0.1428571428571428571428571429')
设置全局范围的精度为4,即保留4位小数:
>>> import decimal >>> decimal.getcontext().prec = 4 >>> decimal.Decimal(1) / decimal.Decimal(7) Decimal('0.1429')
全局范围的精度表示整个线程执行时,这个模块的精度都是4。
还能够设置局部范围的精度,局部表示退出了这个范围就失效了。使用with/as语句能够设置局部精度,因此退出with/as语句块精度的设置就失效了。
>>> with decimal.localcontext() as ctx: ... ctx.prec = 2 ... decimal.Decimal(1) / decimal.Decimal(7) ... Decimal('0.14') >>> decimal.Decimal(1) / decimal.Decimal(7) Decimal('0.1429') # 由于前面设置了全局精度为4
分数模块fractions,它有一个函数Fraction(),它能够构建分数。有了分数以后,能够参与运算。分数和浮点数不一样,分数是精确的。
一样地,若是没有python基础,这里能看懂多少算多少,反正用的也很少。
例如,构建分数三分之一。
>>> import fractions >>> fractions.Fraction(1,3) Fraction(1, 3)
还能够根据浮点数的字符串格式构建分数。
>>> fractions.Fraction('0.3') Fraction(3, 10)
而后能够用分数进行运算。
分数加整数:
>>> fractions.Fraction(1,3) + 1 Fraction(4, 3)
分数加、减、乘、除分数:
>>> fractions.Fraction(1,3) + fractions.Fraction(2,3) Fraction(1, 1) >>> fractions.Fraction(1,3) - fractions.Fraction(2,3) Fraction(-1, 3) >>> fractions.Fraction(1,3) * fractions.Fraction(2,3) Fraction(2, 9) >>> fractions.Fraction(1,3) / fractions.Fraction(2,3) Fraction(1, 2)
实际上,float对象有一个as_integer_ratio()函数,能够将浮点数转换成整数的元组表示形式(元组后面的文章会介绍),而后根据这个元组就能够构造出分数来。
例如,将2.5转换成元组,并进而转换成分数。
>>> (2.5).as_integer_ratio() (5, 2) # 获得元组 >>> fractions.Fraction(*(2.5).as_integer_ratio()) Fraction(5, 2)
例如,将十进制的64转换成二进制、八进制、十六进制整数。
>>> bin(64),oct(64),hex(64) ('0b1000000', '0o100', '0x40')
int()函数也能进行进制转换,它的用法格式为:
int(x, base=10)
base指定要将x解释成哪一个进制位的数,而后转换成十进制数,也就是前面说的构造一个整数对象。不指定base时,默认解释成10进制。
base的值能够是0或2-36之间的任意一个数,base=0也表示解释成10进制。
例如,将二进制的数转换为十进制整数。
>>> int('0b11',base=2) 3 >>> int('11',base=2) 3
既然x要解释成某个进制的数,那么超出这个进制的数天然不能出现。例如:
例如,将一个字符串解释为15进制,并转换成整数。15进制只能出现0-九、a-eA-E这几个字符。
>>> int('93E', base=15) 2084