【转载】转自振哥
数字
- 整数
- python2 有取值范围,溢出后自动转为长整型
- Python3 中为长整型,无位数限制 理论上内存有多大,位数可能就有多大
- 长整数
- Python2 中单独对应 Long 类型
- Python3 中不再有Long ,直接对应 int
- 浮点数
- 带小数的数字
- 如果不带数字,可能有e和E
- 复数
- 高数中的复数,例如:1+2j
下面是常用的数字相关的操作:
- / 返回浮点数
即便两个整数,/ 操作也会返回浮点数In [1]: 8/5 Out[1]: 1.6
- // 得到整数部分
使用 // 快速得到两数相除的整数部分,并且返回整型,此操作符容易忽略,但确实很实用。
```
In [2]: 8//5
Out[2]: 1
In [3]: a = 8//5
In [4]: type(a)
Out[4]: int
```
-
% 得到余数
% 得到两数相除的余数:In [6]: 8%5 Out[6]: 3
-
** 计算乘方
** 计算几次方In [7]: 2**3 Out[7]: 8
-
交互模式下的_
在交互模式下,上一次打印出来的表达式被赋值给变量 _In [8]: 2*3.02+1 Out[8]: 7.04 In [9]: 1+_ Out[9]: 8.04
-
十转二
将十进制转换为二进制:>>> bin(10) '0b1010'
-
十转八
十进制转换为八进制:>>> oct(9) '0o11'
-
十转十六
十进制转换为十六进制:>>> hex(15) '0xf'
-
转为浮点类型
整数或数值型字符串转换为浮点数>>> float(3) 3.0
如果不能转化为浮点数,则会报 ValueError:
>>> float('a') Traceback (most recent call last): File "<pyshell#7>", line 1, in <module> float('a') ValueError: could not convert string to float: 'a'
-
转为整型
int(x, base =10)
x 可能为字符串或数值,将 x 转换为整数:
>>> int('12',16) # 把base进制的数转化为十进制 16进制的'12'转化为10进制是8 18
-
商和余数
分别取商和余数>>> divmod(10,3) (3, 1)
-
幂和余同时做
pow 三个参数都给出,表示先幂运算再取余:>>> pow(3, 2, 4) 1
-
四舍五入
四舍五入,第二个参数代表小数点后保留几位:>>> round(10.045, 2) 10.04 >>> round(10.046, 2) 10.05
-
计算表达式
使用内置函数eval计算字符串型表达式的值:>>> s = "1 + 3 +5" >>> eval(s) 9 >>> eval('[1,3,5]*3') [1, 3, 5, 1, 3, 5, 1, 3, 5]
-
真假
真假布尔值本质上也是数字,所以也归并到此节中讨论。
以下四种情况都为假值:>>> bool(0) False >>> bool(False) False >>> bool(None) False >>> bool([]) False
以下这些情况为真:
>>> bool([False]) #[False] is a list True >>> bool([0,0,0]) True
-
all 判断元素是否都为真
所有元素都为真返回 True,否则返回False#有0,所以不是所有元素都为真
>>> all([1,0,3,6]) False
#所有元素都为真
>>> all([1,2,3]) True
-
any 判断是否至少有一个元素为真
至少有一个元素为真返回True,否则返回False# 没有一个元素为真 >>> any([0,0,0,[]]) False # 至少一个元素为真 >>> any([0,0,1]) True
-
链式比较
Python 支持下面这种链式比较,非常方便:>>> i = 3 >>> 1 < i < 3 False >>> 1 < i <=3 True
-
交换元素
Python 除了支持上面的链式比较外,还支持一种更加方便的操作:直接解包赋值。如下所示,1,3 解包后分别赋值给a, b ,利用此原理一行代码实现两个数字的直接交换。
a, b = 1, 3 a, b = b, a # 交换 a,b
如果明白此原理,下面的赋值操作就会迎刃而解:
a,b = 1, 3 a, b = b+1, a-1 print(a,b) # 结果是多少?
可能会有疑问:是 b+1 赋值给 a 后,a-1再赋值给 b ?
如果明白了上面的原理:等号右面完成压包,左侧再解包。
就会立即得出答案:肯定不是。
下面这行代码:
a, b = b+1, a-1 等价于: c = b+1, a-1 # 压包 a, b = c # 解包 答案是:a=4, b=0
压包和解包还有更加复杂的用法,放到后面进阶部分总结。
-
链式操作
下面这个例子使用 operator 模块中 add, sub 函数,根据操作符+,-,生成对应的函数,然后直接调用。很像设计模式中最频繁使用的对象工厂模式。
>>> from operator import (add, sub) >>> def add_or_sub(a, b, oper): return (add if oper == '+' else sub)(a, b) >>> add_or_sub(1, 2, '-') -1