一、对数值进行取整:round(value,ndigits)
>>> round(15.5,-1) #可以取负数 20.0 >>> round(15.5,0) #当某个值恰好等于两个整数间的一半时,取整操作会取到离该值最近的那个偶数上 16.0 >>> round(16.5,0) #如上同例 16.0
#float提供17位的精度
二、对小数进行精确计算:decimal模块(规避float天生的精度误差,但效率低,常用于金融领域)
>>> a = 1.1 >>> b = 2.2 >>> a + b 3.3000000000000003 >>> (a + b) == 3.3 False >>> from decimal import Decimal >>> a = Decimal('1.1') >>> b = Decimal('2.2') >>> a + b Decimal('3.3') >>> print(a + b) 3.3 >>> print(float(a + b)) 3.3
三、format()格式化输出:{「参数索引或名称」:「填充符」「对齐方式<>^」「width」「数值千分位,」「精度.ndigits」}.format("a", "b", ...)
>>> print("{0:=^20,.1f}, {1:+>20}".format(1000.235, 'haha')) ======1,000.2=======, ++++++++++++++++haha >>> print("{b:=^20,.1f}, {a:+>20}".format(b=1000.235, a='haha')) ======1,000.2=======, ++++++++++++++++haha
'!a'
(应用 ascii()),'!s'
(应用 str() )和 '!r'
(应用 repr() )可以在格式化之前转换值
>>> print('{!a}'.format('1.001')) '1.001' >>> print('{!r}'.format('1.001')) '1.001' >>> print('{!s}'.format('1.001')) 1.001
传入一个字典,用中括号( '[]'
)访问它的键:
>>> table = {'a': 10,'b': 20} >>> print('a is {1},b is {0}'.format(*table.values())) a is 10,b is 20 >>> print('a is {0[a]},b is {0[b]}'.format(table)) a is 10,b is 20 >>> print('a is {a},b is {b}'.format(**table)) a is 10,b is 20
四、进制转换
>>> x = -1234 >>> bin(x) #十进制转二进制 '-0b10011010010' >>> oct(x) #十进制转八进制 '-0o2322' >>> hex(x) #十进制转十六进制 '-0x4d2' >>> int(-0x4d2) #十六进制转十进制 -1234
五、Python中大部分和数学相关的模块都适用于复数,但Python的标准数学函数默认不能产生数值,若需要产生复数结果,须使用cmath模块
>>> import math >>> math.sqrt(-1) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: math domain error >>> import cmath >>> cmath.sqrt(-1) 1j
六、正负无穷大(inf、-inf)、NaN(not a number,如两个无穷大之间的运算结果)
>>> a = float('inf') >>> a inf >>> b = -a >>> b -inf >>> b / 2 -inf >>> 2 / b -0.0 >>> a + b nan >>> a * b -inf
注1:运算结果根据使用环境判断,inf、-inf具备传染性
注2:nan会通过所有的操作进行传播,且不会引发任何异常
注3:对两个nan进行逻辑比较的结果是False,唯一安全检测nan的方法是math.isnan()
七、处理分数:fractions模块
#允许用户以分数的形式输入,免去了用户手动将数据转换为float或Decimal对象的麻烦,提升用户体验
from fractions import Fraction >>> a = Fraction(2, 3) >>> b = Fraction(4, 5) >>> a Fraction(2, 3) >>> b Fraction(4, 5) >>> a < b True >>> a + b Fraction(22, 15) >>> a * b >>> float(a) #分数转化为浮点数 0.6666666666666666 >>> a.numerator #取分子 2 >>> a.denominator #取分母 3
八、大型数组计算:NumPy模块
#NumPy为Python提供了数组对象,比标准Python中的列表有着更好的性能表现,更加适用于数学计算,底层实现上,NumPy采用和C相同的内存分配方式,即大块的连续内存,其效率通常比math模块中的函数快100倍左右
NumPy中的数组在进行标量运算时是针对逐个元素进行计算的:
>>> import numpy as np #惯例写为np >>> ax = np.array([1, 2, 3, 4]) >>> ay = np.array([10, 12, 13, 14]) >>> ax * 2 array([2, 4, 6, 8]) >>> ax / 2 array([ 0.5, 1. , 1.5, 2. ]) >>> ax * ay array([10, 24, 39, 56]) >>> ax - ay array([ -9, -10, -10, -10])
NumPy中提供了一些“通用函数”集合,可用于math模块中对应函数的替代:
>>> math.sqrt(4) 2.0 >>> np.sqrt(4) #效率更高 2.0 >>> np.sqrt(ay) #math.sqrt()不能计算数组对象 array([ 3.16227766, 3.46410162, 3.60555128, 3.74165739]) >>> np.sin(ax) array([ 0.84147098, 0.90929743, 0.14112001, -0.7568025 ])
NumPy扩展了Python列表的索引功能(尤其是多维数组方面):
>>> az = np.array([[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12],[13, 14, 15, 16]]) >>> az array([[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12], [13, 14, 15, 16]]) >>> az[0:2,2:4] array([[3, 4], [7, 8]]) >>> az[0:2,:] array([[1, 2, 3, 4], [5, 6, 7, 8]]) >>> az[0:2] array([[1, 2, 3, 4], [5, 6, 7, 8]]) >>> az[:,1:3] #取第2、3两列 array([[ 2, 3], [ 6, 7], [10, 11], [14, 15]]) >>> az[,1:3] #只取列的时候,行部分不能留空! File "<stdin>", line 1 az[,1:3] ^ SyntaxError: invalid syntax
条件替换(逻辑类似于列表推导式):
>>> np.where(az>10, 100, 99) array([[ 99, 99, 99, 99], [ 99, 99, 99, 99], [ 99, 99, 100, 100], [100, 100, 100, 100]]) >>> np.where(az>10, az, 99) array([[99, 99, 99, 99], [99, 99, 99, 99], [99, 99, 11, 12], [13, 14, 15, 16]])
九、矩阵与线性代数计算:numpy.matrix
>>> type(mz) <class 'numpy.matrixlib.defmatrix.matrix'> >>> mz matrix([[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12], [13, 14, 15, 16]]) >>> mz.T #矩阵行列转置 matrix([[ 1, 5, 9, 13], [ 2, 6, 10, 14], [ 3, 7, 11, 15], [ 4, 8, 12, 16]])
十、随机选择:random模块(可用于均匀分布、正态分布、高斯分布等概率分布计算,不可用于加密,加密可用ssl模块)
从队列中随机选取N个元素:
>>> b [1, 2, 3, 4, 8, 9] >>> random.sample(b, 1) [2] >>> random.sample(b, 1) [3] >>> random.sample(b, 3) [3, 2, 8] >>> random.sample(b, 3) [4, 9, 2]
原地打乱元素的顺序:
>>> o [6, 3, 2, 4, 5, 7, 1] >>> random.shuffle(o) >>> o [1, 3, 5, 7, 6, 2, 4]
产生随机整数:
>>> random.randint(-100,10) -80 >>> random.randint(-100,10) 5
产生0-1之间的随机浮点数:
>>> random.random() 0.08408738274480865 >>> random.random() 0.3307587395045867
由N个随机bits所表示的整数(即N位随机二进制数字所表示的int):
>>> random.getrandbits(10) 932 >>> random.getrandbits(10) 684 >>> random.getrandbits(100) 449049712738822352045673826991 >>> random.getrandbits(100) 838121576315938044329535728101
十一、显示当天的日期
>>> from datetime import datetime >>> datetime.today() datetime.datetime(2016, 8, 11, 13, 8, 2, 369594)