zoukankan      html  css  js  c++  java
  • 函数之装饰器

    ---恢复内容开始---

    一。函数名(学名:第一类对象)

    函数名本质上就是函数的内存地址。通俗点就是特殊的变量.

    def my():
    print(666)
    print(my) # 函数名my在内存的地址
    print(id(my)) #变量my在内存的地址

    结果:

    1.可以被引用(即可以赋值给其他变量)

    def func():
        print(666)
    f = func   #将func赋值给f
    f()      #相当于func()

    结果:

    2.可以被当作容器类型的元素

    def func():
        print(111)
    def func2():
        print(222)
    def func3():
        print(333)
    li = [func(),func2(),func3()]
    for i in li:
        i

    结果;

    3.可以当作函数的参数和返回值

    def func():
        print(111)
    def func2():
        return func  #当作返回值
    f = func2()
    f()         #当作参数

    结果:

    第一类对象(first-class object)指

    1.可在运行期创建

    2.可用作函数参数或返回值

    3.可存入变量的实体。

    二。闭包

    闭包的定义:内层函数,对外层函数(非全局)的变量的引用,叫做闭包

    闭包的用处:如果说你内存函数是个闭包,python内部有一个机制,遇到闭包

    内存会在内存中开启一个内存空间,不会随着函数的结束而关闭,避免多次开关内存.

    简单应用

    from urllib.request import urlopen
    print(urlopen('http://www.cnblogs.com/jin-xin/articles/8259929.html').read())
    
    def index(url):
        content = urlopen(url).read()
        def get():
            with open('爬虫','a') as f1:
                f1.write(content.decode('utf-8'))
        return get
    index('http://www.cnblogs.com/jin-xin/articles/8259929.html')()

    结果;

    判断函数是否是闭包.__closure__

    def func():
        name = 'alex'
        def func2():
            print(name)
        func2()
        print(func2.__closure__)               #引用几个变量就有几个cell  这个函数就是闭包  不引用就是None  函数不是闭包
    func()

    结果:

    三,在外层函数内部执行内部函数

    def func():
        def func2():
            print(111)
        func2()
    func()
    
    def func():
        def func2():
            print(111)
        return func2
    func()()

    结果:

           

    四。装饰器

    1.比如计算一个函数的执行效率

    import time
    def func():
        print('666')
    start_time = time.time()
    time.sleep(0.1)
    func()
    end_time = time.time()
    print('------的执行效率%s'%(end_time-start_time))

    结果:

       2.进阶写法                    

    import time
    def func():
        print('666')
    def timmer():
        start_time = time.time()
        time.sleep(0.1)
        func()
        end_time = time.time()
        print('------的执行效率%s'%(end_time-start_time))
    timmer()

    结果;

    3.简单的装饰器

    import time
    def func():
        print('我们都一样')
    def timmer():
        start_time = time.time()
        time.sleep(0.1)
        func()
        end_time = time.time()
        print('------的执行效率%s'%(end_time-start_time))
    timmer()

    结果;

    4.带返回值的装饰器(语法糖的用法)

    @timmer 相当于 #func = timmer(func)    即待求的函数名 = 新函数名(待求的函数名)

    import time
    def timmer(func):
        def inner(*args,**kwargs):
            start_time = time.time()
            time.sleep(0.1)
            ret = func(*args,**kwargs)
            end_time = time.time()
            print('------执行效率%s'%(end_time-start_time))
            return ret
        return inner
    
    @timmer
    def func():
        return '666'
    print(func())
    结果:

    5.通用装饰器

    def wrapper(func):
        def inner(*args,**kwargs):
            '''执行函数前的操作'''
            ret = func(*args,**kwargs)
            '''执行函数后的操作'''
            return ret
        return inner
    
    @wrapper
    def func():
        print(111)
    func()
    
    

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               

  • 相关阅读:
    JSON
    必须使用角色管理工具 安装或配置microsoft.net framework 3.5
    Backbone.js之view篇(三)
    MSDN Webcast 资源
    JS获取select 当前选种值
    我理解的js闭包
    javascript基础温习(一)
    js动态添加删除行
    delphi 版 sqlHelper第二版
    2012末日没有到来,继续我们的2013
  • 原文地址:https://www.cnblogs.com/wzbk/p/8414095.html
Copyright © 2011-2022 走看看