随笔 - 65  文章 - 0 评论 - 0 阅读 - 28752
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

python模块主要分为以下三类:

  系统内置模块

(开源)三方模块

  自定义模块

⚠️ 自定义模块的命名不能和系统内置的模块重名,否则不能导入系统内置模块

一 数学相关模块

数学相关模块
  math模块

decimal模块

 

random模块

 

secrets模块

 

应用场景 和计算相关

Decimal可以避免浮点型计算结果丢失精度的问题

伪随机数模块,并非真正的随机

希望得到更加安全的随机数。python3.6版本以后,secrets模块用于生成高度加密的随机数,适于管理密码、账户验证、安全凭据及机密数据。

常见方法

ceil(x) 对数值x进行向上取整

floor(x) 对数值x进行向下取整

from decimal import getcontext, Decimal

random() 产生一个[0.0, 1.0) 范围内的随机浮点数

randint(a, b) 产生指定范围[a,b]内的随机整数

choice(seq) 从序列seq中随机抽取一个成员

choices(seq, k) 从序列seq中随机抽取k个成员,以列表格式返回结果

shuffle() 打乱列表中成员的排列循序

sample(s, k) 打乱一个不可变序列并随机提取k个成员返回新列表

 

import secrets, string 
实例

"""ceil 向上取整"""
print(math.ceil(1.9)) # 2
print(math.ceil(-1.9)) # -1

# 如果小数位精度太小,会出现精度丢失问题
print(math.ceil(1.000000000000000111)) # 1
print(math.ceil(-1.9999999999999999)) # -2

 

from decimal import getcontext, Decimal
"""如果要float浮点类型与decimal类型进行计算,则必须统一类型"""
"""所以Decimal里面的参数,务必是数字组成的字符串。"""
num = 0.1111
getcontext().prec= 3 #设置数字的精度
res = Decimal(str(num))+Decimal('0.111')-Decimal('0.2')
print(res,type(res)) #0.022 <class 'decimal.Decimal'>
import random
seq = "abdcef"
print(random.choice(seq)) #e
print(random.choices(seq, k=2)) #['d', 'b']

"""shuffle 打乱排列循序"""
seq = ["A", "B", "C", "D", "E", "F"]
random.shuffle(seq)
print(seq)#['D', 'E', 'C', 'B', 'A', 'F']

"""打乱一个不可变序列并随机提取k个成员返回新列表"""
s = "ABCDEFG"
data = random.sample(s, k=len(s))
print(data) #['B', 'E', 'D', 'C', 'A', 'F', 'G']
ret = "".join(data)
print(ret) # BEDCAFG
import secrets, string
"""生成指定长度的高强度密码串(字母数字组成,包含至少一个小写字母,至少一个大写字母以及至少三个数字)"""
def genstr(size):
# 密码有大小写字母,数字,特殊符号组成
characters = string.ascii_letters + string.digits +string.punctuation
# ecure_password = ""
# for i in range(size):
# ecure_password += secrets.choice(characters)
# return ecure_password
while True:
password = "".join(secrets.choice(characters) for i in range(size))
if (any(c.islower() for c in password)
and any(c.isupper() for c in password)
and sum(c.isdigit() for c in password) >= 3
and any(c in string.punctuation for c in password)):
break
return password

ret = genstr(8)
print(ret) #+w@B"+6j
"""生成安全Token(令牌),适用于密码重置、密保 URL 等应用场景"""
# 十六进制随机文本字符串组成的token
print(secrets.token_hex(2)) #c5fe
# www.qq.com?token=令牌字符串
# 安全的URL随机文本字符串
print(secrets.token_urlsafe(4))#zsrt1w

二 时间日期模块

时间日期相关模块
  时间模块time  日期时间模块datetime  日历模块calendar
应用场景 转化日期格式
datatime模块是python内置的加强版time模块,提供更多关于日期(date)、时间(time)、日期时间(datetime)、时间差(timedelta)、时区信息(timezone)等操作  关于年月周几的操作
常见方法

time() 获取本地时间戳,精度在微秒级别

sleep(seconds) 程序睡眠等待指定秒数(seconds=秒)

perf_counter() 性能计数器,用于计算程序运行的总秒数,从代码第一行开始从0计时。

process_time() 性能计算器,用于计算程序运行当前进程时的总秒数,不计算time.sleep()耗时。

timezone 获取当前时区与中时区的时间差。东加西减

首都北京是东八区(CST,UTC/GMT+8), 日本东京是东九区(JST,UTC/GMT+9), 美国纽约是西五区(UTC/GMT-5)。

datetime 日期时间对象,常用的属性有hour, minute, second, microsecond

timedelta 时间差,即两个时间点之间的距离或长度

 

monthcalendar(year, month) 按指定年月返回列表格式的日历信息,左起周一 
常用操作
import time
'''time模块中时间表现的格式主要有3种格式:时间戳,时间元组,格式化时间'''
"""time() 获取当前时间戳"""
timestamp = time.time()
print(f"timestamp={timestamp}") # timestamp=1649323220.1235719
"""根据指定时间戳->本地时间字符串"""
str_time = time.ctime(1649323220.1235719)#Thu Apr 7 17:20:20 2022
print(str_time)
"""perf_counter() 或 process_counter性能计数器"""
t1 = time.perf_counter()
t11 = time.process_time()
s = 0
for i in range(100000):
s+=i
time.sleep(2)
t2 = time.perf_counter()
t22 = time.process_time()
print(f"{t2-t1=}")#t2-t1=2.01480739
print(f"{t22-t11=}")#t22-t11=0.011088
"""时间元祖->时间戳"""
time_tuple = (2022,4,7,17,20,20,3,97,0)
timestamp = time.mktime(time_tuple)
print(timestamp) #1649323220.0
"""时间戳->时间元祖"""
#timestamp = time.localtime()#获取本地时间元组
time_tuple = time.localtime(1649323220.1235719)
print(time_tuple)#time.struct_time(tm_year=2022..
"""时间戳->时间元祖"""
#gmt = time.gmtime()#获取UTC(世界标准时间/GMT)的时间元组
gmt = time.gmtime(1649323220.1235719)
print(gmt)#time.struct_time(tm_year=2022..

"""时间元组->本地时间字符串"""
#str_time = time.asctime()#获取本地时间字符串
time_tuple = (2022,4,7,17,20,20,3,97,0)
str_time = time.asctime(time_tuple)
print(str_time)#Thu Apr 7 17:33:24 2022

"""格式化当前日期时间"""
ts = time.strftime("%Y-%m-%d %H:%M:%S") #格式化当前日期时间
print(ts)#2022-04-07 18:02:15
'''格式化日期->元组'''
# 从复杂文本中提取时间,文本内容和格式化字符串要匹配一致,不能缺少字符。
dt = "今年是2022年,2月22号22点22分22秒:宜婚嫁"
format = "今年是%Y年,%m月%d号%H点%M分%S秒:宜婚嫁"
tuple_time = time.strptime(dt, format)
# 时间元祖->格式化日期时间
str_time = time.strftime("%Y-%m-%d %H:%M:%S", tuple_time)
print(str_time)#2022-02-22 22:22:22
#指定秒时间戳->格式化日期时间
ts = 1645539742.456123
dt = time.strftime("%Y-%m-%d %H:%M:%S %Z", time.localtime(ts))
print(dt)#2022-02-22 22:22:22 CST

datetime.datetime方法

now(tz=None)获取当前本地系统时间的datetime对象,可指定时区 YYYY-mm-dd HH:MM:SS.ffffff

fromtimestamp(t, tz=None) 通过时间戳t获取datetime对象,可指定时区 YYYY-mm-dd HH:MM:SS

strptime(date_string, format) 对字符串date_string按format格式化字符串转成datetime对象 YYYY-mm-dd HH:MM:SS

strftime(fmt) 对datetime对象根据fmt格式化转成字符串 YYYY-mm-dd HH:MM:SS

from datetime import datetime
'''datetime.datetime'''
"""通过now获取当前本地系统时间的datetime对象"""
now = datetime.now()
print(now, type(now))#2022-04-07 19:47:27.687748 <class 'datetime.datetime'>
"""通过时间戳->datetime对象"""
dt1 = datetime.fromtimestamp(1649323220)
print(dt1)#2022-04-07 17:20:20
"""日期时间字符串->datetime对象"""
dt = datetime.strptime("2022-02-22 12:21:21","%Y-%m-%d %H:%M:%S")
print(dt, type(dt)) # 2022-02-22 12:21:21 <class 'datetime.datetime'>
# 获取对应的时间戳
print(dt.timestamp()) # 1645503681.0
"""将datetime对象->日期时间字符串"""
fdt = now.strftime("%Y-%m-%d %H:%M:%S")
print(fdt,type(fdt)) # 2022-04-07 19:53:25 <class 'str'>
"""datetime对象,不仅支持比较,也支持数学运算,数学运算的结果是一个时间差对象(timedelta)"""
# 例如:有个清明节亲子郊游活动,活动报名截止时间是:2022-04-10 00:00:00,根据当前时间,得到剩余的报名时间
now = datetime.now()
end = datetime.strptime("2022-04-10 00:00:00", "%Y-%m-%d %H:%M:%S")
td = end - now
print(td, type(td)) # 2 days, 4:00:33.114001 <class 'datetime.timedelta'>
print(td.days, td.seconds) # 2 14433 2天14433秒
print(td.total_seconds()) # 187233.114001 总秒数

datetime.timedelta:时间差或时间距离

from datetime import timedelta
"""
# 创建一个时间差对象
timedelta(
days=天,
seconds=秒,
microseconds=微秒,
milliseconds=毫秒,
minutes=分,
hours=时,
weeks=周
)
"""
# 2周的时间差对象
delta = timedelta(weeks=2)
print(delta)#14 days, 0:00:00
# 6.5小时的时间差对象
delta = timedelta(hours=6.5)
print(delta) # 6:30:00

delta = timedelta(hours=6, minutes=30)
print(delta) # 6:30:00
# 20分15秒的时间差对象
delta = timedelta(minutes=20, seconds=15)
print(delta) # 0:20:15
'''time对象只支持比较操作,date、datetime等对象支持任意比较与加减运算操作,timedelta对象支持所有操作。'''
"""计算当前时间距离过去某个时间的逝去时间"""
# 如果当前时间是2022-03-02 22:11:29,那么小红看到了小明在2022-01-02 12:30:00发布的一个微信动态距离当前时间过去多久了?
dt1 = datetime.datetime.strptime("2022-01-02 12:30:00", "%Y-%m-%d %H:%M:%S")
dt2 = datetime.datetime.strptime("2022-03-02 22:11:29", "%Y-%m-%d %H:%M:%S")
# # 当前时间 - 过去时间
delta = dt2 - dt1
print(delta) # 59 days, 9:41:29
"""获取指定年月的信息列表 (年份,月份) 左起周一"""
import calendar
ret = calendar.monthcalendar(2022, 10)
print(ret)
# [
# [0, 0, 0, 0, 0, 1, 2],
# [3, 4, 5, 6, 7, 8, 9],
# [10, 11, 12, 13, 14, 15, 16],
# [17, 18, 19, 20, 21, 22, 23],
# [24, 25, 26, 27, 28, 29, 30],
# [31, 0, 0, 0, 0, 0, 0]
# ]

附:

三 数据转换模块

在数据存储和读取过程中,一般需要数据转换,因为不管网络传输也好,还是保存数据到文件也罢,都只支持保存字符串或者二进制bytes类型数据,因此很多时候,针对python中如列表,元组,字典等数据类型,我们都需要进行格式转换。

# 序列化
    把不可直接存储的数据格式变成可存储数据格式,这个过程就是序列化过程。例如:字典/列表/对象等 => 字符串。
# 反序列化
    把可存储数据格式进行格式还原,这个过程就是反序列化过程。例如:字符串还原成字典/列表/对象等。

 

  json模块 pickle模块
说明

是一种轻量级的数据交换格式,易于人阅读和编写,常用于不同平台,不同编程语言之间进行数据传输,也常用于对编程开发过程中的数据存储结构或项目配置文件。

注意:在python中默认就是符合json语法的字符串数据。json提供了json字符串与其他数据格式之间的序列化和反序列化操作

pickle类型处理数据后的数据是二进制的,所以对于数据相对于json格式而言,更加紧凑(避免json空行占空间),性能更好。
语法  
常用操作
实例
import json
"""
json在python中就是字符串类型,但是该字符串必须符合json语法。
序列化方法
json.dump(obj, fp, indent=None, ensure_ascii=True)
把数据obj转换格式为json字符串并写入到fp文件对象中.
如果指定indent,则按长度缩进写入
如果指定ensure_ascii=True,则对多字节字符转换成unicode编码

json.dumps(obj, indent=None, ensure_ascii=True)
把数据obj转换格式为json字符串
如果指定indent,则按长度缩进写入
如果指定ensure_ascii=True,则对多字节字符转换成unicode编码
"""

"""写入数据到json文件中"""
data = [ {"name": "小明","age":16}, {"name": "王华","age":16}]
fp = open("data.json", "w", encoding="utf-8")
json.dump(data, fp,indent=None, ensure_ascii=False)
"""字典数据转换json格式字符串"""
ret = json.dumps(data,indent=None,ensure_ascii=False)
print(ret)#[{"name": "小明", "age": 16}, {"name": "王华", "age": 16}]
"""从指定文件中读取json数据并反序列化"""
data = json.load(open("data.json", "r", encoding="utf-8"))
print(data) # [{'name': '小明', 'age': 16}, {'name': '王华', 'age': 16}]
import pickle
"""序列化一个数据成bytes类型"""
data = {"name": "小明", "age": 13}
ret = pickle.dumps(data)
print(ret) # b'\x80\x04\x95\x1d\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x06\xe5\xb0\x8f\xe6\x98\x8e\x94\x8c\x03age\x94K\ru.'

"""序列化一个数据成bytes类型并写入指定文件"""
data = {"name": "小明", "age": 13}
fp = open("1.db", "wb")
pickle.dump(data, fp)
bs=b'\x80\x04\x95\x1d\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x06\xe5\xb0\x8f\xe6\x98\x8e\x94\x8c\x03age\x94K\ru.'
"""把数据反序列化还原格式"""
data = pickle.loads(bs)
print(data, type(data))#{'name': '小明', 'age': 13} <class 'dict'>
"""从指定文件中读取数据并反序列化还原格式"""
fp = open("1.db", "rb")
data = pickle.load(fp)
print(data, type(data))#{'name': '小明', 'age': 13} <class 'dict'>
"""pickle的强大之处在于,除了能处理8种基本数据类型以外,针对后面所学的面向对象的数据类型也支持.json仅支持8中基本数据类型转换"""
 
对比

1. json模块常用于将Python数据转换为通用的json格式传递给其它系统或客户端,常见于web开发,测试开发,运维开发。
pickle模块常用于将python数据转换为二进制格式数据,其序列化之后的数据只能被Python识别,因此只能用于Python系统内部。

2. json序列化后的数据本质上还是字符串,所以明文显示,没有任何保密性,数据存储不够紧凑,存在空间浪费
pickle序列化后的数据是二进制安全bytes类型,不会明文显示,具有一定保密性,数据存储格式紧凑,性能优越。

3. 都是内置模块,所以都有更优的替代方案。
内置的json模块采用C语言编写,针对于海量数据转换来说,可以考虑rust开发的rjson模块。
内置的pickle模块,虽然性能较好,但是保密性不足,跨平台性不足,此时可以考虑采用itsdangrous模块。

四 安全加密模块

哈希函数:哈希的本质,就是把任意长度的输入内容,通过Hash算法变成不可逆的固定长度的输出内容(哈希值,散列值,消息摘要),输出内容通常用16进制的字符串表示。哈希的过程是单向的,只有加密,没有解密。因此你可以把字符串进行哈希获取哈希值,但无法从哈希值逆转获取原始字符串。常用于信息加密,开发中的常见应用场景有:数据加密,数据校验,负载均衡等。

哈希碰撞/冲突:两个不同的数据经过Hash函数计算得到的Hash值一样。哈希碰撞无法被完全避免。只能采用各种方法来尽量避免,降低发生的概率。

  hashlib模块 hmac模块
说明 哈希碰撞无法被完全避免。只能采用各种方法来尽量避免,降低发生的概率。python里面提供了内置函数hash()。 黑客可以通过彩虹表(一种密码破解的工具)根据哈希值反推原始登陆密码,那么用户在服务器中的数据就变得不安全。所以,需要使用hmac等安全级别更高的加密模块。hmac是一种基于Hash函数和密钥进行消息认证的方法,使用hmac函数比标准hash函数更安全,只要改动秘钥(盐值),同样的数据,也会产生不同的哈希值。
实例
import hashlib
"""md5加密"""
content = "hello world"
md5 = hashlib.md5()
md5.update(content.encode('utf-8')) # hash是基于字节的,所以需要注意编码问题
res = md5.hexdigest()
print(f"加密结果:{res}") # 5eb63bbbe01eeed093cb22bb8f5acdc3

"""针对大数据的哈希计算,可以分多次哈希,最终的哈希值是一样的"""
md5 = hashlib.md5()
md5.update('welcome to python! welcome to beijing!'.encode('utf-8'))
print(md5.hexdigest()) # a1b89154c1e7274499530cd8b3e7f278

md5 = hashlib.md5() #重新定义md5
md5.update('welcome to python! '.encode('utf-8'))
print(md5.hexdigest()) # 891a55288ee147f8d5725bf22c956a9f
md5.update('welcome to beijing!'.encode('utf-8'))# md5.update会将每次字符串拼接。若不想拼接,每次使用update之前都要重新定义:md5=hashlib.md5()
print(md5.hexdigest()) # a1b89154c1e7274499530cd8b3e7f278
"""sha1加密.."""
content = "hello world"
sha1 = hashlib.sha1()
sha1.update(content.encode('utf-8'))
res = sha1.hexdigest()
print(f"加密结果:{res}") # 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed
"""hmac 基于hash算法与密钥的加密技术"""
import hmac, secrets
password = "123456"
secret_key = secrets.token_hex()
# 参数1:秘钥(盐值),参数2:密码,参数3:加密算法
data = hmac.new(secret_key.encode("utf-8"), password.encode("utf-8"), "sha256")
ret = data.hexdigest()
print(ret) # 1d687207dc1d54a31681b68bc83a5eab3293b664cdeb643e33fe1eb14d4f0bf9
 
posted on   大明花花  阅读(501)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示