Skip to main content

6、生成器

Y-aong...About 2 minpython生成器

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,下面的示例揭示了生成器的本质。

Comments
  • Latest
  • Oldest
  • Hottest
Powered by Waline v2.15.8