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

    如果有一天我们淹没在茫茫人海中庸碌一生,那一定是我们没有努力活得丰盛
  • 相关阅读:
    hdu 1240:Asteroids!(三维BFS搜索)
    hdu 2199:Can you solve this equation?(二分搜索)
    hdu 1195:Open the Lock(暴力BFS广搜)
    【ACM
    hrbustoj 1161:Leyni(树状数组练习)
    时间作为横轴的图表(morris.js)超越昨天的自己系列(8)
    Bean实例化(Spring源码阅读)-我们到底能走多远系列(33)
    Sharded实现学习-我们到底能走多远系列(32)
    初始化IoC容器(Spring源码阅读)-我们到底能走多远系列(31)
    一致性哈希算法 应用场景(转)
  • 原文地址:https://www.cnblogs.com/yeran/p/10483359.html
Copyright © 2011-2022 走看看