zoukankan      html  css  js  c++  java
  • 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。

    迭代器的目的:

             减少内存的占用

  • 相关阅读:
    隐马尔可夫模型
    Win10家庭版安装Linux子系统
    python 里的常见包及学习链接
    perl 从命令行读取文件并打开
    Linux 压缩解压缩
    python 2.7.9 安装beautifulsoup4
    成绩排名
    urlretrieve下载图片--爬虫
    python实现人工智能之路--语音识别加语音合成
    django中间件解决跨域问题-No 'Access-Control-Allow-Origin'
  • 原文地址:https://www.cnblogs.com/hexige/p/7487007.html
Copyright © 2011-2022 走看看