• Python 装饰器、生成器、迭代器


    装饰器

    作用:为其他函数增加功能

    装饰器必须要明白以下几点:

    1.作用域

    2.高阶函数

    3.闭包

    from functools import reduce
    import time
    
    
    def outside(func):
        def inside(*args):
            start = time.time()
            func(*args)
            end = time.time()
            result = end - start
            print(result)
        return inside
    
    @outside #同于 add = outside(add)
    def add(*args):
        num = reduce(lambda a,b : a+b, args)
        time.sleep(0.2)
        print(num)
    
    @outside
    def mul(*args):
        num = reduce(lambda a,b : a*b, args)
        time.sleep(0.4)
        print(num)
    
    
    if __name__ == "__main__":
        add(*range(1,101))
        mul(*range(1,6,2))

    生成器

    什么是生成器:

    生成器本身是没值的,只有你调用了,才会给你返回值。

    列表就好比是,厨师把所有的菜全部端上桌子,你想吃那个你点那个,不过有占地方

    生成器就好比是,厨师还没做,当你点完所有想吃的菜之后,厨师先只给你做一个,只有你把前面的菜吃完了,才能给你继续做下一个。

    创建生成器:

    1、(x for x in range(10))

    num = (x**2 for x in range(1,11))

    2、yeild

    def func():
        print("first")
        yield 1
        print("second")
        yield 2
    # 此时的func函数就是一个生成器对象

    查看生成器的值:

    1、next()  等同于 __next__()

    num = (x**2 for x in range(1,11))
    print(next(num))
    print(next(num))

    2、for循环

    def func():
        print("first")
        yield 1
        print("second")
        yield 2
    
    for i in func():
        print(i)

    为什么使用for 就不用再使用next 了呢?
    因为for循环内部有一个next(),所以在for循环中不需在调用next()

     3、send

    send方法与,next方法类似。,用于yield的前的变量。

    send方法可以为变量传值,前提是必须要有变量。

    如果生成器还没进入,但还要使用send 方法,参数必须是None。

    def func():
        print("first")
        parameter = yield 1
        print(parameter)
        yield 2
        yield "third"
    
    f = func() # f是生成器对象
    
    f.send(None)
    f.send("second")
    print(next(f))

    迭代器

    生成器都是迭代器,但迭代器不一定是生成器。

     

    什么是可迭代对象(iterable):

    能被iter方法调用,例:列表,元祖,字典,集合,字符串

    什么是迭代器(iterator):

    能被iter方法,next方法调用。

    for循环内部所做的事情:

    1.调用可迭代对象的iter方法,返回一个迭代器对象

    2.调用迭代器对象的next方法

    3.处理StopIteration

    # 创建迭代器对象
    number = [1,2,3]
    print(type(number)) # <class 'list'>
    
    number = iter(number) # 等同 __iter__()
    
    print(type(number)) # <class 'list_iterator'>
    
    # 调用
    next(number)
    for i in number:
        print(i)
  • 相关阅读:
    洛谷P2569 (BZOJ1855)[SCOI2010]股票交易 【单调队列优化DP】
    洛谷 P2254 [NOI2005]瑰丽华尔兹(单调栈优化DP)
    CF372C Watching Fireworks is Fun(单调队列优化DP)
    2019牛客全国多校第八场A题 All-one Matrices(单调栈)
    HDU3896 Greatest TC(双联通分量+倍增)
    2019牛客多校第7场
    ZOJ 2112 Dynamic Rankings(树状数组+主席树)
    2019 杭电多校第六场 题解
    HDU2242 考研路茫茫——空调教室 (双联通分+树形DP)
    HDU5536 Chip Factory
  • 原文地址:https://www.cnblogs.com/py-peng/p/10774601.html
Copyright © 2020-2023  润新知