6、生成器
...About 2 min
6、生成器
一、定义
在 Python 中,使用了 yield 的函数被称为生成器(generator)。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
调用一个生成器函数,返回的是一个迭代器对象。
二、特点
是一种典型的以时间换空间的方法
如果我们要处理更多元素,那么所占内存就呈线性增大,所以受到内存限制,列表容量是有限的。通常我们并不会一次处理所有元素,而只是集中在其中的某些相邻的元素上。所以如果列表元素可以用某种算法用已知量推导出来,就不必一次创建所有的元素。这种边循环边计算的机制,称为生成器(generator),生成器是用时间换空间的典型实例。
三、生成器表达式
list0 = [x * x for x in range(5)]
print(list0)
list_generator0 = (x * x for x in range(5))
print(list_generator0)
list_generator1 = (x * x for x in range(5000000))
print(sys.getsizeof(list_generator0))
print(sys.getsizeof(list_generator1))
>>>
[0, 1, 4, 9, 16]
<generator object <genexpr> at 0x000002C7B9955B48>
88
88
四、生成器函数
通过生成器表达式来生成 generator 是有局限的,比如斐波那契数列用表达式写不出来,复杂的处理需要生成器函数完成。
def fibonacci(n):
i, j = 0, 1
fibonacci_list = list()
while i < n:
fibonacci_list.append(i)
i, j = j, i + j
return fibonacci_list
print(fibonacci(10))
五、生成器的本质
任何一个生成器都会定义一个名为 next 的方法,这个方法要在最后一个元素之后需抛出 StopIteration 异常。next() 函数的本质就是调用对象的 next()。这个方法要么返回迭代的下一项,要么引起结束迭代的异常 StopIteration,下面的示例揭示了生成器的本质。
Powered by Waline v2.15.8