• python基础之闭包、装饰器、迭代器


    一、闭包函数

    1、定义:函数内部定义函数,成为内部函数。该内部函数包含对外部作用域,而不是对全局作用域名字的引用,那么该内部函数成为闭包函数

    name='alex'
    def func():
        name='egon'
        def bar():
             print(name)
        return bar
    
    
    b=func()
    print(b)

    2、闭包函数特点:自带作用域、包含对外部作用域而非全局作用域的引用

    包一层
    def wrapper():
        money=1000
        def tell_info():
            print('egon have money %s' %money)
        return tell_info
    tell_info=wrapper()
    tell_info()
    
        
    包二层
    def aaa():
        name='egon'
        def wrapper():
            money=1000
            def tell_info():
                print('egon have maney %s'%(money))
                print('my name is %s'%(name))
            return tell_info
        return wrapper
    w=aaa()
    tell_info=w()
    tell_info()

    3、定义闭包函数的基本形式

    外部函数名():

      内部函数需要的变量

      def 内部函数():

        引用外部变量

      return 内部函数

    def deco():
         x=1
         def wrapper():
             print(x)
    
         return wrapper
    
    wrapper=deco()
    print(wrapper)

    二、装饰器

    1、开放封闭原则,对拓展是开放的,对修改的封闭的

    2、装饰器,本质可以任意调用对象,被装饰的对象也可以是任意可调用对象

    3、功能:在不修改被装饰对象源代码以及调用方式的前提下为其添加新功能

    原则:不修改源代码、不修改调用方法。  目标:添加新功能

    # import time
    # import random
    # #装饰器
    # def timmer(func):
    #     # func=index
    #     def wrapper():
    #         start_time = time.time()
    #         func() #index()
    #         stop_time=time.time()
    #         print('run time is %s' %(stop_time-start_time))
    #     return wrapper
    # #被装饰函数
    # def index():
    #     time.sleep(random.randrange(1,5))
    #     print('welecome to index page')
    #
    # def home():
    #     time.sleep(random.randrange(1,3))
    #     print('welecome to HOME page')
    #
    # index=timmer(index) #index=wrapper
    # home=timmer(home)
    #
    # index() #wrapper()
    # home()

    装饰器语法:在被装饰对象的正上方的单独一行,@装饰器的名字

    三、迭代器

    1、定义:迭代器对象要求支持迭代器协议的对象,支持迭代器协议就是实现对象的__iter__()和next()方法。其中__iter__()方法返回迭代器对象本身;next()方法返回容器的下一个元素,在结尾时引发StopIteration异常。

    2、__iter__()和next()方法,这两个方法是迭代器最基本的方法,一个用来获得迭代器对象,一个用来获取容器中的下一个元素。

    d={'a':1,'b':2,'c':3}
    
    i=d.__iter__() #i叫迭代器
    print(i)
    print(i.__next__())
    print(i.__next__())
    print(i.__next__())
    print(i.__next__()) #StopIteration

    3、迭代器的优点:提供了一种不依赖于索引的取值方式,节省内存

         迭代器的缺点:取值不如按照索引取值方便、一次性的,只能往后走不能往前退、无法获取长度

  • 相关阅读:
    XSLT语法 在.net中使用XSLT转换xml文档示例
    .Net那点事儿系列:System.IO之Stream
    javaWeb 控制层互相调用的两种方案
    eclipse 被选中的内容,无法被输入的新内容替换掉
    notepad++ 多行编辑(列编辑)
    Ajax & PHP 边学边练 之四 表单
    Ajax & PHP 边学边练 之五 图片处理
    Ajax & PHP 边学边练 之二 实例
    Ajax & PHP 边学边练 之一 Ajax基础
    Ajax & PHP 边学边练 之三 数据库
  • 原文地址:https://www.cnblogs.com/fenglinglf/p/7009057.html
Copyright © 2020-2023  润新知