• Python----闭包和装饰器


    # 闭包
    def outer(x):
        print('outer:',x)
    
        def inner():
            print('inner:', x)
    
        return inner  # 外部函数return的一定是内部函数的函数名
    
    def a(x):
        print('a:',x)
    
        def b(y):
            print('b:', y)
            print('x+y:', x + y)
            return x+y
    
        return b  # 外部函数return的一定是内部函数的函数名
    
    
    
    if __name__ == '__main__':
        # 闭包函数的调用
        # 1.首先调用外函数,获得内函数的函数名     函数名=outer(3)
        # 2.然后使用获得的函数名进行内函数的调用   函数名()
        fun_name = outer(2)
        fun_name()
    
        # 简写
        outer(3)()
    
        a = a(1)(2)
        print('哈哈哈哈:',a)
    # 装饰器讲解
    # 装饰器的作用:在不改变原来函数执行的情况下,为这个函数做一些其他的事情/添加一些其他的事情
    # 一个函数可以添加多个装饰器
    
    # 闭包
    def fun_outer1(func):
        def inner(*args, **kwargs): # *args, **kwargs 其实就是func的参数
            print('你想做的事情1')
            return func(*args, **kwargs)
    
        return inner  # 外部函数return的一定是内部函数的函数名
    
    
    def fun_outer2(func):
        def inner(*args, **kwargs):
            print('你想做的事情2')
            return func(*args, **kwargs)
    
        return inner
    
    
    @fun_outer1  # 闭包可以作为一个装饰器  @+函数名
    @fun_outer2
    def aa(a):
        print('我的函数原本要做的事情..........')
    
    
    if __name__ == '__main__':
        aa(6)
    
        aa(a=1)
    # 练习
    import time
    
    # 写日志的装饰器
    def write_log(func):
        def inner(*args,**kwargs):
            result = func(*args,**kwargs)
            if result:
                with open('a.log','w') as file:
                    file.write(str(result))
        return inner
    
    
    # 计算函数执行时间的装饰器
    def cost_time(func):
        def inner(*args,**kwargs):
            start =time.time()
            func(*args,**kwargs)
            end = time.time()
            print('函数执行时间:',end -start)
        return inner
    
    
    @cost_time
    @write_log
    def sum_int(n):
        sum = 0
        for i in range(n+1):
            sum = sum + i
        # print('sum:',sum)
        return sum
    
    sum_int(1000)
  • 相关阅读:
    线程间的通信
    高速排序算法
    LightOJ 1205 Palindromic Numbers
    java异常处理
    Android Bundle类
    Linux守护进程的编程实现
    深入浅出JMS(一)——JMS简单介绍
    Maven安装与配置
    matlab学习------------普通dialog对话框,错误对话框errordlg,警告对话框warndlg
    读书笔记:计算机网络4章:网络层
  • 原文地址:https://www.cnblogs.com/Z-Queen/p/14726132.html
Copyright © 2020-2023  润新知