zoukankan      html  css  js  c++  java
  • 迭代器和生成器

    一、迭代器

    什么是可迭代对象:内部含有__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赋值。
    
    '''
  • 相关阅读:
    Mvc+三层(批量添加、删除、修改)
    js中判断复选款是否选中
    EF的优缺点
    Git tricks: Unstaging files
    Using Git Submodules
    English Learning
    wix xslt for adding node
    The breakpoint will not currently be hit. No symbols have been loaded for this document."
    Use XSLT in wix
    mfc110ud.dll not found
  • 原文地址:https://www.cnblogs.com/qiujie/p/8724864.html
Copyright © 2011-2022 走看看