1. 数字的舍入round(value, ndigits)
当一个值刚好在两个边界的中间的时候, round 函数返回离它最近的偶数。也就是说,对1.5 或者2.5 的舍入运算都会得到2。
传给round() 函数的ndigits 参数可以是负数,这种情况下,舍入运算会作用在十位、百位、千位等上面。
如果你仅仅是想格式化数字,最好使用format函数
2. 浮点数的精度计算
浮点数的一个普遍问题是它们并不能精确的表示十进制数。如果你想更加精确(并能容忍一定的性能损耗),你可以使用decimal 模块。decimal 模块的一个主要特征是允许你控制计算的每一方面,包括数字位数和四舍五入运算。decimal 模块主要用在涉及到金融的领域,其它时候还是不要用的好。
>>> a = 4.2
>>> b = 2.1
>>> a + b
6.300000000000001
>>> (a + b) == 6.3
False
>>> from decimal import Decimal
>>> a = Decimal('4.2')
>>> b = Decimal('2.1')
>>> a + b
Decimal('6.3')
>>> print(a + b)
6.3
>>> (a + b) == Decimal('6.3')
True
>>> from decimal import localcontext
>>> a = Decimal('1.3')
>>> b = Decimal('1.7')
>>> print(a / b)
0.7647058823529411764705882353
>>> with localcontext() as ctx:
... ctx.prec = 3
... print(a / b)
...
0.765
3. 使用二进制,八进制或十六进制表示的整数
可以分别使用bin() ,oct() 或hex() 函数,format函数也支持格式化,参数为'b','o','x'
>>> x = 1234
>>> bin(x)
'0b10011010010'
>>> oct(x)
'0o2322'
>>> hex(x)
'0x4d2'
4. bytes和整数转换:int.from bytes()、int.to bytes()
5. 复数的数学运算
复数可以用使用函数complex(real, imag) 或者是带有后缀j 的浮点数来指定。对应的实部、虚部和共轭复数可以很容易的获取。
>>> a = complex(2, 4)
>>> b = 3 - 5j
>>> a.real
2.0
>>> a.imag
4.0
>>> a.conjugate()
(2-4j)
>>> a + b
(5-1j)
>>> a * b
(26+2j)
>>> a / b
(-0.4117647058823529+0.6470588235294118j)
>>> abs(a)
4.47213595499958
如果要执行其他的复数函数比如正弦、余弦或平方根,使用cmath 模块。
6. 正无穷、负无穷或NaN(非数字) 的浮点数
>>> a = float('inf')
>>> b = float('-inf')
>>> c = float('nan')
>>> a
inf
>>> math.isinf(a)
True
>>> c + 23
nan
7. 分数运算
fractions 模块可以被用来执行包含分数的数学运算
>>> from fractions import Fraction
>>> a = Fraction(5, 4)
>>> b = Fraction(7, 16)
>>> print(a + b)
27/16
>>> print(a * b)
35/64
>>> c = a * b
>>> c.numerator
35
>>> c.denominator
64
>>> float(c)
0.546875
>>> print(c.limit_denominator(8))
4/7
>>> x = 3.75
>>> y = Fraction(*x.as_integer_ratio())
>>> y
Fraction(15, 4)
8. 大型数组运算
涉及到数组的重量级运算操作,可以使用NumPy 库。NumPy 还为数组操作提供了大量的通用函数,这些函数可以作为math 模块中类似函数的替代。
>>> import numpy as np
>>> ax = np.array([1, 2, 3, 4])
>>> ay = np.array([5, 6, 7, 8])
>>> ax * 2
array([2, 4, 6, 8])
>>> ax + ay
array([ 6, 8, 10, 12])
>>> np.sqrt(ax)
array([ 1. , 1.41421356, 1.73205081, 2. ])
如果你想构造一个10,000*10,000 的浮点数二维网格,很轻松:
>>> grid = np.zeros(shape=(10000,10000), dtype=float)
>>> grid
array([[ 0., 0., 0., ..., 0., 0., 0.],
[ 0., 0., 0., ..., 0., 0., 0.],
[ 0., 0., 0., ..., 0., 0., 0.],
...,
[ 0., 0., 0., ..., 0., 0., 0.],
[ 0., 0., 0., ..., 0., 0., 0.],
[ 0., 0., 0., ..., 0., 0., 0.]])
关于NumPy 有一点需要特别的主意,那就是它扩展Python 列表的索引功能- 特别是对于多维数组。
>>> a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
>>> a[1]
array([5, 6, 7, 8])
>>> # Select column 1
>>> a[:,1]
array([ 2, 6, 10])
>>> # Select a subregion and change it
>>> a[1:3, 1:3]
array([[ 6, 7],
[10, 11]])
9. 矩阵与线性代数运算
NumPy 库有一个矩阵对象可以用来解决这个问题。
>>> import numpy as np
>>> m = np.matrix([[1,-2,3],[0,4,5],[7,8,-9]])
>>> m
matrix([[ 1, -2, 3],
[ 0, 4, 5],
[ 7, 8, -9]])
>>> # Return transpose
>>> m.T
matrix([[ 1, 0, 7],
[-2, 4, 8],
[ 3, 5, -9]])
10. 随机数
random 模块有大量的函数用来产生随机数和随机选择元素。
>>> import random
>>> values = [1, 2, 3, 4, 5, 6]
#随机取一个
>>> random.choice(values)
2
#随机取其中n个
>>> random.sample(values, 2)
[6, 2]
#随机打乱
>>> random.shuffle(values)
>>> values
[2, 4, 6, 5, 3, 1]
#生成随机整数
>>> random.randint(0,10)
2
#生成0 到1 范围内均匀分布的浮点数
>>> random.random()
0.9406677561675867
#获取N 位随机位(二进制) 的整数
>>> random.getrandbits(200)
335837000776573622800628485064121869519521710558559406913275
#通过random.seed() 函数修改初始化种子
random.seed() # Seed based on system time or os.urandom()
random.seed(12345) # Seed based on integer given
在random 模块中的函数不应该用在和密码学相关的程序中。如果你确实需要类似的功能,可以使用ssl 模块中相应的函数。比如, ssl.RAND bytes() 可以用来生成一个安全的随机字节序列。