python入门:模块、包、装饰器

490 阅读4分钟

模块

模块:python中包含一些定义函数和变量的py文件,在需要时进行导入,从而可以快捷方便地调用模块内的函数和变量
模块导入:import 模块名,相当于先运行了模块对应的py文件,可以用 import 模块名 as 别名,用较短的别名代替模块名进行导入后的调用
模块使用:使用模块里的函数、变量、类名等,要用 模块名.函数 的格式
导入指定函数:使用from 模块名 import 函数,从模块中导入指定函数、变量、类名,使用时可以直接用不需要在前面加 模块名. 进行修饰
过滤执行代码:关键字__name__在所在程序中显示为'__main__',在导入程序中显示为所在的模块名;因此用 if __name__=='__main__' 可以让部分代码不会在被导入时执行,只在所在程序文件中运行

包:将不同模块进行分类管理的文件夹

包中包含一些模块py文件和一个__init__.py的初始化文件
包的导入:用 import 包名 导入包时会自动执行包文件夹中的__init__.py文件,通常在__init__.py文件中用 from 包名 import 模块名 进行模块导入,以及执行一些其他的初始化代码
from 包名 import * 即从包中导入所有模块
在__init__.py中用变量__all__=['模块名1','模块名2'] 可以决定 * 中的所有模块的具体内容

递归函数:函数调用自身,需要设置一个终止条件,可以用来进行迭代遍历;每次进入更深一层递归时问题规模应有所减少

递推:拆解递归问题,每一次递归都是在上一次递归推得基础上执行
回溯:遇到终止条件后,返回值从最后逐级返回

闭包

闭包:一个嵌套函数整体,其中内层函数对外层函数的非全局变量进行引用,同时外层函数的返回值是内层函数的函数名;可以保存其外部函数的对应局部变量不被销毁,称为自由变量

def outer(x):
    def inner(y):
        nonlocal x
        x+=y
        return x
    return inner
io=outer(a) #外部函数已执行完毕,但自由变量在此刻与内部函数完成绑定
print(io(b)) #对应局部变量仍然存在,可被访问和记忆修改,无需为此使用全局变量

可用于生成不同参数函数、多次计数或延迟执行
可用内部函数的__closure__变量查看自由变量,即io.__closure__

def fibonacci(n, memo={}):
    if n in memo:
        return memo[n]
    if n <= 1:
        return n
    memo[n] = fibonacci(n-1, memo) + fibonacci(n-2, memo) #可用于缓存记忆,减少重复计算
    return memo[n]

延迟绑定:自由变量与内部函数的绑定实质是闭包保存了对自由变量的引用,而非保存自由变量当时的值,因此闭包绑定的是自由变量的最终值

def outer():
    return [lambda x: i * x for i in range(5)] #返回了一个含有五个函数的列表
funcs = outer()
print([f(2) for f in funcs])  #在五个函数都被调用后i的终值为4,因此所有函数中i的值均为4

装饰器

装饰器:可以让其他函数无需变动代码而增加额外功能
本质是一个闭包函数,被装饰函数名作为外部函数参数,称为业务函数,内部函数参数为装饰所需参数和业务函数所需参数,装饰完的函数名作为返回值
用法:@装饰器名称,或装饰后函数名=装饰器名称(业务函数名)

装饰器模板

def outer(func):
    def inner(*args, **kwargs):
        执行业务函数前的装饰操作
        func(*args, **kwargs) #业务函数
        执行业务函数后的装饰操作
    retuen inner

装饰方法

装饰方法一:

def start():
    业务函数代码
res=outer(start)

即可用res作为装饰后的函数名

装饰方法二:

@outer
def start():
    业务函数代码

等同于 start=outer(start) 直接用业务函数名作为装饰后函数名

嵌套装饰函数

def outer(func):
    def middle(*args1, **kwargs1)
        中层装饰代码
        def inner(*args2, **kwargs2):
            执行业务函数前的装饰操作
            start(*args2, **kwargs2)
            执行业务函数后的装饰操作
        中层装饰代码
        retuen inner
    return middle
@outer
def start(*args3, **kwargs3)
    业务函数

调用时第一层参数对应第一层嵌套装饰函数,一一对应 start(*args1, **kwargs1)(*args2, **kwargs2)

回调函数:一函数名作为另一函数的参数

def func1(func, *args):
    执行代码
    func(*args)
def func2(*args):
    执行代码
func1(func2, *args)

类似装饰器的作用,可以用一套模板装饰多个函数