模块
模块: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)
类似装饰器的作用,可以用一套模板装饰多个函数