python 装饰器与闭包
1. 什么是函数?
- 在程序中,函数是具备某一功能的工具(将代码封装在里面),事先将工具准备好 (锤子、扳手、工厂)即函数的定义
- 遇到应用场景拿来就用即函数的调用
- 所以,注意!函数的使用必须遵循先定义后调用的原则(先制造了工具,工具才能使用)
2. 为何要用函数 不用函数会产生什么问题?
3. 如何用函数?
def fac():
print("hello")
print("hello")
print("hello")
def fac():
print("hello");
print("hello");
print("hello");
print(fac)
fac()
4. 闭包函数(重点)
(1)定义
闭包函数
闭:该函数是一个内部函数
包:指的是该内部函数的名字在外部被引用
(2)代码例子
def outer():
print("外面的函数在运行")
def inner():
print("里面的函数在运行")
inner()
- 因为这里面的函数没有被定义
- 由前面可知:在函数定义阶段,只检测函数体的语法,不会执行函数体代码,所以inner并没有被定义,自然会报错
- 先执行outer ,这样inner就会被创造出来(但是没有运行)
- 代码:
def outer():
print("外面的函数在运行")
def inner():
print("里面的函数在运行")
outer()
(3)那么在以上代码基础上,在我们定义了inner函数之后,可不可以直接函数名+()就可以调用了?
def outer():
print("外面的函数在运行")
def inner():
print("里面的函数在运行")
outer()
inner()
- 答案是不可以
- 因为inner是在局部定义的,在外面是拿不到里面“inner”的一个地址(要先进入outer里面),这个地址我们需要一个返回值去返回它。
- 代码如下:
def outer():
print("外面的函数在运行")
def inner():
print("里面的函数在运行")
return inner
address = outer()
print(address)
address()
- 运行结果如下:
5. 为函数体传值的方式一:参数
(1)代码如下:
def funcTest(x, y):
print(x * y)
funcTest(3, 6)
funcTest(3, 6)
funcTest(3, 6)
(2)函数执行结果如下:
6. 为函数体传值的方式二:闭包(参数传一次就可以了,不用向以上那样,每次都重复写参数,把参数一起封装到内存地址里去了)
(1)代码如下:
def outer(x, y):
def inner():
print(x * y)
return inner
inner = outer(3, 3)
inner()
inner()
inner()
(2)运行结果如下:
7. 装饰器(一个特殊的闭包函数)
(1)定义:
什么是装饰器(就是一个函数,只不过这个函数不是给自己使用的,是给其他函数添加功能的)
器指的是工具,而程序中的函数就具备某一功能的工具
装饰指的是为被装饰器对象添加额外功能
(2)为什么要用装饰器
软件的维护应该遵循开放封闭原则
1. 不修改被装饰对象的源代码
2. 不修改被装饰对象的调用方式
(3)代码
name = 'test'
def run(name):
print('=====')
print('this is %s'%name)
print('=====')
def decorate(func):
def inner(name):
print('我是装饰函数前的代码')
func(name)
print('我是装饰函数后的代码')
return inner
run = inner = decorate(run)
print(run)
run(name)
- 先调用了外层函数,将里层函数定义出来
- 拿到内存地址,调用将run传进去,最后还是赋值给了变量run
(4) 运行结果