包和模块
一 闭包和装饰器
(一) 闭包
1 闭包条件
- 函数必须是嵌套关系
- 外层必须要返回内层函数
- 内层函数必须用到外层函数的变量或参数
2 示例
def func(): # func 是外部函数
msg = "hello,world!"
def inner(): # inner 是嵌套函数
print(msg)
return inner # 返回了内部函数
def func2():
msg = "你好世界"
def inner(): # inner 是嵌套函数
print(msg)
return inner # 返回了内部函数
f = func()
f = func2()
3 作用
- 避免全局污染(主要)
(二)装饰器(特殊的闭包)
作用:在不改变源代码的前提下,给源代码增加功能。
#装饰器格式
def func(fn):
def inner():
# 函数执行前需要做的事
fn()
# 函数执行后需要做的事
return inner
# 被装饰函数
@func
def f():
print("f函数")
万能装饰器
# 万能装饰器
def func(fn):
def inner(*args,**kwargs):
# 函数执行前需要做的事
print("f函数执行前进行验证")
res = fn(*args,**kwargs)
# 函数执行后需要做的事
print("f函数执行后,做的事情")
return res
return inner
装饰器应用
身份认证、权限授权、资源访问、日志记录、时间统计等等。
装饰器总结:
1 装饰器函数中的inner参数以及inner内部调用的fun函数均要与被装饰的函数在形式上保持一致(参数个数,顺序等)即:f()、inner()、fn()三者括号中的内容要保持一致。
2 一个装饰器可以装饰多个函数,多个装饰器可以装饰一个函数。
二 模块
(一) 引入
(二)模块
1 概念
概念: python中的以py为后缀名的文件。
模块属于标识符,遵循标识符规则。
2 导入方式
注意:被导入模块会首先执行一遍,仅能执行一遍
-
import 模块名
使用方式:模块名.函数()/变量名
好处:导入对象不会与本地模块中对象冲突
# 导入系统模块 import random # 导入random模块 random.randint(1,10) # 产生1-10的随机数,使用random中的函数 print(random.RECIP_BPF) # 使用random中的变量 # 导入自定义模块 import test print(test.name) test.func()
-
精准导入:from 模块名 import 具体内容
使用方法:方法()变量
优点:使用简单
不足:可能存在导入对象和本地对象冲突,仅能够使用导入的对象
from test import func func() print(name) # 报错 from test import func,name # 导入多个对象
-
import 模块名 as 别名
应用场景:
- 模块名过长
- 模块名和本地命名冲突
import test as t1 print(t1.name) t1.func()
-
from 模块名 import 对象 as 别名
应用场景:
- 对象名过长
- 对象名和本地命名冲突
-
from 模块 import * (不推荐)
很容易导入一些不需要的对象,导致覆盖本地的变量
3 使用模块遇到问题:
类比生活中的场景
电脑的容量分为不同的盘符:根据不同的软件,安装到不同的盘符。
进入某一个盘,刚开始软件比较少,可以直接放入指定的盘符,随着软件越来越多,根据软件名称可以再进一步划分盘符
解决方案:进一步创建文件夹
之前模块结构
- login.py
- show.py
- main.py
模块会越来越多,如果还是直接放到一个文件夹下,查找模块时候不方便
解决方案:创建文件夹,把之间存在模块根据功能放入不同的文件夹下
三 包
定义:package,就是一个特殊的文件夹,程序包,用来管理模块的名称。
特殊之处:文件夹内必须包含一个模块:__init__.py
__init__.py作用:用于标识包
|--select_courses
|--login
|--user.py
|--admin.py
|--show
|--home.py
|--detail.py
|--selection
|--user.py
|--admin.py
|--main.py
包和目录区别:是否包含_init_.py
包作用:可以批量管理模块,在init文件中对模块进行统一管理。
注意:一旦使用了相对导入方式,程序的启动方式,要通过命令启动。
python -m 包.模块 # 模块不写后缀名
包的导入方式与模块导入方式一致,只要注意路径即可。
-
绝对导入
from 包 import 模块
import 包.模块
-
相对导入
from .包 import 模块
from ..包 import模块
四 内置模块
1 random模块
- random():产生(0,1)之间的随机小数
- uniform(a,b):产生指定范围的随机小数
- randint(a,b):指定范围的随机整数
- randrange(start,stop,step):指定范围的随机整数
- choice(lst):给定列表随机选择一个元素
- shuffle(lst):随机打乱给定的对象
2 sys模块
- version:获取版本
- path:获取模块搜索路径
- argv:从命令行获取给定的参数
3 string模块
4 time模块
- sleep():睡眠
- time():获取当前的时间戳
- localtime([timestamp]):将本地时间戳转化为时间元组
- gmtime([timestamp]):将世界时间转化为时间元组
- mktime(struct_time):将时间元组转化为时间戳
- strftime(format,struct_time):将时间元组转化为格式化时间
- strptime(格式化时间,format):将格式化时间转化为时间元组
补充:测试代码的运行
# 在被导入模块中添加条件语句,条件语句后的代码就仅能够在直接执行该模块时执行。在被导入时不会执行
if __name__ == "__main__":
print("以下所有代码均为测试代码")
print("仅仅在直接运行该程序时执行")
间元组转化为时间戳
- strftime(format,struct_time):将时间元组转化为格式化时间
- strptime(格式化时间,format):将格式化时间转化为时间元组
补充:测试代码的运行
# 在被导入模块中添加条件语句,条件语句后的代码就仅能够在直接执行该模块时执行。在被导入时不会执行
if __name__ == "__main__":
print("以下所有代码均为测试代码")
print("仅仅在直接运行该程序时执行")