zoukankan      html  css  js  c++  java
  • python迭代器和装饰器

    一、迭代器

    1.迭代器协议:对象必须提供一个__next__()方法,执行该方法要么返回迭代中的下一个对象,要么引起一个StopIteration异常以终止迭代,迭代只能向后进行不能往前回退

    2.可迭代对象:可实现迭代器协议的对象(通过对象内部定义的__iter__()方法)

    3.python的内部工具如for循环、sum、max、min、map、reduce、filter等都通过迭代器协议访问对象

    4.使用for循环访问可迭代对象的本质:调用对象的__iter__()方法生成可迭代对象、执行可迭代对象的__next__()方法依次访问元素、全部访问之后自动终止

    l=(1,'a','b',[1,2])
    a=l.__iter__()  #调用元组内部的__iter__()方法生成可迭代对象
    print(a)  #输出<tuple_iterator object at 0x0000000002701550>
    print(a.__next__())  #调用可迭代对象的__next__()访问元素,每执行一次访问一个元素,也可以使用next(a)访问
    print(a.__next__())  #输出a
    print(a.__next__())  #输出b
    print(a.__next__())  #此处执行后已访问到最后一个元素,如果再执行一次a.__next__()会报StopIteration错误

    5.两种方法提供生成器,生成器只能遍历一次,遍历完之后就为空

    ①生成器函数:类似常规函数,但使用yield语句而不是return语句返回结果,yield语句一次返回一个结果,在每个结果中间挂起函数的状态,以便下次从离开的地方继续执行

    def d():
        yield 1,2,3
        yield 2
    a=d()
    print(a)  #返回<generator object d at 0x000000000214A318>,表示a是一个生成器对象
    print(a.__next__())  #返回(1, 2, 3)
    print(a.__next__())  #返回2

    ②生成器表达式,类似列表推导,但是生成器会按需产生一个对象,而不是一次生成

    三元表达式:True if a>0 else False、i for i in range(10)

    生成器表达式一般通过三元表达式加括号生成

    a=(i for i in range(10))
    print(a)  #返回<generator object <genexpr> at 0x000000000219A318>,表示a是一个生成器对象
    print(a.__next__())  #返回0
    print(a.__next__())  #返回1

    二、装饰器

    高阶函数:函数接收的参数是一个函数名、或者函数的返回值是一个函数名,满足一个条件即可

    装饰器的本质就是函数,为其他函数添加附加功能

    原则:不修改被修饰函数的源代码、不修改被修饰函数的调用方式

    装饰器=高阶函数+函数嵌套+闭包

    import time
    def timmer(func):
        def wrapper():
            start_time = time.time()
            func()
            stop_time=time.time()
            print('test函数运行时间为%s'%(stop_time-start_time))
        return wrapper
    
    @timmer
    def test():
        time.sleep(1)
        print('test函数运行完毕')
    
    test()
    
    #运行结果
    #test函数运行完毕
    #test函数运行时间为1.0002305507659912
  • 相关阅读:
    mysql sql的分类、运算符、常用的数据类型
    mysql 03章_完整性、约束
    java 在数组{1,2,3,4,6,7,8,9,10}中插入一个数5,使其插入完成后仍然有序
    mysql 数据库基本命令
    java 迷你DVD管理器
    15.Request对象的主要方法有哪些?
    get和post的区别?
    什么情况下调用doGet()和doPost()?
    spring的作用
    分享Bromon的blog上对IoC与DI浅显易懂的讲解
  • 原文地址:https://www.cnblogs.com/Forever77/p/9908704.html
Copyright © 2011-2022 走看看