闭包函数,装饰器
Posted jincoco
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了闭包函数,装饰器相关的知识,希望对你有一定的参考价值。
闭包函数
函数的对象:就是可以将定义在函数内的函数返回到全局使用,从而打破函数的层级限制。
名称空间与作用域:作用域的关系在函数定义阶段就已经固定死了,与函数的调用位置无关,即在任意位置调用函数都需要在函数定义时找到作用域的关系。
def f1():
x = 13
def func():
print(x)
return func
f = f1()
x = 2
def f2():
x = 14
f()
f2()
# 13
什么是闭包
闭包:封闭包裹。就是指,函数内部函数对外部作用域而非全局作用域名字的引用。
def outter():
x = 999
def inner():
print(x)
return inner
f = outter() # f 就是 inner 函数的内存地址
def func():
x = 666
f()
func()
# 999
两种为函数传参的方式
方式一:参数传参
def func(x,y): # 位置形参
print(x)
print(y)
func(1,2)
func(3,4) # 位置实参,一一对应
# 1 2
# 3 4
方式二:闭包
def outter(func):
# func = 123456
def inner():
print(func)
return inner
f = outter(123456) # f = inner
f() # inner()
# 123456
装饰器
什么是装饰器
器:
器指的就是工具。而程序中的函数就是具备某一功能的工具,所以装饰器就是指 为被装饰器对象添加新的功能。因此定义装饰器就是定义一个函数,只不过该函数的功能是用来为其他函数添加额外功能的。
需要注意:
- 装饰器本身其实是可以任意 可调用的对象
- 被装饰的对象也可以是任意 可调用的对象
为什么要用装饰器
开发封闭原则:
开发:对扩展开发
封闭:对修改封闭
装饰器必须遵循两大原则:
1:不修改被装饰对象的源代码
2:不修改被装饰对象的调用方式
怎么用装饰器
统计函数运行时间
# 不使用装饰器
import time
def func():
time.sleep(1)
print('计算函数运行时间!')
start = time.time()
func()
end = time.time()
result = end - start
print(f'func 函数的运行时间为result')
# 计算函数运行时间!
# func 函数的运行时间为1.0007097721099854
# 简易版装饰器
import time
def func():
time.sleep(1)
print('计算函数运行时间!')
def outter(a):
def inner():
start = time.time()
a()
end = time.time()
result = end - start
print(f'func 函数的运行时间为result')
return inner
func = outter(func)
func()
# 升级版装饰器
import time
def func():
time.sleep(1)
print('计算函数运行时间!')
return 'func'
def login(name):
time.sleep(2)
print(f'就打印这个名name')
return 'login'
def outter(a):
def inner(*args,**kwargs):
start = time.time()
res = a(*args,**kwargs)
end = time.time()
print('func 函数的运行时间为%s'%end - start)
return res
return inner
func = outter(func)
func()
login = outter(login)
login('jin')
装饰器语法糖
import time
def outter(a):
def inner(*args,**kwargs):
start = time.time()
res = a(*args,**kwargs)
end = time.time()
print('函数的运行时间为%s'%end - start)
return res
return inner
@outter
def func():
time.sleep(1)
print('计算函数运行时间!')
return 'func'
func()
@outter
def login(name):
time.sleep(2)
print(f'******name******')
return 'login'
login('鸡哥')
以上是关于闭包函数,装饰器的主要内容,如果未能解决你的问题,请参考以下文章