模块基础知识
# 项目 > 包 > 模块 > 变量\方法\类 # 在python中,模块是代码组织的一种方式,把功能相近的函数或类放到一个文件中,一个文件(.py)就是一个模块,模块名就是文件名去掉py后缀. # 好处:提高代码可复用性和可维护性,一个模块编写完成后,很方便在其他项目中导入.解决了命名冲突问题,不同模块相同的命名不会冲突. # 模块中可以存放变量,函数,类三种类型,并且在 import 模块名后,可以使用模块名进行调用 模块名.变量 模块名.函数 模块名.类
常用标准库:
builtins 内建函数默认加载
math 数学库
random 生产随机数
time 时间
datetime 日期和时间
calendar 日历
hashlib 加密算法
copy 拷贝
functool 常用的工具
os 操作系统接口
re 字符串正则匹配
sys python自身运行环境
multiprocessing 多进程
threading 多线程
json 编码和解码json对象
logging 日志记录,调试
# 在开发过程中肯定会遇到不同的问题,但如果已经有模块解决了这部分问题,我们就可以把这个模块叫过来帮忙.(基于项目导包) # 我们可以通过以下方式实现模块导入(导入也是一个动作,会默认将模块内的代码加载进内存空间): # 1- import 模块名: 这种方法导入模块,我们在需要使用模块中的变量\函数\类的时候,都需要以(模块名.变量 模块名.函数 模块名.类)的形式来调用# 2- from 模块名 import 变量,函数,类: 表示从模块中导入具体功能,这种方法导入模块可以直接使用导入的模块变量\函数\类# 3- from 模块名 import *: 表示导入该模块的所有内容,模块中可以定义__all__=[用来限制可以被*导入的变量\方法\类]# 4- from 包名 import 模块名: 导入后,需要使用 (模块名.变量\方法\类) 的方式调用# 5- from 包名.模块名 import 变量,函数,类: 如果导入某个包名下的模块,可以使用这个方法,导入进来的变量,函数,类可以直接使用.# 6- from .模块名 import 变量,函数,类: '.'表示从当前包内导入# 不管是import还是from的方式导入模块,都会将模块内的内容进行加载.这时模块中有方法调用的话,加载模块时就会执行模块中调用的方法. # 如果不希望执行这个方法,需要使用 __name__ . __name__在自己的模块中值为__main__,出了本模块__name__的值为自身模块名.所以可以进行判断.
# 文件夹可以存放一些非.py文件# 包中存放的都是.py文件,包在创建后会自动创建一个__init__.py文件(初始化加载),包中存放多个模块.# __init__.py文件的功能1: 只要导入这个包的时候,就会默认执行__init__.py中的内容,将__init__中的内容加载进内存,里面的方法和类可以使用包名调用. # 如果有些使用这个包就需要的出现的东西,就可以写在这里进行初始化加载.# 功能2: 如果使用from 包名 import *: 这种方式想要把这个包内的所有内容导入,需要在__init__.py模块中添加__all__ = [向外暴露的模块],否则无法导入
# 关于循环导入: 架构出错会出现循环导入问题
from B import b
# A.py中def a(self):b()from A import a
# B.py中def b(self):a()
# 上面的两个类分别处于两个模块中.当运行a()方法时,会因为需要B模块中的b()方法而执行 'from B import b' # 当导入时B模块中的b()方法时需要执行a()方法,所以会执行 'from A import a' 这样就会陷入循环导入而报错. # 避免循环导入: 1-重新架构 2-可以将导入语句放到函数体中或最后,需要使用时才进行导入,例如下方所示:
A.py中def a(self):from B import bb()
常用标准类库的使用
# 系统模块
print(sys.path) # 系统会在哪些目录下搜索你要加载进来的模块,并按照搜索顺序依次打印
print(sys.version) # 3.10.10 (tags/v3.10.10:aad5f6a, Feb 7 2023, 17:20:36) [MSC v.1929 64 bit (AMD64)]
print(sys.argv) # ['D:\\python_Projects\\object_try\\Object_12系统模块.py'] 运行程序时的一些参数 argv是一个列表,默认存放程序本身
# time模块
print(time.time()) # 1681367610.33326
# 返回当前时间(以秒为单位)浮点数表示 得到时间戳 经常用来求执行某段代码的时间差time.sleep(1) # 延迟执行给定的秒数。# 将时间戳形式转换成字符串或元组形式
t = time.time()
print(time.ctime(t)) # 将传入的时间戳转为字符串形式 Thu Apr 13 14:38:00 2023
print(time.localtime(t)) # 以元组的形式转换时间戳 time.struct_time(tm_year=2023, tm_mon=4, tm_mday=13, tm_hour=14, tm_min=39, tm_sec=26, tm_wday=3, tm_yday=103, tm_isdst=0)# 将time.time()的元组形式转换为时间戳
l = time.localtime(t)
print(l.tm_year) # 2023 元组形式的好处,可以使用元组时间戳对象单独访问元组的内容(年,月,日)
print(l.tm_mon) # 4
print(time.mktime(l)) # 1681368145.0 去掉精度值# 将元组的时间转换为字符串 根据格式规范将时间元组转换为字符串。
strf_time = time.strftime('%Y-%m-%d %H:%M:%S')
print(strf_time) # 2023-04-13 14:49:33 根据格式转换# 将字符串转换为元组的方式
r = time.strptime('2023-04-13', '%Y-%m-%d')
print(r) # time.struct_time(tm_year=2023, tm_mon=4, tm_mday=13, tm_hour=0, ...)
# datetime模块
datetime模块下有:time 时间date 日期datatime 日期时间timedelta 时间差 时间差值经常在缓存设置时通过与时间差计算,得到缓存保留多长时间的作用
print(datetime.time) # <class 'datetime.time'> 返回datetime.time对象
print(datetime.date) # <class 'datetime.date'> 返回datetime.date对象
print(datetime.date.today()) # 2023-04-13 返回当前日期now = datetime.datetime.now() # 得到当前日期和时间的时间戳
print(now) # 2023-04-13 15:12:53.024391
timedelta = datetime.timedelta(hours=5) # 时间差值:支持传递参数有days=0, seconds=0, microseconds=0,milliseconds=0, minutes=0, hours=0, weeks=0
print(timedelta) # 5:00:00 当前timedelta的值(时间差值)
time_fix = now + timedelta # 假如说要保存5个小时,通过计算得到结果.timedelta支持两个timedate对象进行计算操作
print(time_fix) # 五小时后失效的时间为:2023-04-13 20:12:53.024391
# random模块
print(random.random()) # 得到0-1之间的随机小数
# randrange(start,end,[步长]),如有步长,则会从通过步长遍历后的范围内得到随机数 (1, 10, 2) => 1,3,5,7,9
print(random.randrange(1, 10)) # 从start到end中随机一个数字.但不包含end这个数字
print(random.randint(1, 10)) # 从start到end随机一个数字,包含end
# choice(seq) 从非空序列中选择一个随机元素
list1 = ['你', '我', '他']
print(random.choice(list1)) # 我\你\他
# shuffle(x) 打乱列表顺序,函数返回None
random.shuffle(list1)
print(list1) # 打乱后顺序:['你', '我', '他'] => ['他', '我', '你']
random完成验证码功能
def get_verifycode():code = ''for i in range(4):# 从0,9之间随机一个数字转换为字符串形式ran1 = str(random.randint(0, 9))# 从Unicode字符中随机一个,并通过chr()将Unicode字符强转为str ord()则反之ran2 = chr(random.randint(65, 90))ran3 = chr(random.randint(97, 122))r = random.choice([ran1, ran2, ran3])code += rreturn codeprint(get_verifycode()) # 9N0t
hashlib模块
# 加密算法 支持'md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512', # 'blake2b', 'blake2s', # 'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', # 'shake_128', 'shake_256' 加密
msg = '我爱你'
md_5 = hashlib.md5(msg.encode('utf-8'))
print(md_5.hexdigest()) # 4f2016c6b934d55bd7120e5d0e62cce3 加密之后的数据
第三方库
# 第三方库 : 非标准库的模块,需要自己导入到项目中 # 第三方库需要在控制台pip下载包 pip install 模块名 也可以通过File->settings->project:->Python Interpreter中手动管理
单例模式的实现
# 开发模式:单例模式 # 我们平时定义的类可以无限创建对象使用类中的属性和方法,每个对象都会在内存中开辟一块空间class Person:passp1 = Person() p2 = Person() # 不同对象开辟的不同内存地址 print(p1) # <__main__.Person object at 0x00000207650A71F0> print(p2) # <__main__.Person object at 0x00000207650A6FB0>
# 那如果我们并不需要很多对象产生,只是需要使用这个类中的某些功能方法,使用时才调用这块内存空间,该怎么办呢?# 这时候我们就需要使用单例模式,无论我们在创建时使用的哪种形式,我们在使用时都使用的是同一个对象!一个实例搞定!class Singleton:# 先定义也给属性,准备用这个属性承接开辟出来的内存空间并返回__instance = None# 重写类的__new__()方法def __new__(cls, *args, **kwargs):if cls.__instance is None:# 如果属性为空,则调用object.__new__()方法开辟内存空间,并赋值给类__instancecls.__instance = object.__new__(cls)# 这里会将内存地址默认返回给__init__()方法,初始化动作完成后赋值给对象名# 当后续调用时,类属性就不为空了,所以返回的还是这个对象内存地址return cls.__instances1 = Singleton() s2 = Singleton() print(s1) # <__main__.Singleton object at 0x000001B0F7ED54B0> print(s2) # <__main__.Singleton object at 0x000001B0F7ED54B0>
完成!