python初识函数(4)
引言
今天我们来讲讲闭包函数和装饰器,这些内容可能会比较的难,但是这是我们进入python的第一座大山,越过去就海阔天空了。

闭包函数
闭包函数主要是讲究闭和包,闭就是定义在函数内部的函数。包就是在内层函数中使用外层名称空间中的名字。闭包函数也是传参的另一种方法。
def outer(username):
def index():
print(username)
return index
# 通过外层函数传参,可以给内层函数使用
装饰器
装饰器主要还是用于在不改变被装饰对象调用方式和内部代码的前提下,给被装饰对象添加新的功能。装饰器的原则是对扩展开放对修改封闭。
import time
def index():
time.sleep(1)
print('from index')
def home():
time.sleep(3)
print('from home')
print(home)
def outer(func): # 真正的index被outer局部名称空间存储了
def get_time():
start_time = time.time() # 函数执行之前获取一个时间戳
func() # 调用了真正的index函数
end_time = time.time()
print(end_time - start_time)
return get_time
index = outer(index) # 此时内存空间中存放的是变量名
index()

装饰器语法糖
语法糖主要是为了代码的美观,语法糖使用的原理是紧跟在被装饰函数的上方,语法糖会自动将紧跟着的下方函数传给@后面的函数调用。
import time
def outer(func):
def get_time():
start_time = time.time()
func()
end_time = time.time()
print(end_time - start_time)
return get_time
@outer # 相当于index = outer(index)
def index():
time.sleep(1)
print('from index')
index()
装饰器修复技术
修复技术主要是为了让狸猫换太子后的函数比真的还真,本质是不变的。让别人用help查看也看不出来。
from functools import wraps # 固定写法
def outer(func_name):
@wraps(func_name) # 固定写法
def inner(*args, **kwargs):
print('执行被装饰对象之前可以做的操作')
res = func_name(*args, **kwargs)
return res
return inner
@outer
def index():
print('from index')