1对浮点数执行指定精度的舍入计算
解决办法:对于简单的舍入计算,使用内置的round(value,ndigits)函数,当一个值刚好在两个边界的中间的时候,round函数返回离他最近的偶数,也就是说1.5和2.5都返回2...传给round函数的ndigits参数可以是负数.(-1,-2,-3)最后一位,倒数第二位...
2执行精确地浮点数计算(有一定的性能损耗)
decimal. 更精确的适用于金融数学,要是对精度没有那么高的要求还是使用原生的,因为原生的函数比较快
from decimal import localcontext,Decimal
a=Decimal('1.3')
b=Decimal('1.7')
print(a/b)
out[]:0.7647058823529411764705882353
from decimal import localcontext,Decimal
a=Decimal('1.3')
b=Decimal('1.7')
with localcontext() as ctx:ctx.prec=3print(a/b)
out[]:0.765
nums=[1.23e+18,1,-1.23e+18]
sum(nums)
out[]:0
import math
math.fsum(nums)
out[]:1.0 #使用更精确
3数字的格式化输出
x=1234.56789
format(x,'0.2f')
format(x,'>10.2f')
format(x,'<10.2f')
format(x,'^10.2f')
format(x,'e')
format(x,'0.2E')
4 2816进制整数
bin(),oct(),hex() 不想有ob这样的前缀可以使用format,format(value,'b/o/x'),负数的时候显示直接是带着负号的,要是想显示无符号数可以这样format(2**32+value,'b/o/x'),为了不同的进制转换成整数字符串,简单的使用带有禁止的int()函数即可 int('4d2',16)
5字节到大整数的打包与解包
为了将bytes解析为整数,使用int.from_bytes()方法,并可以指定字节顺序,int.form_bytes(data,'little/big') int型x , x.to_bytes(16,'big')
字节顺顺序规则(little或big)仅仅指定了构建整数时的字节的低位高位排列方式. int.bit_length()方法来决定需要多少个字节来存储这个值
7无穷大与NaN
创建或测试正无穷,负无穷或NaN的浮点数
float('inf') float('-inf') float('nan')
为了测试这些值的存在 math.isinf() math.isnan()
8分数计算
fractions模块可以被用来执行包括分数的数学运算.
from fractions import Fraction
a=Fraction(5,4)
9大型数组计算:
numpy库...比标准的Python列表更适合用来做数学运算..numpy中的标量运算会作用在每一个元素上,
10矩阵与线性代数运算
矩阵与线性代数运算,矩阵乘法,寻找行列式,求解线性方程组等
import numpy as np
m=np.matrix([[1,-2,3],[0,4,5],[7,8,-9]])
m.T#矩阵的转置
numpy.linalg子包中可以找到更多的操作函数
11随机选择
random模块有大量的函数用来产生随机数和随机选择元素..random.choice()
import numpy as np
m=np.matrix([[1,-2,3],[0,4,5],[7,8,-9]])
random.sample(values,2)
random.shuffle(values)#打乱顺序
random.randint(0,10)#生成随机整数
random.random()#生成0到1范围内均匀分布的浮点数
random.getrandbits(10)#获取N位随机数(二进制)的整数
random.seed()#修改初始化种子
random.seed(123) random.seed(b'bytedata') #seed based on integer/byte given
random.uniform(a,b)#计算均匀分布随机数
random.gauss(u,sigma)#计算正态分布随机数
12基本的日期和时间转换
为了执行不同时间单位的转换与计算,使用datetime模块,表示一个时间段,可以创建一个timedelta
from datetime import timedelta
a=timedelta(days=2,hours=6)
b=timedelta(hours=4.5)
c=a+b
print(c.days,c.seconds)from datetime import datetime
a=datetime(2012,9,23)
print(a+timedelta(days=10))datetime.today()
datetime.now()
datetime会自动处理闰年.. 更加复杂的日期操作,比如处理时区,模糊时间范围,节假日计算等等,可以使用dateutil
dateutil.relativedelta()函数进行时间计算 a+relativedelta(month=+1)
13计算最后一个周五的日期
datetime模块中有工具和类来执行这样的计算
weekdays=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']
def get_prev(datename,start_date=None):if start_date is None:start_date=datetime.today()now_week=start_date.weekday()target_week=weekdays.index(datename)days_ago=(7+now_week-target_week)%7if days_ago==0:days_ago=7target_day=start_date-timedelta(days=days_ago)return target_day
get_prev('Monday')
14计算当前月份的日期范围:循环该月日期的每一天
from datetime import datetime,timedelta
import calendar
def get_month(start_date=None):if start_date is None:start_date=datetime.today().replace(day=1)_,monthday=calendar.monthrange(start_date.year,start_date.month) #返回该月的天数,月数...for i in range(monthday):print(timedelta(i)+start_date)end_date=start_date+timedelta(monthday)return start_date,end_date
get_month()#生成器写法def day_range(start,stop,step):while start<stop:yield startstart=start+step
for d in day_range(datetime(2018,10,23),datetime(2018,11,25),timedelta(days=6)):print (d)
15字符串转化为日期:
text='2102-09-20'
y=datetime.strptime(text,'%Y-%m-%d')
#数据量多的话使用split因为比strptime函数要快很多(7倍)
from datetime import datetime
def splistr(str):year,month,day=str.split('-')return datetime(int(year),int(month),int(day))
splistr('2018-09-09')
P127 chapter four