• python 生成器与迭代器


    什么是生成器?   

    生成器(generator)就是 python 中一种一边循环一边计算的机制

    生成器有什么作用?

    比如当我们生成一个列表,我们可以通过列表式直接创建一个列表。但是受到内存的限制,列表的容量肯定是有限的。而且创建一个非常大的列表时消耗的内存也是非常大的。如果我们仅仅需要访问前面几个元素,那么后面绝大多数占用的空间都浪费了。而生成器可以帮助我们不必创建完整的列表,在需要时通过循环来创建出后面的元素,节省大量的空间。

    生成器创建的方法:

    要创建生成器有很多种方法。第一种方法很简单,只要把一个列表的【】改成()

    1 L =[x for x in range(5)] 
    2 
    3 G =(x for x in range(5))

    分别输出 L 和 G 得出以下结果:

    L:[0,1,2,3,4]

    G:<generator object <genexpr> at 0x02101C90>

    可以发现 G 是一个生成器对象;如果想要打印出来可以通过 next() 函数获得生成器的下一个返回值:

    next(G)                               # 执行此操作会打印出 0
    
    next(G)                               # 执行此操作会打印出 1
    
    ……
    
    next(G)                               # 执行此操作会打印出 5

    在没有元素时,,在使用 next 会抛出一个 stoplteration 异常。

    创建生成器方法2:

    1 def lister(times):
    2     n = 0
    3     while n < times:
    4         yield n
    5         n += 1
    6 
    7 for x in lister(5):
    8     print(x)

    yield 函数可以将整个函数转换成生成器

    上面的代码执行时会不断调用 yield ,就会不断中断产生一个数值,记录下来,此时 lister(5) 便是一个 generator 对象。当然也可以采用 next 函数逐次输出。

    对于 yield 转换的函数可以使用 send 来进行传值达到控制的目的:

             如 g =  lister()

                  g.send(6)

    迭代:

             迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。

    可迭代对像(Iterable):

            可被循环的都是可被迭代的,统称为可迭代对像。

    可迭代对像的判断:

            可以使用 isinstance() 判断一个对象是否是 Iterable 对像:

             用法: isinstance(obj,class)

             如:     

    1 from collections import Iterable
    2 
    3 isinstance ([ ], Iterable)
    4 
    5 ##返回值为 True

    迭代器(Iterator):

            生成器都是 Iterator 对像,但 list ,dict, str,tuple等类型虽然都是 Iterable 却不是 Iterator;

            生成器的值的对像被称为迭代器

            迭代器对像从集合的第一个元素开始访问,直到所有元素被访问完结束。迭代器只能往前不会后退。

            可以使用 isinstance() 判断一个对象是否是 Iterable 对像:

            用法: isinstance(obj,class)

            如:    

    1  from collections import Iterator
    2 
    3 isinstance ([ ], Iterator)
    4 
    5 #返回值为False

    迭代器的转换:

            对于非迭代器的可迭代对像可以使用 iter() 函数将 Iterable 转化为 Iterator。

    迭代器的目的:

             减少内存的占用

  • 相关阅读:
    hdu 5726 GCD
    codeforces 982C Cut 'em all!
    codeforces 982B Bus of Characters
    codeforces 982A Row
    codeforces 983B XOR-pyramid
    codeforces 979D Kuro and GCD and XOR and SUM
    codeforces 983A Finite or not?
    codeforces 984B Minesweeper
    codeforces 979C Kuro and Walking Route
    codeforces 979B Treasure Hunt
  • 原文地址:https://www.cnblogs.com/hexige/p/7487007.html
Copyright © 2020-2023  润新知