• 11,闭包,简单版装饰器。


    函数名:函数名可以理解为一个特殊的变量。
    直接打印函数名,得到的是函数的内存地址。

    def f1():
        print(1211)
    print(f1)

    函数名可以定义为一个函数的参数。

    a = 1
    def f1(x):
        print(x)
    f1(a)

    def f1():
    print(555)
    def f2(x):
    x()
    f2(f1)
     


    函数名可以作为容器类型的元素。

    def f1():
        print(1211)
    def f2():
        print(1222)
    def f3():
        print(1233)
    def f4():
        print(1233)
    li = [f1,f2,f3,f4,]
    for i in li:
        i()


    函数能作为字典的值。


    函数名还可以作为函数的返回值

    def f11(x):
        return x
    a = f11(5)
    print(a)



    def f1():
    print(666)
    def f2(x):
    return x
    a = f2(f1)
    a()


    def wraaper():
    def inner():
    print(666)
    return inner

    ret = wraaper()
    ret()

    什么是闭包?

    闭包,就是内层函数对外层函数(非全局)变量的引用。

    内存函数对外层函数非全局变量的引用就叫闭包。

    判断是不是闭包 用内层函数名.__closure__ 返回None

    当执行一个函数时候,如果解释器判断此函数内部内部闭包存在,这样
    python就一个机制,闭包的所在的临时名称空间不会随着函数的执行完毕而消失。(用于爬虫)

    def wraaper1():
        name = '老男孩'
        def inner():
            print(name)
        inner()
        print(wraaper1().__closure__)
    wraaper1()

    输出结果:

    老男孩
    (<cell at 0x00000050ABD24D38: str object at 0x00000050ABDC6BC0>,)

    name = '老男孩'
    def wraaper2():
    name1 = 'alex'
    def inner():
    print(name)
    print(name1)
    inner()
    print(inner.__closure__)
    wraaper2()
    
    

    简单版本装饰器
    改变了我原来执行函数的方式,不好。

    import time
    def login():
        time.sleep(1)
        print('嘻嘻更健康')
    def timmer():
        start_time = time.time()
        login()
        end_time = time.time()
        print('此函数的执行时间是%s' % (end_time - start_time))
    timmer()

    虽然执行函数的方式已经无限接近于原方式,但是更麻烦了,增加了两步代码,改吧。!!!!

    def login():
        time.sleep(1)
        print('嘻嘻更健康')
    login()
    def register():
        time.sleep(0.3)
        print('嘻嘻')
    register()
    def timmer(d):
        start_time = time.time()
        d()
        end_time = time.time()
        print('此函数的执行时间%s' % (end_time - start_time))
    timmer(login)
    timmer(register)
    def login():
        time.sleep(0.3)
        print('洗洗更健康')
    login()
    def timmer(d):
        start_time = time.time()
        d()
        end_time = time.time()
        print('此函数执行了%s' % (end_time - start_time))
    f1 = login #将login函数给了f1
    login = timmer #将timmer函数给了login
    login(f1) # timmer(login)

    初级装饰器

    def timmer(f):
        def inner():
            start_time = time.time()
            f()
            end_time = time.time()
            print('此函数的执行时间%s' % (end_time - start_time))
        return inner
    @timmer
    def login():
        time.sleep(0.3)
        print('嘻嘻更显康')
    login()

    被装饰的函数带参数的装饰器

    def timmer(f):
        def inner():
            start_time = time.time()
            f()
            end_time = time.time()
            print('此函数的执行时间%s' % (end_time - start_time))
        return inner
    @timmer
    def login():
        time.sleep(0.3)
        print('嘻嘻更显康')
    login()

    函数带返回值的装饰器(万能装饰器)

    def timmer(f):
        def inner(*args,**kwargs):
            start_time = time.time()
            ret = f(*args,**kwargs)
            end_time = time.time()
            print('此函数执行时间为%s' % (start_time - end_time))
        return inner
    @timmer
    def login(a,b):
        print(a,b)
        time.sleep(0.3)
        print('洗洗更健康')
        return 666
    print(login(2,3))

    装饰器

    def wrapper(f):
        def inner(*args,**kwargs):
            '''执行被装饰函数之前的操作'''
            ret = f(*args,**kwargs)
            """执行被装饰函数之后的操作"""
            return ret
        return inner
  • 相关阅读:
    VS2010中的单元测试
    GSM局数据制作2(Erision)
    WPF的BitmapImage的文件无法释放及内存泄露的问题
    跨库查询推荐使用的方法
    我们能做什么呢?
    长尾理论:Windows Vista
    Blackberry阻碍因素
    RIM终于想通了RIM开放新的API
    Prototype库终于有了文档了
    自己编写的MSN历史记录合并工具
  • 原文地址:https://www.cnblogs.com/ZJGG/p/9025421.html
Copyright © 2020-2023  润新知