闭包&装饰器&内置模块

包和模块

一 闭包和装饰器

(一) 闭包
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("仅仅在直接运行该程序时执行")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值