zoukankan      html  css  js  c++  java
  • 闭包, 装饰器

    闭包函数

    释义

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

    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))
    
  • 相关阅读:
    Git全局配置备忘
    Wpf之Microsoft.Extensions.DependencyInjection
    Wpf之Interaction.Triggers与Interaction.Behaviors
    Wpf之异步绑定
    Wpf之HandyControls与MaterialDesign混用之DataGrid
    WPF将log4net配置文件设置为资源来保护配置文件
    c# PInvoke根据工程配置自动引用正确的dlls
    Wpf的gRpc的Server/Client
    Python必会的单元测试框架 —— unittest
    网易centos yum源
  • 原文地址:https://www.cnblogs.com/-406454833/p/11595619.html
Copyright © 2011-2022 走看看