首页 > 其他 > 详细

函数-闭包函数 和 装饰器

时间:2021-03-30 21:55:31      阅读:28      评论:0      收藏:0      [点我收藏+]

闭包函数

1.1、闭函数:

被封闭起来的函数-->定义函数内部的函数,闭函数的特点是:只能在函数内用

1.2、包函数

该函数引用了一个名字,该函数是来自与 E 这一层的

1.3、闭包函数

指的是在定义在函数内部的函数,引用了一个来自外层作用域中的名字
def f1():
    x = 1
    def f2():
        print(x)
    return f2
res = f1()
res()
# 1

2、装饰器

2.1、什么是装饰器

装饰器指的是装饰别人的工具,装饰指的是为被装饰者添加新功能。
但是实现装饰器必须遵守原则:开放封闭原则
	开放:对扩展新功能是开放的
    封闭:对修改源代码以及调用方式是封闭的
综上:装饰器指的是创建一个工具,可以在遵循原则1,2的前提下:
	原则1:不修改被装饰对象源代码
    原则2:不修改被装饰对象调用方式
def ti(): #统计程序运行时间
    print(‘你好‘)
    time.sleep(1)
def y(x):  # 装饰器
    def tj(*args,**kwargs):
        start = time.time()
        res = x(*args,**kwargs)
        end = time.time()
        print(‘运行时间为:%s‘%(end - start))
    return tj
ti = y(ti)
ti()

2.2、语法糖:

@ +修饰器函数名
import time
def y(x): # 装饰器
    def tj(*args,**kwargs):
        start = time.time()
        res = x(*args,**kwargs)
        end = time.time()
        print(‘运行时间为:%s‘%(end - start))
    return tj
@y  # 语法糖
def ti(): #统计程序运行时间
    print(‘你好‘)
    time.sleep(1)
ti()

2.3、装饰器模板:

def deco(func):
    def wrapper(*args,**kwargs):
        res = func(*args,**kwargs)
        return res
    return wrapper

叠加多个装饰器运行原理:

技术分享图片

2.4、有参装饰器

封装3层的闭包函数
def f1(name):
    def f2(func):
        def f3(*args,**kwargs):
            res = func(*args,**kwargs)
            print(name)
            return res
        return f3
    return f2
@f1(‘sailiya‘)
def name():
    print(‘你好啊‘)
name()
# 你好啊
# sailiya
def f1(mode):
    def f2(func):
        def f3(*args, **kwargs):
            name = input(‘name:‘)
            pwd = input(‘pwd:‘)
            if mode == 1:
                if name == ‘1‘ and pwd == ‘2‘:
                    res = func(*args, **kwargs)
                    return res
                else:
                    print(‘认证失败‘)
            elif mode == 2:
                print(‘这是第 %s 种验证方式‘ % mode)
            else:
                print(‘此验证方式当前关闭维护中‘)

        return f3

    return f2


number = int(input(‘选择验证方式:1,2,3\n‘))


@f1(number)
def name():
    print(‘登录成功‘)


name()

wraps装饰器

from functools import wraps
def f1(func):
    @wraps(func)
    def f2(*args,**kwargs):
        res = func(*args,**kwargs)
	return f2

函数-闭包函数 和 装饰器

原文:https://www.cnblogs.com/BaiJiaZhengMing/p/14598366.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!