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)
原文地址:https://www.cnblogs.com/Z-Queen/p/14726132.html