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

posted @ 2019-03-06 15:09  烨然2333  阅读(280)  评论(0编辑  收藏  举报