• 迭代器,生成器


    可迭代对象

    # 可迭代对象定义:内部含有‘__iter__’方法的数据就是可迭代对象
    # 可迭代对象如:list str tuple set dict range() 文件句柄
    s1 = '二狗的周末生活'
    # print(dir(s1))
    print('__iter__' in dir(s1))

    1、迭代器

    # 内部含有‘__iter__’方法的并且含有‘__next__’方法的就是迭代器
    f1 = open('regsiter', encoding='utf-8')
    print('__iter__' in dir(f1))
    print('__next__' in dir(f1))
    f1.close()
    # 可迭代对象 ----> 迭代器
    # 迭代器:next ---》 一个值

    l1 = [1, 2, 3, 'alex']
    iter1 = iter(l1) # l1.__iter__()
    print(iter1)
    print(iter1.__next__())
    print(iter1.__next__())
    print(iter1.__next__())
    print(iter1.__next__())
    print(iter1.__next__())
    for i in iter1:
        print(i)

    最后一个超出了

    # 迭代器:
    # 1,非常非常节省内存。 这个是最重要
    # 2,他满足惰性机制。
    # 3, 一条路走到黑。

    利用while循环模拟for循环 的机制。
    三部曲:
    # 1, 将可迭代对象转化成迭代器
    # 2, 利用next 进行取值
    # 3, 利用异常处理终止循环。
    l1 = [1, 2, 3, 'alex']
    iter1 = l1.__iter__()  # 1, 将可迭代对象转化成迭代器
    while 1:
        try:
            print(iter1.__next__())   # 2, 利用next 进行取值
        except StopIteration:  # 3, 利用异常处理终止循环。
            break

    2、生成器

    # 生成器:自己用python代码写的迭代器 本质就是迭代器

    # 1,函数式写法

    # 2,生成器表达式
    # 函数式写法 构建生成器
    # 只要函数中出现yield,那么 他就不是函数了,他是生成器函数。
    def func1():
        # print(111)
        # print(222)
        yield 3
        yield 4
        yield 5
        yield 6
        yield 7
    g = func1()  # 生成器对象
    print(g)
    print(g.__next__()) # print(next(g))
    # 一个next 对应一个 yield
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())

    # yield return
    # return 结束函数 给函数返回值
    # yield 不会结束生成器函数,next 对应一个yield进行取值
    生成器有什么好处呢?就是不会一下子在内存中生成太多数据
    假如我想让工厂给学生做校服,生产200件衣服,我和工厂一说,工厂应该是先答应下来,然后再去生产,我可以一件一件的要,也可以根据学生一批一批的找工厂拿。
    而不能是一说要生产20件衣服,工厂就先去做生产20件衣服,等回来做好了,学生都毕业了。。。
    # 1、一次性做200件:直接使用for循环
    def cloth():
        for i in range(1,201):
            print('老年体恤%s号' % (i))
    cloth()
    #2、先做5件,在做剩下的195件。:使用yield生成器先做一部分,在做一部分 def cloth1(): for i in range(1,201): yield '老年体恤%s号' % (i) g = cloth1() for i in range(5): print(g.__next__()) for i in range(195): #从6开始,一直到200 print(g.__next__())
     
     
  • 相关阅读:
    学习python第六天
    学习python第五天
    学习python第四天
    学习python第二天
    网工学Python——模块和包
    网工学Python——初识函数
    网工学Python——常用模块
    网工学Python——基础知识
    网工学Python——目录
    Python-面向对象
  • 原文地址:https://www.cnblogs.com/wangkaiok/p/9906927.html
Copyright © 2020-2023  润新知