Number(数)
Number是Python3中的六个标准数据类型之一。也是不可变数据。
Python中的数有四种类型:
int(整数)— 通常被称为整型或整数,是正或负整数,不带小数点。Python3中,只有一种整数类型
int
,表示为长整型,所以在Python3中不需要考虑整型是否会溢出的问题。bool(布尔)— 布尔值使用常量
True
和False
表示。float(浮点数)— 浮点型由整数部分与小数部分组成,浮点也可以使用科学计数法表示
complex(复数)
每个数都是一个对象(Object),在计算机内存中都有自己的一个 “家”(即地址),这象征着它的身份。
>>> id(2)
10914528
>>> id(3.0)
140424546017928
>>> id(False)
10300256
>>> id(4+3j)
140424514687920
这里的id()
函数是Python中的一个内建函数,用于查看内存地址,且得到的结果是只读的。上面返回的各个结果不同,也说明了,上面的几个“数”是不同的对象。除此之外,能够标识它们不一样的身份的还有一个函数,那就是type()
函数。
>>> type(2)
<class 'int'>
>>> type(3.0)
<class 'float'>
>>> type(False)
<class 'bool'>
>>> type(4+3j)
<class 'complex'>
内建函数type()
能够查看对象的类型。与id()
的结果类似,type()
得到的结果也是只读的。
此外,还可以用isinstance()
函数来判断对象类型。
>>> a = 11
>>> isinstance(a,int)
True
>>> isinstance(a,float)
False
数值的运算
>>> 2+3 #加法
5
>>> 4.3-2 #减法
2.3
>>> 2*3 #乘法
6
>>> 4/2 #除法,得到一个浮点数
2.0
>>> 4//2 #除法,得到一个整数(也叫地板除)
2
>>> 8%3 #取模(取余)
2
>>> 2**4 #乘方
16
除法
这里单独来讲一下除法,因为它常常会给人带来困惑,不仅是在Python中,在其他高级编程语言中也是一样的。更何况,在Python2和Python3中除法也不尽相同,不过本文还是以Python3为主来讲解。
>>> 4/2
2.0
>>>
>>> 4.0/2
2.0
>>> 4/2.0
2.0
>>> 4.0/2.0
2.0
观察以上代码会发现,两个整数相除,结果却是浮点数。但,这就是Python3的规则。如果我们想要得到整型的结果可以这样做
>>> 4//2
2
//
的操作结果是取得两个数相除的商,“商”肯定是一个整数,并且这个整数不是/
操作之后得到的结果进行四舍五入,通俗地说是“取整”。
奇怪的计算
在Python3中,除法运算的结果是浮点数。不过像下面的计算就有点奇怪了。
>>> 10.0/3
3.3333333333333335
按照数学知识,计算结果应该是3.3333….,后面的3是无限循环。这样的话,计算机就停不下来了,满屏都是3。为了避免出现这样的情况,Python终结了循环,但是并没有按照“四舍五入”的原则终止。
还有更奇怪的计算结果:
>>> 0.1+0.7
0.7999999999999999
>>> 0.1+0.7-0.8
-1.1102230246251565e-16
>>> 0.1+0.2+0.3-0.6
1.1102230246251565e-16
what??,为什么这么简单的问题在计算机会出现这样的情况?其实,出现这样的情况是由于十进制数和二进制数的转换。计算机用二进制数进行计算,但在上面的例子中,我们输入的是十进制数,所以计算机需要把十进制的数转化为二进制数,然后再进行计算。但是,在将类似0.1这样的浮点数转化为二进制数时,就出现问题了。0.1转化为二进制数后,不会精确等于十进制数的0.1。同时,计算机存储的位数是有限制的,所以,就出现了上述现象。实际上,这种问题不仅在Python中会遇到,在所有支持浮点数运算的编程语言中都会遇到,它不是Python的Bug。不过一般情况下,只要简单地将最终的显示结果“四舍五入”到所期望的十进制位数,就会得到满意的最终结果。
元素交换
Python支持下面这种直接解包赋值的操作
>>> x,y = 2,3
>>> print('x=',x,'y=',y)
x= 2 y= 3
>>> x,y = y,x
>>> print('x=',x,'y=',y)
x= 3 y= 2
>>> x,y = 2,3
>>> x,y = y+2,x-1
>>> print(x,y)
注意,上面的表达式,会不会是y+2
先赋值给a
,然后a-1
再赋值给b
呢?答案肯定是不会的,因为等号右边完成压包后,左侧才解包。所以上面的答案是a=5,y=1
进制转换
十进制转二进制
>>> bin(10)
'0b1010'
十进制转八进制
>>> oct(8)
'0o10'
十进制转十六进制
>>> hex(12)
'0xc'
类型转换
整数或数值型字符串转为浮点数
>>> float(2)
2.0
当然,不是所有类型都能转化为浮点数,当不能转化时,则会报ValueError
:
>>> float('a')
Traceback (most recent call last):
File "", line 1, in
ValueError: could not convert string to float: 'a'
转为整数型
int(x,[base])
,x
可能为字符串或数值,将x
按照base
进制转换为整数,若base
不写则默认为十进制。
>>> int('10',16)
16
>>> int('10',10)
10
>>> int('10',8)
8
>>> int('10',2)
2
常用数学函数
分别取商和余数
上面数值运算可以通过//
和%
分别取得商和余数,下面可以使用函数直接获取商和余数。
>>> divmod(10,3)
(3, 1)
幂运算
>>> pow(2,3)
8
幂运算后再取余
>>> pow(2,3,3)
2
四舍五入
>>> round(1.23546)
1
>>> round(1.23456,2) #第二个参数表示要保留的小数位数
1.23
>>> round(1.23456,3)
1.235
计算表达式
计算字符串表达式的值
>>> a = "2 + 5 * 3"
>>> eval(a)
17
返回最值
>>> max(1,2)
2
>>> min(1,2)
1
返回绝对值
>>> abs(-2)
2
返回平方根
>>> import math
>>> math.sqrt(4)
2.0
判真假函数
bool
函数
>>> bool(0)
False
>>> bool(False)
False
>>> bool(None)
False
>>> bool([])
False
>>> bool([False])
True
>>> bool([0,0])
True
all
函数判断元素是否都为真
所有元素都为真返回True
,否则返回False
>>> all([1,0,3,5])
False
>>> all([1,2,3,5])
True
any
函数判断是否至少有一个元素为真
至少有一个元素为真返回True
,否则返回False
>>> any([0,False,[]])
False
>>> any([0,False,True,[]])
True
链式比较
Python支持的一种链式比较
>>> 1 2
False
>>> 1 2
True