Java教程

闭包函数与装饰器

本文主要是介绍闭包函数与装饰器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

闭包函数简介

闭包函数
	1、定义在函数内部的函数
    2、内部函数使用了外部函数名称空间中的名字
ps:只有符合上述两个特征的函数才能称之为闭包函数

def func(username):
    # username = 'curry'
    def index():
        print(username)
    return index
# 思考如何在全局调用index
# res = func()
# print(res)
# res()

func('curry')  #  username = 'curry'

闭包函数实际应用

1、给函数体胆码传值得方式:通过形参
def func(xxx):
	print(xxx)
2、给函数体代码传值得方式:闭包函数
def index(username):
    # username = 'curry'
    def func():
        print(username)
    return func
res = index('curry')
res()  # curry
res()   # curry
res()  # curry
res1 = index('jason')
res1()  # jason
res1()  # jason
res1()  # jason

装饰器简介

1、装饰器的本质
	在不改变或装饰对象原来的“调用方式”和“内部代码”的情况下给装饰对象添加新的功能
    eg:
        def func():
            print(123)
        func()  # 每次执行之前需要校验用户身份
2、装饰器的原则
	对修改封闭 对扩展开放
    import time
3.知识储备
print(time.time())  # 1657017466.4727514
'''时间戳(秒数):当前距离1970年1月1日0时0分0秒所经历的秒数'''
# 实际应用>>>:统计代码的运行时间
# start_time = time.time()
# for i in range(1000):
#     print(i)
# end_time = time.time()
# print('for循环的执行时间是:%s'%(end_time-stat_time))
time.sleep(3)
'''让程序原地等待三秒'''
print('小张睡不醒')
装饰器前期推导
import time

def index():
    time.sleep(3)
    print('from index')
'''统计index函数的执行时间'''
start_time = time.time()  # 在调用index函数之前获取一下时间戳
index()  # 调用index函数
end_time = time.time()
print(end_time - start_time)
"""
缺陷
    如果有多个index需要统计时间 则需要重复编写代码
    解决措施:
        封装成函数
"""
def get_time():
    start_time = time.time()  # 在调用index函数之前获取一下时间戳
    index()     # 调用index函数
    end_time = time.time()
    print('函数的执行时间:end_time - start_time')
"""
缺陷
    不用形参个数的函数无法兼容统计
    解决措施:
    *args  **kwargs
    但是在我们目前的代码中无法实现(暂且忽略)
"""
def funcl(a):
    time.sleep(1)
    print('from func1')
"""
缺陷
    改变了原来的调用方式
    解决措施:
        装饰器推导流程
"""

装饰器各种版本

import time

"""针对有参无参函数如何兼容"""
def outer(xxx):
    def get_time(*args,**kwargs):
        start_time = time.time()  # 在调用index函数之前获取时间戳
        res = xxx(*args,**kwargs)  # 调用index函数
        end_time = time.time()
        print('函数的执行时间是:',end_time - start_time)
        return res
    return get_time()

def home():
    time.sleep(2)
    print('from home')
    return '执行home函数之后的返回值'

def index(name):
    time.sleep(1)
    print('from index')
    return '执行index函数之后的返回值'

home = outer(home)
xxx = home()
print(xxx)

index = outer(index)
res = index('jason')
print(res)

home = outer(home)
home()

def func(a,b,c):
    time.sleep(1)
    print('from func')

index = outer(index)
index('jason')

home = outer(home)
home()

func = outer(func)
func(1,2,3)
装饰器的固定模板
from functools import wraps
def outer(func_name):
    @wraps(func_name)   # 仅仅是为了让装饰器不容易被别人发现 做到真正的以假乱真
    def inner(*args,**kwargs):
        print('执行被装饰对象之前可以做的额外操作')
        res = func_name(*args,**kwargs)
        print('执行被装饰对象之后可以做的额外操作')
        return res
    return inner
import time
def home()
    time,sleep(1)
    print('from home')
    return 'home返回值'

home = outer(home)
res = home()
print(res)
"""
执行home函数之前需要添加校验用户身份的功能
"""

装饰器语法糖
import time

@outer   #  home = outer(真正的函数名home)
def home():
    '''我是home函数 天气很热'''
    time.sleep(1)
    print('from home')
    return 'home返回值'

help(home)
print(home)
home()

def index():
    '我是index函数 我的功能很强大'
    pass

help(index)
这篇关于闭包函数与装饰器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!