闭包函数(闭包装饰器)

====================(一)

#闭包:1.函数内嵌套函数 2.内部函数引用外部函数的变量 3.闭包(外部函数)返回值是内部函数,
#函数也是一个类型(function)

def test(number):
    def test_2(number_in):
        return number * number_in
    return test_2



rs = test(10)
#此时局部变量应该在内存中被释放掉,但却没有被释放,
#rs既是test2,由于内部函数引用了
s = rs(20)
print(s)

def sum(a,b):
    def numbers(x,y):

        return a*x+b*x+a*y+b*y

    return numbers

num = sum(10,20)
rs = num(30,40)
print(rs)


#闭包定义装饰器

#把一个函数作为一个参数

def wl(func):
    def inner():

        return func()
    return inner



#@wl 装饰器 返回一个内部函数inner
#在装饰器下定义的f1函数实际上就是传递到装饰器的函数




from datetime import datetime
def for_test():
    start_time = datetime.now()
    for x in range(10000):
        c = x*x
    print(datetime.now()-start_time)

# -*- coding:utf-8 -*-
__author__ = 'rxf'

def eat():
    pass

print(type(eat))



def test(number):
    # number 局部变量
    def test2(number_in):
        # test2 内部函数
        return number * number_in

    return test2


rs = test(10)

s = rs(20)
print(s)


# 带两个参数的

def sum(a, b):
    def num(x):
        return a * x + b * x
    return num

num = sum(10,20)
print(num)
rs = num(30)
print(rs)

# 利用闭包自定义装饰器
# func 把一个函数作为参数
def w1(func):

    def inner():
        # 返回调用传递进来的函数执行的结果
        return func()

    return inner
# @w1 装饰器 返回一个内部函数inner
# 装饰器的作用:在不更改原始函数的基础上,为函数添加一些额外功能
# 在装饰器下定义的f1函数实际上就是传递到装饰器的参数
@w1
def f1():
    return 1234


rs = f1()
print(rs)

from datetime import datetime
# 打印输出某个函数执行消耗的时间


def run_time(func):
    def test():
        # 获取开始执行的时间
        start_time = datetime.now()
        func()
        print(datetime.now() - start_time)
    return test


@run_time
def for_test():

    for x in range(10000):
        c = x+x


for_test()


@run_time
def for00_test():
    for x in range(1000000):
        c = x*x


for00_test()




# 带参数的装饰器
def test(name):
    if name == '张三':
        def run(func):
            def sleep():
                func()
            return sleep
        return run


    else:
        def error(func):
            def test():
               print('塔拉黑哒')
            return test
        return error



@test('三')
def eat():
    print('米西米西')
eat()

=====================(二)

#coding:utf-8

# 闭包:1.函数内嵌套函数  2.内部函数引用外部函数的局部变量  3.外部函数的返回值是内部函数

# def eat():
#     pass
# <class 'function'> 函数的类型
# print(type(eat))
def test(number):
    # number 局部变量,生命周期  从声明开始往下,到代码块结束
    def test_2(number_in):
        # 内部函数引用外部函数局部变量
        return number * number_in
    # 返回一个函数对象
    return test_2

# <function test.<locals>.test_2 at 0x00000000004837B8> test_2函数对象
# 执行test函数后返回的是一个函数对象,这个对象就是test_2
# 由于内部函数引用了外部函数的局部变量,导致外部函数执行完之后,局部变量没有及时释放,占用内存
rs = test(10)
# 因为rs是一个函数对象,可以被执行,rs(20)相当执行了test_2这个函数,在test_2中引用了test中的局部变量number,并且test返回的就是test_2这函数,所以我们称test_2为闭包
s = rs(20)
print(s)

# 带两个参数的
def sum(a,b):
    
    def numbers(x,y):
        
        return a*x+b*x+a*y+b*y
    
    return numbers

num = sum(10,20)
rs = num(30,40)
print(rs)

# 利用闭包自定义装饰器
# func 把一个函数作为参数
def w1(func):
    def inner():
        
        # 返回调用传递进来的函数执行的结果
        return func()
    
    return inner
# @w1 装饰器  返回一个内部函数inner
# 装饰器的作用:在不更改原始函数的基础上,为函数添加一些额外功能
# 在装饰器下定义的f1函数实际上就是传递到装饰器的参数
@w1
def f1():
    
    return 123456
rs = f1()
print(rs)

# 打印输出某个函数执行消耗的时间

from datetime import datetime

def run_time(func):

    def test():
        # 获取开始执行的时间
        start_time = datetime.now()
        func()
        # 计算执行消耗的时间
        print('执行{},消耗了{}时间'.format(func.__name__,datetime.now() - start_time) )
    
    return test
    
@run_time
def for_test():
    for x in range(10000):
        c = x+x
    
        
for_test()

@run_time
def for1000000_tetst():
    for x in range(1000000):
        c = x * x

for1000000_tetst()


# 带参数的装饰器
def test(name):
    if name == '张三':
        # 定义装饰器用到闭包
        def run(func):
            
            def sleep():
                func()
                
            return sleep
        
        return run
    else:
        def error(func):
            def run()
            print('你不是张三,没有权限吃饭')
        return error
@test('李四')
def eat():
    
    print('只有张三才能吃饭')
    
eat()

=============(三)

# 在不更改eat函数内部代码的情况下,添加吃饭执行了多长时间
from datetime import datetime


# 封装成一个函数
# 该函数中需要执行被传递进来函数对象,并且在执行前获取时间,执行后减去执行前的时间
def run_time(func):
    
    def test():
        start = datetime.now()
        func()
        print(datetime.now() - start)
        
    return test
    
# 下面的装饰器 等同于这句话 eat = run_time(eat)
@run_time
def eat():
    print('吃饭了')
# 把eat函数对象传递到run_time函数中
# 当调用eat()函数时,实际上执行的闭包中的test()函数
eat()


def premission(form_role):
    # 函数装饰器的开始
    def role(func):
        def test():
            if 3 > form_role:
                func()
            else:
                print('没有权限')
        return test
    return role
# premission(2) 返回role函数对象
# 相当于写了@role
# 装饰器执行完成之后相当于 sleep = role(sleep)
@premission(5)
def sleep():
    print('睡觉了...')
sleep()

# 下面的写法等同于使用装饰器的写法
# 1.执行premission(2)返回role函数
# role = premission(2)
# 2.执行role返回test函数,并赋值给sleep
# sleep = role(sleep)
# 3.执行sleep()就是执行test()
# sleep()

















猜你喜欢

转载自blog.csdn.net/baidu_32542573/article/details/80188487
今日推荐