函数补充与装饰器介绍

今日补充函数的另一种用法冲刺吧年轻人!!!!!

一.闭包函数

闭包函数分为两大特性

1.闭:

定义在函数内部的函数(先定义在调用)

2.包:

内部函数使用了外层函数名称空间中的

def outer():
  x = 999
  def inner():
    print(user name', x)
  return inner
ser = outer()
ser()

# 结果999 符合闭包函数的特征

二.闭包函数的实际应用

闭包函数是给函数体传参的另一种方式

1.函数体传参:形参

def oute(username):
    print(username)
oute('jason')
# 结果 jason
函数体代码要什么写什么

2.函数体传参:闭包

def outer(username):   
    def index():
        print(username) 
    return index     
res = outer('kevin') # 形参username与值kevin临时绑定到局部名称空间中
res()
# 结果 kevin

三.装饰器简介

1.装饰器本质:

是在不改变被装饰对象原有的‘调用方式’和‘内部代码’的情况下给被装饰对象添加新的功能

2.装饰器的原则:

对扩展开放 对修改封闭

import time  
def index():
    time.sleep(3)   #让程序原地等待3面后运行
    print('from index')
'''给index函数增加了一个统计执行时间的功能'''
start_time = time.time()  # 函数执行之前获取一个时间戳
index()
end_time = time.time()  # 函数执行之后获取一个时间戳
print(end_time - start_time)  # 两个时间戳的差值就是函数的执行时间

四.建议简易版本装饰器

五.进阶版本装饰器

def outer(func_name):
    def get_time(*args, **kwargs):
        start_time = time.time()
        func_name(*args, **kwargs)
        end_time = time.time()
        print(end_time - start_time)
    return get_time
# 解决的是参数问题

六.完整版装饰器

# 解决的是返回值问题
def outer(func_name):
    def get_time(*args, **kwargs):
        start_time = time.time()
        res = func_name(*args, **kwargs)  # 执行真正的index函数
        end_time = time.time()
        print(end_time - start_time)
        # return '不要急躁' # 如何在此处返回真正index函数的返回值
        return res
    return get_time

七.重要环节 装饰器模板(通用类型)

def outer(func_name):  # func_name用于接收被装饰的对象(函数)
    def inner(*agrs, **kwargs):
        print('执行被装饰之可进行的操作')
        res = func_name(*agrs, **kwargs)  #执行真正被装饰的函数
        print('执行被装饰函数之后的额外操作')
        return res   # 返回真正的函数返回值
    return inner

八.装饰器的语法糖

还是为了让代码编写更加简洁
def outer(func_name):
    def inner(*args, **kwargs):
        print('执行函数之前的操作')
        res = func_name(*args, **kwargs)
        # 额外操作
        return res
    return inner

@outer  # 等价于 index = outer(index)
def index(*args, **kwargs):
    print('from index')
# index = outer(index)  # 不好看

@outer  # 等价于 home = outer(home)
def home(*args,**kwargs):
    print('from home')

8.1语法糖内部原理

1.使用时候紧跟在被装饰对象的上方
2.语法糖会自动将下边紧挨这的函数名传输给@后边函数调用

九.装饰器修复技术

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')
@outer
def home():
    '''这是home函数的注释'''
    print('from home')
# help(home)  # help可以查看指定函数的注释信息
# help(len)
# index()  # 目前的以假乱真 有瑕疵
# print(index)
# help(home)
# help(index)
# print(home)
# print(index)
home()
index()

posted @ 2022-03-18 20:53  笑舞狂歌  阅读(27)  评论(0编辑  收藏  举报