数值类型
python的数值类型包括常规的类型:整数(没有小数部分的数字)、浮点数(通俗地说,就是有小数部分的数字)以及其它数值类型(复数、分数、有理数、无理数、集合、进制数等)。除了十进制整数,还有二进制数、八进制数、十六进制数。
1
2
3
4
5
6
7 类型 示例---------------------------------------
整数 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就被丢弃了,它会等待垃圾回收器去回收。关于可变、不可变对象,后面的文章将会经常提到,请先留意这两个词。
可见,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的内置数学函数:
1
2
3
4
5
6
7
8
9pow():求幂,如pow(2,3)=8abs():求绝对值,如abs(-3)=3round():四舍五入,如round(3.5)=4int():取整(截去小数部分),如int(3.5)=3float():转换成浮点数,如float(3)=3.0oct():十进制整数转换成八进制hex():十进制整数转换成十六进制整数bin():十进制整数转换成二进制
...等等...
还有专门的数学模块math、取随机数的模块random等。
浮点数
由于硬件的原因,使得计算机对于浮点数的处理总是不精确的。
例如,按照数学运算时,1.1-0.9=0.2,但实际得到的结果为:
1
2>>> 1.1-0.9
0.20000000000000007
它以高精度的极限趋近的值来显示。上面的趋近结果大于按照数学运算结果,但并不总是如此,例如下面的运算则是小于数学运算的结果:
1
2>>> 3.3-3.2
0.09999999999999964
由于浮点数不精确,所以尽量不要对两个浮点数数进行等值==和不等值!=比较.如果非要比较,应该通过它们的减法求绝对值,再与一个足够小(不会影响结果)的值做不等比较。
例如:
1
2
3
4
5>>> (3.2-2.8) == 0.4
False
>>> abs((3.2-2.8)-0.4) < 0.0002
True
最后,浮点数并非总是输出很长精度的值。正如前面的运算:
1
2
3
4>>> 3.2+3.26.4>>> 3/100.3
浮点数有两个特殊方法,一个是is_integer(),用来测试这个浮点数是否是整数,另一个是as_integer_ratio(),可以将浮点数转换成分子分母组成的元组,不过这个方法并非总是如你所想的那样友好。例如: