• 迭代器和生成器


    一、迭代器

    什么是可迭代对象:内部含有__iter__方法的对象就叫做可迭代对象

    可迭代对象就遵循可迭代协议。

    如何判断 两种方式

    # print('__iter__' in dir(s))
    # from collections import Iterable
    # l = [1, 2, 3, 4]
    # print(isinstance(l, Iterable)) # True
    # print(type(l))
    # print(isinstance(l,list))

    可迭代对象转化成迭代器:可迭代对象.__iter__() --->迭代器

    迭代器不仅含有__iter__,还含有__next__。遵循迭代器协议。

    迭代器的好处:

    1,节省内存空间。

    2,满足惰性机制。

    3,不能反复取值,不可逆。

    1,将可迭代对象转化成迭代器

    2,内部使用__next__方法取值

    3,运用了异常处理去处理报错。

    l2 = [1, 2, 3, 4, 5, 6, 7, 8]
    l2_obj = l2.__iter__()
    while True:
        try:
            i = l2_obj.__next__()
            print(i)
        except Exception:
            break

    二、生成器

      生成器:生成器本质上是迭代器。

      生成器的产生方式:

      1,生成器函数构造。

      2,生成器推导式构造。

      3,数据类型的转化。

    # def func1():
    #     print(111)
    #     print(222)
    #     print(333)
    #     return 666
    # print(func1())
    
    
    # def func1():
    #     print(111)
    #     print(222)
    #     print(333)
    #     yield 666
    #     yield 555
    #     yield 777
    
    # g = func1()
    # print(g)  # <generator object func1 at 0x0000000001197888>
    #第一:函数中只要有yield 那他就不是一个函数,而是一个生成器
    #第二:g称作生成器对象。
    # print(g.__next__())
    # print(g.__next__())
    # print(g.__next__())
    
    # def func1():
    #     for i in range(1,10001):
    #         print('老男孩校服%d号' % i)
    # func1()
    
    # def func1():
    #     for i in range(1,10001):
    #         yield '老男孩校服%d号' % i
    # g = func1()
    #
    # for i in range(50):
    #     g.__next__()
    #
    # for j in range(150):
    #     print(g.__next__())
    
    # l1 = [i for i in range(1000)]
    
    #send
    def generator():
        print(123)
        content = yield 1
        print(content)
        print(456)
        yield 2
    g = generator()
    g.__next__()
    g.send('hello')
    
    '''
    next 和send 功能一样,都是执行一次
    send可以给上一个yield赋值。
    
    '''
  • 相关阅读:
    [Codeforces 1214A]Optimal Currency Exchange(贪心)
    [Codeforces 1214D]Treasure Island(dfs)
    [BZOJ 3512]DZY Loves Math IV(杜教筛)
    [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛)
    [BZOJ 2154]Crash的数字表格(莫比乌斯反演)
    【莫比乌斯反演+分块】BZOJ1101-[POI2007]Zap
    【状态压缩DP】BZOJ1087-[SCOI2005]互不侵犯King
    【概率DP】BZOJ4318-OSU!
    【最大权闭合子图/最小割】BZOJ3438-小M的作物【待填】
    【莫比乌斯反演】HDU1695_GCD
  • 原文地址:https://www.cnblogs.com/qiujie/p/8724864.html
Copyright © 2020-2023  润新知