python cookbook 内容提炼 第三章 数字日期和时间

11 篇文章 0 订阅

python cookbook 内容提炼 第三章 数字日期和时间

延续前两篇博客,我们继续进行对python cookbook 这本书的内容的提炼。

还是一样,粗体部分为重要内容:

3.1 数字的四舍五入

3.2 执行精确的浮点数运算

3.3 数字的格式化输出

3.4 二八十六进制整数处理

3.5 字节到大整数的打包与解包
3.6 复数的数学运算

3.7 无穷大与NaN

3.8 分数运算

3.9 大型数组运算

3.10 矩阵与线性代数运

3.11 随机选择

3.12 日期与时间段运算

3.13 计算当前月份的日期范围

3.14 字符串转换为日期

3.15 结合时区的日期操作

3.1 数字的四舍五入

对浮点数执行指定精度的舍入运算。

典型的就是通过round实现,实现的是四舍五入取舍。



print(round(1.23, 1))
print(round(1.235, 2))
print(round(1.234, 2))
print(round(1.24243, 3))

在这里插入图片描述

还一种是通过format实现四舍五入:

x = 1.23456

print(format(x, '0.3f'))
print(format(x, '0.4f'))

在这里插入图片描述

3.2 执行精确的浮点数运算

浮点数的一个普遍问题是它们并不能精确的表示十进制数。 并且,即使是最简单的数学
运算也会产生小的误差,比如:

a = 4.2
b = 2.1
print(a + b)

在这里插入图片描述
说实在的,博主以前也没怎么注意这个问题。
这些错误是由底层CPU和IEEE 754标准通过自己的浮点单位去执行算术时的特征。 由于Python的浮点数据类型使用底层表示存储数据,因此你没办法去避免这样的误差。
可以使用 decimal 模块解决这个问题:

a = 4.2
b = 2.1
print(a + b)

print((a + b) == 6.3)

from decimal import Decimal
a = Decimal('4.2')
b = Decimal('2.1')


print(a + b)

print((a + b) == Decimal('6.3'))

结果如下:
在这里插入图片描述

这个可能开发中用的少,但是对于经常做数值分析,数值运算的还是很重要的。decimal 模块实现了IBM的”通用小数运算规范”。如果我们需要很规范的小数规范,可以考虑这个库。

再来看一个问题:


nums = [1.23e+18, 1, -1.23e+18]
print(sum(nums)) # Noticehow1 disappears

import math
print(math.fsum(nums))

结果:
在这里插入图片描述

说实在的,博主以前都没发现,原来还会有这些bug,学习一下帮助还是很大的。

3.3 数字的格式化输出

3.2 执行精确的浮点数运

3.3 数字的格式化输出

将数字格式化后输出,并控制数字的位数、对齐、千位分隔符和其他的细节。

格式化输出单个数字的时候,可以使用内置的 format() 函数,比如:



x = 1234.56789
print(format(x, '0.2f'))

print(format(x, '>10.1f'))

print(format(x, '<10.1f'))

print(format(x, '^10.1f'))

print(format(x, ','))

print(format(x, '12,.1f'))
print(format(x, ',.1f'))


结果:
在这里插入图片描述

这样说吧


print(format(x, '>10.1f'))

print(format(x, '<10.1f'))

print(format(x, '^10.1f'))

这三行代码中 >10 <10 ^10是对齐方式的设置。如果数值是0,那就默认直接靠左对齐。大家后面可以多学习学习,其实对齐问题在上一章中可以处理,我们把数据变成字符串,然后对齐处理,再显示也是不错的方案。
.1f是保留几位小数。

print(format(x, '12,.1f'))

这个,表示千分位要加逗号,这个不常用。

还一种是 ‘E’,'e’显示:

print(format(x, 'e'))
print(format(x, '0.2E'))

在这里插入图片描述

3.4 二八十六进制整数处理

转换或者输出使用二进制,八进制或十六进制表示的整数。
为了将整数转换为二进制、八进制或十六进制的文本串, 可以分别使用 bin() , oct() 或hex()。
这部分知识,很多初学者应该都学过,开发中可能就是一些特定领域用的多。

十进制转 二进制 八进制 六进制输出:

x = 1234
print(bin(x))
print(oct(x))
print(hex(x))


print(format(x, 'b'))

print(format(x, 'o'))
print(format(x, 'x'))

结果:
在这里插入图片描述
肯定不能只是知道十进制怎么转过去,也要知道怎么转回来,不然没有实际应用价值,就像只知道去上班的路,不知道回家的路。


print(int('4F2', 16))

print(int('62', 8))

print(int('00101', 8))

结果:
在这里插入图片描述

3.5 字节到大整数的打包与解包

有一个字节字符串并想将它解压成一个整数。或者,需要将一个大整数转换为一个字节字符串。

来看一下代码怎么实现的:
可以通过int.from_byte解码,big:代表正常顺序,little:逆序


data= b'\x00\x124V\x00x\x90\xab\x00\xcd\xef\x01\x00#\x004'


print(int.from_bytes(data, 'little'))

print(int.from_bytes(data, 'big'))

在这里插入图片描述

怎么译码我们也要会:


x = 94522842520747284487117727783387188
print(x.to_bytes(16, 'big'))
print(x.to_bytes(16, 'little'))

在这里插入图片描述

3.6 复数的数学运算

复数表示:

a = complex(2, 4)

b=3+5j
print(a)
print(b)

在这里插入图片描述
复数运算:


print(a.real,a.imag)
print(a+b)
print(a-b)

print(a*b)
print(a/b)

在这里插入图片描述

复数函数使用:


import cmath
print(cmath.sin(a))
print(cmath.cos(a))
print(cmath.exp(a))

结果:
在这里插入图片描述
这一部分是一些做数学方便的人可能会用到。
注:用numpy 也可以对复数进行处理和运算。

3.7 无穷大与NaN

创建或测试正无穷、负无穷或NaN(非数字)的浮点数。

讲道理,这个博主经常碰到这个开发问题,以前就是以一种不规范的方式处理了,这块内容还是很重要的。
来看一段代码:

a = float('inf')
b = float('-inf')
c = float('nan')
print(a,b,c)
print(math.isinf(a))
print(math.isnan(c))
print(math.isnan(a))

结果如下:
在这里插入图片描述

这部分知识点虽然少,但是很实用。

3.8 分数运算

from fractions import Fraction
a = Fraction(5, 4)
b = Fraction(7, 16)
print(a + b)

print(a * b)

c = a * b
print(c.numerator)
print(c.denominator)

运行结果如下:
在这里插入图片描述
这块内容其实,在一些特殊问题上常用,比如做一些数学推导啥的。

3.9 大型数组运算

这一块内容,就不细说了,主要是通过numpy实现,后面博主打算,做一另一本书的笔记,叫做python科学计算,做数据分析,数学建模,人工智能的应该都会听过这本书,很棒的一本书,好像是六七百页,后面我会出。
numpy制作一些简单例子,以前其实,我做过相关内容:



import numpy as np
ax = np.array([1, 2, 3, 4])
ay = np.array([5, 6, 7, 8])
print(ax * 2)
print(ax + 10)

结果:
在这里插入图片描述

3.10 矩阵与线性代数运

进行矩阵和线性代数运算,比如矩阵乘法、寻找行列式、求解线性方程组等等。
这部分内容可是干货哦:

import numpy as np

m = np.matrix([[1,-2,3],[0,4,5],[7,8,-9]])
print(m)

#矩阵转置
print(m.I)

在这里插入图片描述
求逆矩阵:

#求逆矩阵
print(m.I)

在这里插入图片描述
矩阵相乘:



#矩阵相乘
v = np.matrix([[2],[3],[4]])
print(m*v)

在这里插入图片描述

再来看一些线性代码方便的简单应用:


import numpy.linalg
#求行列式

print(numpy.linalg.det(m))

#特征值
print(numpy.linalg.eigvals(m))


##矩阵求解
print(numpy.linalg.solve(m, v))

在这里插入图片描述

3.11 随机选择

从一个序列中随机抽取若干元素,或者想生成几个随机数。

这个是很重要的一个知识点,我们来看一下怎么实现的:

import random

values = [1, 2, 3,4, 5, 6]
#从一个序列中随机的抽取一个元素
print(random.choice(values))
#从一个序列中随机的抽取多个元素

print(random.sample(values, 3))


#随机打乱一个序列
random.shuffle(values)
print(values)
#从一个范围内随机取一个整数


print(random.randint(0,10))
#为了生成0到1范围内均匀分布的浮点数

print(random.random())

结果:
在这里插入图片描述
这部分内容很实用哦。

3.12 日期与时间段运算

构建时间段实例,并进行相关的计算:

from datetime import timedelta


a = timedelta(days=2, hours=6)

b = timedelta(hours=4.5)
c = a + b

print(c.days)
print(c.total_seconds() /3600)

在这里插入图片描述

c就是a和b两个时间段的相加。

来看一下,时间段和日期进行相关的运算:

from datetime import datetime

a = datetime(2012,9, 23)
b = datetime(2012,12,21)

print(a + timedelta(days=10))

print((b-a).days)

now = datetime.today()

print(now)

截图:
在这里插入图片描述

这一节内容还是很重要的,可以学习学习。

3.13 计算当前月份的日期范围

这个内容就是,给与一个日期,然后,我们可以找到这个日期所在日期的最后一天和第一天。

from datetime import datetime, date, timedelta
import calendar
def get_month_range(start_date=None):
    if start_date is None:
         start_date = date.today().replace(day=1)
    _, days_in_month =calendar.monthrange(start_date.year, start_date.month)
    end_date = start_date + timedelta(days=days_in_month)-timedelta(days=1)
    return (start_date,end_date)


first_day, last_day= get_month_range()
print(first_day, last_day)

运行结果:
在这里插入图片描述

这个内容没有太多好说的。。。

3.14 字符串转换为日期

本质上就是根据格式进行日期转化,这个一般用在不太复杂的数据上,效果比较好。

from datetime import datetime
text = '2012-09-20'
y = datetime.strptime(text, '%Y-%m-%d')
print(y)

nice_z = datetime.strftime(y, '%A %B %d,%Y')

结果:
在这里插入图片描述
上面还有日期转字符串的。

3.15 结合时区的日期操作

日期本地化:

from datetime import datetime

from pytz import timezone
d = datetime(2012,12,21, 9, 30, 0)
central = timezone('US/Central')

loc_d = central.localize(d)

print(loc_d)

在这里插入图片描述

日期本地化之后才可以进行转化为其他地区的日期,需要有参考。
日期地区参考转化。

bang_d = loc_d.astimezone(timezone('Asia/Kolkata'))

print(bang_d)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值