Python——生成器(Generators)

旧街凉风 提交于 2020-01-14 02:52:07

生成器(Generators)

迭代器可以遍历一个容器的对象。但是一个迭代器在遍历一个容器的数据元素时,并不会执行迭代。

可迭代对象(Iterable)

Python中任意的对象,只要它定义了可以返回一个迭代器__iter__方法,或者定义了可以支持下标索引的__getitem__方法,那么它就是一个可迭代对象。

迭代器(Iterator)

任何对象,只要定义了__next__方法,那么它就是一个迭代器。

迭代(Iteration)

当我们使用一个循环来遍历某个东西的时候,这个过程就叫做迭代。

生成器(Generators)

生成器是一种迭代器,但是你只能对其迭代一次,因为它们并没有将所有的值存在内存中,而是在运行时生成值。你通过遍历来使用它们,要么用一个for循环,要么将传递给任意可以进行迭代的函数和结构。大多数时候生成器是以函数来实现的,返回并不是一个值,而是yield一个值。

def generator_function():
    for i in range(10):
        yield i

for item in generator_function():
    print(item)
"""
0
1
2
3
4
5
6
7
8
9
"""

生成器最佳的应用场景是:你不想同一时间将所有计算出来的大量结果分配到内中中,特别是结果包含在循环中。

def fibon(n):
    a = b = 1
    for i in range(n):
        yield a
        a , b  = b, a+b

for x in fibon(1000000):
    print(x)

这样就可以得到了所有的结果,而且不用担心它使用大量资源。

def generator_function():
    for i in range(3):
        yield i

gen = generator_function()
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen))

可以看到,在yield用掉所有的值后,next()会触发一个StopIteration的异常。for循环可以自动的捕捉这个异常而停止next()。

my_string = "Yasoob"
my_iter = iter(my_string)
print(next(my_iter))

str是一个可迭代的对象,但是可以转换为可迭代的对象。使用iter

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!