闭包, 装饰器

闭包函数

释义

闭(封闭)包(包子-->把相当于馅的闭包函数内部的变量相当于皮的闭包函数内部的函数看成一个相当于包子的整体)-->返回闭包函数内部的函数对象

def zl():
    x = 10
    def bz():
        z = x**2
        print(z)
    return bz
# bz()
# print(x)
cbz = zl()
cbz()

总结

闭包函数把闭包函数内部的变量+闭包函数内部的函数这两者组成的整体包裹在一起,然后通过返回值(函数对象)的形式返回出来

闭包函数至少有一层嵌套

装饰器

释义

装饰(新增了一个额外的功能)器(工具==函数)

1.装饰器的本质就是一个给函数增加功能的函数

2.不改变原函数代码

3.不改变原函数调用方式

最简单的装饰器

搜索顺序+函数对象

def f():
    x = 625
    print(x ** 4)
    time.sleep(1)

# f()
def zsq(func):
    def xzgn():
        ks = time.time()
        func()
        js = time.time()
        print('运行计时:', js - ks)
    return xzgn
f = zsq(f)
f()

带返回值函数的装饰器

def f():
    x = 625
    print(x ** 4)
    time.sleep(1)
    return '蔡启龙'
def zsq(func):
    def xzgn():
        ks = time.time()
        func()
        js = time.time()
        print('运行计时:', js - ks)
        return '蔡启龙'
    return xzgn
f = zsq(f)
f()
print(f())

完善装饰器---但参数和返回值的函数的装饰器

import time
#最简单装饰器(为一个函数新增计时功能)
def f(x,y,z='520'):
    print('x的四次方',x ** 4)
    print('y值加2',y+2)
    print(z+'1314')
    time.sleep(1)
    return '蔡启龙'

# f()
def zsq(func):
    def xzgn(*args,**kwargs):
        ks = time.time()
        res = func(*args,**kwargs)
        js = time.time()
        print('运行计时:', js - ks)
        return res
    return xzgn
f = zsq(f)
f(2,10)
print(f(2,10))

三层装饰器

根据第三层装饰函数传入参数判断打开那个文件

dlzt = []
def sanceng(role):
    def login(func):
        def wrapper(*args, **kwargs):
            while True:
                if dlzt:
                    print('请勿重复登录')
                    res = func(*args, **kwargs)
                    return res
                dlm = input('请输入登录名:')
                dlmm = input('请输入登录密码:')
                with open(f'{role}.txt', 'r') as fr:
                    for i in fr:
                        if (dlm + ':' + dlmm) == i.strip():
                            print('登录成功')
                            dlzt.append(dlm)
                            res = func(*args, **kwargs)
                            return res
                        else:
                            print('登录失败')

        return wrapper
    return login	
# @sanceng('yhxx')	#使用语法糖
def bzshs(x,y,z = 10):
    print('被装饰函数')
    return '蔡启龙'
# bzshs= sanceng('yhxx')(bzshs)	#不使用语法糖
print(bzshs(1,2))
原文地址:https://www.cnblogs.com/-406454833/p/11595619.html