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是永远不可能存储全体自然数的。

    如果有一天我们淹没在茫茫人海中庸碌一生,那一定是我们没有努力活得丰盛
  • 相关阅读:
    使用 Markdown Flow 画流程图
    两串锂电池的电池匹配
    笔记: CC2540 和 CC2541 的区别
    Elasticsearch 5.x 关于term query和match query的认识
    es 批量导入文件
    mac 下搭建Elasticsearch 5.4.3分布式集群
    Elastic Search 5.4.3 java api 入门
    solr java demo 基础入门
    创建索引并进行查询
    RabbitMq 之简单队列
  • 原文地址:https://www.cnblogs.com/yeran/p/10483359.html
Copyright © 2011-2022 走看看