Python函数之生成器函数与yield关键字详解
发布时间:2023-06-12 17:47:01
在Python中,函数不仅可以返回一个值,还可以生成一系列的值。这种函数称为生成器函数。
生成器函数有两个特点:
1. 使用yield关键字产生一个值,而不是使用return。
2. 生成器函数被调用后不会立即执行,而是返回一个生成器对象,当该对象被迭代时,函数内部的代码才会被执行。
使用生成器函数的好处是可以节省内存空间,因为生成器函数每次只会生成一个值,并且不会像列表那样一次性生成所有的值,从而避免了大规模内存占用的问题。
下面是一个简单的生成器函数的例子:
def my_gen():
yield 1
yield 2
yield 3
在调用该函数时,不会立即执行函数体内的代码,而是返回一个生成器对象,可以通过迭代生成器对象来获取函数内部生成的值:
g = my_gen() print(next(g)) # 1 print(next(g)) # 2 print(next(g)) # 3
在上面的代码中,我们通过next函数来获取生成器对象所产生的值。每次调用next函数时,都会从上一个yield语句处继续执行函数体,直到遇到下一个yield语句为止。
值得注意的是,在生成器函数中使用return语句会导致StopIteration异常的抛出,表示生成器已经完成工作,不能再产生其他的值了。为了避免这种情况的发生,使用yield语句来代替return语句是更为安全的。
生成器函数还可以接收外部数据,并在每次生成值时根据外部数据来计算生成的值。例如下面的例子:
def fib(max):
a, b = 0, 1
while a < max:
yield a
a, b = b, a + b
g = fib(1000)
for i in g:
print(i)
在上面的代码中,我们定义了一个fib函数来生成斐波那契数列,它接收一个max参数作为上限,并根据斐波那契数列的规则生成数列中的值。当生成器对象被迭代时,函数体内的代码会根据外部传入的max参数来计算每个斐波那契数列的值。
通过这些例子,我们可以看到生成器函数的强大之处,它不仅可以让代码更加简洁,而且还能够在处理大规模数据时提高代码的运行效率。
