zoukankan      html  css  js  c++  java
  • 06-python-生成器、循环器

    生成器

    生成器(generator)的主要目的是构成一个用户自定义的循环对象。

    生成器的编写方法和函数定义类似,只是在return的地方改为yield。生成器中可以有多个yield。当生成器遇到一个yield时,会暂停运行生成器,返回yield后面的值。当再次调用生成器的时候,会从刚才暂停的地方继续运行,直到下一个yield。生成器自身又构成一个循环器,每次循环使用一个yield返回的值。
    看一个例子:

    def gen():
        a = 100
        yield a
        a = a*8
        yield a
        yield 1000
    

    再看一个例子:

    def gen():
        for i in range(4):
            yield i
    

    在Python中,这种一边循环一边计算的机制,称为生成器:generator。生成器是一个特殊的程序,可以被用作控制循环的迭代行为,python中生成器是迭代器的一种,使用yield返回值函数,每次调用yield会暂停。

    生成器的构造方法:

    1.把一个列表生成式的[]中括号改为()小括号,就创建一个generator

    #列表生成式
    lis = [x*x for x in range(10)]
    print(lis)
    #生成器
    generator_ex = (x*x for x in range(10))
    print(generator_ex)
    

    第二个结果却是:
    <generator object at 0x000002A4CBF9EBA0>

    如果要一个个打印出来,可以通过next()函数获得generator的下一个返回值:

    #生成器
    generator_ex = (x*x for x in range(10))
    print(next(generator_ex))
    print(next(generator_ex))
    

    但一般常用的是 通过for 循环来使用生成器,因为generator是一个可迭代对象。

    2. 通过生成器函数来构造生成器,即以yield返回数值且阻塞的函数

    迭代器

    可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。

    注意一些对象属于可迭代对象,但不是迭代器
    把list、dict、str等Iterable变成Iterator可以使用iter()函数:

    >>> isinstance(iter([]), Iterator)
    True
    >>> isinstance(iter('abc'), Iterator)
    True
    

    什么list、dict、str等数据类型不是Iterator?

    这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

    Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。

    如果有一天我们淹没在茫茫人海中庸碌一生,那一定是我们没有努力活得丰盛
  • 相关阅读:
    MySQL中实现中文格式日期获取
    java 中 getResourceAsStream() 方法总结
    在IE中通过JScript获取到电脑的Mac地址
    锐浪报表WebSample中jsp服务构建
    Web 项目打包EXE
    js数据结构之-时间复杂度
    JS小问题之——jquery的triggerHandler
    HTML5学习之————FileReader接口
    JS小问题之——如何用原生js触发事件
    https 页面中引入 http 资源的报错
  • 原文地址:https://www.cnblogs.com/yeran/p/10483359.html
Copyright © 2011-2022 走看看