math模块
Python官方提供的 math 模块进行数学运算,如指数、对数、平方根和三角函数等运算。math 模块中的函数只是整数和浮点,不包括复数,复数计算需要使用 cmath模块。在使用 math 模块前要先导入 math 模块。
舍入函数
函数名 | 说明 |
---|---|
math.ceil(a) | 返回大于或等于 a 的最小整数 |
math.floor(a) | 返回小于或等于 a 的最大整数 |
round(a) | 对 a 进行四舍五入运算 |
示例代码如下
import math
a = 1.6
b = 1.4
a1 = math.ceil(a)
a2 = math.floor(a)
a3 = round(a)
b1 = round(b)
print(a1,a2,a3,b1)
代码运行结果
2 1 2 1Process finished with exit code 0
幂和对数函数
示例代码如下
import math
a1 = math.log(16,2) # 以 2为底的 16 的对数
a2 = math.sqrt(16)
a3 = math.pow(2,4)
a4 = math.log(100) # 以自然数对数为底的 100 的对数
print(a1,a2,a3,a4)
代码运行结果
4.0 4.0 16.0 4.605170185988092Process finished with exit code 0
三角函数
函数名 | 说明 |
---|---|
math.sin(a) | 返回弧度 a 的三角正弦 |
math.cos(a) | 返回弧度 a 的三角余弦 |
math.tan(a) | 返回弧度 a 的三角正切 |
math.asin(a) | 返回弧度 a 的反正弦 |
math.acos(a) | 返回弧度 a 的反余弦 |
math.atan(a) | 返回弧度 a 的反正切 |
math.degrees(a) | 将弧度 a 转为角度 |
math.radians(a) | 将角度 a 转为弧度 |
math.isclose(a,b) | 比较两个浮点数是否足够接近(检查两个数是否在一定的容忍度内相等) |
示例代码如下
import math
a1 = math.degrees(math.pi) # 将π转为角度
print(a1)
a2 = math.radians(180/math.pi)
print(a2)
a3 = math.sin(math.pi)
a4 = math.cos(math.pi)
a5 = math.tan(math.pi)
print(a3,a4,a5)
'''
输出结果为1.2246467991473532e-16 -1.0 -1.2246467991473532e-16
当在代码中使用 math.sin(math.pi) 和 math.tan(math.pi) 时
由于浮点数的精度限制,结果可能会有非常小的非零值
这是因为在计算机中,π 的表示可能不会精确到无限小数点后的所有位数
导致计算结果出现轻微的误差。
在 Python 中,math.pi 提供的是 π 的一个近似值
当它被用于 math.sin 和 math.tan 函数时
由于浮点数的这种不精确性,结果可能会有非常微小的非零值
这就是为什么 a3 和 a5 的输出不是精确的 0,而是接近 0 的一个非常小的数
要解决这个问题,可以使用 Python 的 math.isclose 函数来比较两个浮点数是否足够接近
'''
print(math.isclose(a3, 0)) # True
print(math.isclose(a5, 0)) # Truea6 = math.asin(1)
a7 = math.acos(-1)
a8 = math.atan(math.pi/4)
print(a6,a7,a8)
代码运行结果
180.0
1.0
1.2246467991473532e-16 -1.0 -1.2246467991473532e-16
False
False
1.5707963267948966 3.141592653589793 0.6657737500283538Process finished with exit code 0
random模块
random模块提供了一些生成随机数的函数
函数名 | 说明 |
---|---|
random.random() | 返回在范围大于或等于0.0,且小于1.0内的随机数 |
random.randrange(stop) | 返回在范围大于或等于0,且小于 stop 内,步长为1的随机整数 |
random.randrange(start,stop[,step]) | 返回在范围内大于或等于 start ,且小于 stop 内,步长为 step 的随机整数 |
random.randint(a,b) | 返回在范围内大于或等于 a,且小于或等于 b 之间的随机整数 |
示例代码如下
import randoma1 = random.random()
print(a1)
a2 = random.randrange(10)
print(a2)
a3 = random.randrange(5,25,5)
print(a3)
a4 = random.randint(5,10)
print(a4)
代码运行结果
0.00197103160217893
9
5
7Process finished with exit code 0
datetime模块
Python官方提供的日期和时间模块主要有 time 和 datetime 模块。time 偏重于底层平台,模块中大多数函数会调用本地平台上的C链接库,因此有些函数运行的结果,在不同的平台上会有所不同。datetime模块对 time 模块进行了封装,提供了高级API。
datetime模块中提供了以下几个类:
datetime:包含日期和时间
date:只包含日期
time:只包含时间
timedelta:计算时间跨度
tzinfo:时区信息
datetime、date和time类
(1)datetime类
一个datetime对象可以表示日期和时间等信息,创建datetime对象可以用如下构造方法:
datetime.datetime(year,month,day,hour=0,minute=0,second=0,microsecond=0,tzinfo=None)# 其中year、month、day三个参数不能省略;tzinfo是时区参数,默认值是None表示不指定时区
除了 tzinfo 外,其他的参数全为合理范围内的整数。这些参数的取值范围如下表所示,一旦超过该范围就会抛出 ValueError。
参数 | 取值范围 | 说明 |
---|---|---|
year | datetime.MINYEAR<=year<=datetime.MAXYEAR | datetime.MINYEAR常量是最小年,datetime.MAXYEAR常量是最大年 |
month | 1<=month<=12 | |
day | 1<=day<=给定年份和月份时,改月的最大正整数 | 此处需要注意闰年二月是比较特殊的,有29天 |
hour | 0<=hour<=24 | |
minute | 0<=minute=60 | |
second | 0<=second<=60 | |
microsecond | 0<=microsecond<1000000 |
除了通过构造方法创建并初始化 datetime 对象,还可以通过 datetime 类提供的一些类方法获得 datetime 对象
类方法 | 说明 |
---|---|
datetime.today() | 返回当前本地日期和时间 |
datetime.now(tz=None) | 返回指定时区的本地当前日期和时间,如果参数tz为None或未指定,则等同于today() |
datetime.utcnow() | 返回当前UTC日期和时间 |
datetime.fromtimestamp(timestamp,tz=None) | 返回与UNIX时间戳对应的本地日期和时间(已经被弃用,因为 Python 计划在未来的版本中移除它) |
datetime.utcfromtimestamp(timestamp) | 返回与UNIX时间戳对应的UTC日期和时间(已经被弃用,因为 Python 计划在未来的版本中移除它) |
示例代码如下
import datetimea = datetime.datetime(2024,6,26)
print(a)
a1 = datetime.datetime.today()
print(a1)
a2 = datetime.datetime.now()
print(a2)
a3 = datetime.datetime.utcnow()
print(a3)
a4 = datetime.datetime.fromtimestamp(999999)
a5 = datetime.datetime.utcfromtimestamp(999999)
print(a4,a5)
代码运行结果
2024-06-26 00:00:00
2024-06-26 19:20:46.141310
2024-06-26 19:20:46.141310
2024-06-26 11:20:46.141310
1970-01-12 21:46:39 1970-01-12 13:46:39
D:\creation\PythonStudy\Pythonproject\mypro01\mypy01.py:9: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).a3 = datetime.datetime.utcnow()
D:\creation\PythonStudy\Pythonproject\mypro01\mypy01.py:12: DeprecationWarning: datetime.datetime.utcfromtimestamp() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.fromtimestamp(timestamp, datetime.UTC).a5 = datetime.datetime.utcfromtimestamp(999999)Process finished with exit code 0
注意:
- 在Python语言中时间戳单位是“秒”,所以会有小数部分。而其他语言如Java单位是“毫秒”,当跨平台计算时间时需要注意这个差别。
- UTC即协调世界时间,它以原子时为基础,是时刻上尽量接近世界时的一种时间计量系统。UTC比GMT更加精确(GMT即格林尼治标准时间,是19世纪中叶大英帝国的标准时间,也是世界基准时间)。
- UNIX时间戳自UTC时间1970年1月1日00:00:00以来至现在的总秒数。
(2)date类
一个 date 对象可以表示日期等信息,创建 date 对象可以使用如下构造方法:
datetime.date(year,month,day)# 其中year、month和day三个参数不能省略
在使用时需要导入 datetime 模块,除了使用构造方法创建并初始化 date 对象外,也可以通过 date 类提供的一些类方法获得 date 对象
类方法 | 说明 |
---|---|
date.today() | 返回当前本地日期 |
date.fromtimestamp(timestamp) | 返回与UNIX时间戳对应的本地日期 |
示例代码如下
import datetimea = datetime.date(2024,6,26)
print(a)
a1 = datetime.date.today()
print(a1)
a2 = datetime.date.fromtimestamp(999999999.999)
print(a2)
代码运行结果
2024-06-26
2024-06-26
2001-09-09
(3)time类
一个 time 对象可以表示一天中时间信息创建 time 对象可以使用如下构造方法
datetime.date(hour=0,minute=0,second=0,microsecond=0,tzinfo=None)
示例代码如下
import datetimea = datetime.time(19,40)
print(a)
代码运行结果
19:40:00Process finished with exit code 0
日期时间计算
timedelta 对象用于计算 datetime、date 和 time 对象时间间隔。timedelta 类构造方法如下:
datetime.timedelta(days=0,seconds=0,microsecond=0,milliseconds=0,mintes=0,hours=0,weeks=0)
所有参数都素可选的,参数可以是整数或浮点数、正数或负数。在 timedelta 内部只保存 days (天)、seconds(秒) 和 microseconds(微秒)变量,因此其他参数都应换算为这三个参数。
示例代码如下
import datetime
d = datetime.date.today() # 获得本地时间
print(d)
delta = datetime.timedelta(10) # 创建10天的timedelta对象
d += delta
print(d)
d1 = datetime.date(2024,6,26) # 创建2024年6月26日对象
print(d1)
delta1 = datetime.timedelta(weeks=6) # 创建5周的timedelta对象
d1 -= delta1
print(d1)
代码运行结果
2024-06-26
2024-07-06
2024-06-26
2024-05-15Process finished with exit code 0
日期时间格式化和解析
无论是日期还是时间,当显示在界面上时,都需要进行格式化输出,使它能够符合当地人查看日期和时间的习惯。与日期时间格式化输出相反的操作为日期时间的解析,当用户使用应用程序界面输入日期时,计算机能够读入的是字符串,经过解析这些字符串获得日期时间对象。Python中日期时间格式化使用 strftime()方法,date、datetime 和 time 三个类中都有一个实例方法 strftime(format);而日期时间解析使用datetime.striptime(date_string,format)类方法,date 和 time 没有striptime()方法。方法 strftime()和strptime()中都有一个格式化参数 format,用来控制日期时间的格式。
常用的日期和时间格式控制符 | ||
---|---|---|
指令 | 含义 | 示例 |
%m | 两位月份表示 | 01 |
%y | 两位年份表示 | 24 |
%Y | 四位年份表示 | 2024 |
%d | 两位表示月内中的一天 | 26 |
%H | 两位小时表示(24小时制) | 20 |
%I | 两位小时表示(12小时制) | 01 |
%p | AM或PM区域性设置 | AM、PM |
%M | 两位分钟表示 | 01 |
%S | 两位秒表示 | 01 |
%f | 以6为数表示微秒 | 000000 |
%z | +HHMM或-HHMM形式的UTC偏移 | +0000 |
%Z | 时区名称 | UTC、EST、CST,如果没有设置时区为空 |
示例代码如下
import datetimed = datetime.datetime.today()
d.strftime('%Y-%m-%d %H:%M:%S')
print(d)str_date = '2024-06-26 20:26:30'
date = datetime.datetime.strptime(str_date,'%Y-%m-%d %H:%M:%S')
print(date)
代码运行结果
2024-06-26 20:28:02.663327
2024-06-26 20:26:30
时区
datetime 和 time 对象只是单纯地表示本地的日期和时间,没有时区信息。如果想带有时区信息,可以使用 timezone 类,它是 tzinfo 的子类,提供了UTC偏移时区的实现。timezone 类构造方法如下:
datetime.timezone(offset,name=None)
其中 offset 是UTC偏移量,+8是东八区,北京在此时区;-5是西五区,纽约在此时区;0是零时区,伦敦在此时区。name是时区名字。
示例代码如下
from datetime import datetime,timezone,timedeltautc_dt = datetime(2024,6,26,12,59,59,tzinfo=timezone.utc)
print(utc_dt)
a1 = utc_dt.strftime('%Y-%m-%d %H:%M:%S %Z')
print(a1)
a2 = utc_dt.strftime('%Y-%m-%d %H:%M:%S %z')
print(a2)bj_tz = timezone(offset=timedelta(hours=8),name='Asia/Beijing')
print(bj_tz)
bj_dt = utc_dt.astimezone(bj_tz)
print(bj_dt)
代码运行结果
2024-06-26 12:59:59+00:00
2024-06-26 12:59:59 UTC
2024-06-26 12:59:59 +0000
Asia/Beijing
2024-06-26 20:59:59+08:00