欢迎访问宙启技术站
智能推送

Python生成器函数:yield的神奇之处

发布时间:2023-06-01 01:20:11

作为一种强大而优雅的编程语言,Python 提供了多种方法来简化代码,使代码更加可读并提高代码的复用性。Python 的生成器函数就是其中一种非常有趣且强大的方式。

Python 的生成器函数的核心在于 yield 关键字,yield 可以将函数转变为生成器并返回一个可迭代的对象。每次调用 yield 时,函数将返回其中一个值,但不会结束函数的执行,而是会保存当前的状态(即当前变量的值)。当下一次调用生成器方法时,函数会从上一次停止的状态继续执行。

举个例子,比如我们需要生成一个斐波那契数列(即前两个数相加得到第三个数),可以使用普通的函数实现:

def fibonacci(n):
    a, b = 0, 1
    result = []
    for i in range(n):
        result.append(a)
        a, b = b, a + b
    return result

但是,由于列表的长度是由 n 决定的,而且在内存中存储所有的值,可能会出现内存问题,尤其是当 n 很大时。

使用生成器函数来实现斐波那契数列代码如下:

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

在这个函数中,我们使用 yield 关键字替代了 append 方法,并省略了 result 变量的定义。当函数被调用时,会返回一个生成器对象,而不是一个列表。每次调用生成器的 __next__() 方法时,函数中的代码会从上一次停止的位置继续执行,直到遇到下一个 yield 关键字,生成器将返回其中的值。当所有的 yield 语句都执行完后,函数将自动结束执行,而不需要显式地返回任何东西。

现在,我们来测试一下用生成器函数实现的 fibonacci() 函数:

for i in fibonacci(10):
    print(i)

输出结果为:

0
1
1
2
3
5
8
13
21
34

以上是 Python 生成器函数 yield 的简单介绍。这种函数可以方便地生成大量数据,同时减少内存的使用,使代码更加优雅易读。在复杂的程序中,使用生成器函数通常会提供更好的性能和更优雅的解决方案。