Python生成器函数使用说明:yield关键字详解
生成器函数是一种特殊的函数,它可以在执行过程中暂停并且返回一个中间值,然后再从该中间值处继续执行。Python中的yield关键字可以实现生成器函数。
yield语句类似于return,它可以返回一个值,但是它会保留函数的状态,以便下次从该状态继续执行。适用于生成一个大量的数据流并且不能立即进行处理的情况。
下面给出一个简单的示例:
def generator():
yield 1
yield 2
yield 3
这个函数定义了一个生成器,其执行结果是1、2和3。当调用这个生成器时,它将返回一个生成器对象,而不是运行函数的结果。当该对象调用 __next__() 方法时,函数将开始执行,直到遇到第一个 yield 表达式。该表达式将返回其值,并将函数状态保存在堆栈上。该生成器被暂停,直到下一个值被请求。
下面给出一个使用生成器函数的例子,用于生成100万个随机数,然后求这些随机数的平均值。
import random
def random_numbers(num):
for i in range(num):
yield random.random()
def average(num_list):
sum = 0
length = 0
for n in num_list:
sum += n
length += 1
return sum / length
gen = random_numbers(1000000)
avg = average(gen)
print(avg)
该示例中,random_numbers() 是生成器函数,它生成了一百万个随机数,并返回它们的生成器。average() 函数用于计算一组数字的平均值。在这个例子中,这个函数使用生成器来求平均值。
在这个例子中,生成器是惰性的:没有实际生成所有的数字,直到平均值函数调用生成器并请求它们。在实际数据集中,这可以显著减少内存使用。这个示例同样可以在不使用生成器的情况下完成,但是生成器的优势在于它可以在需要时逐步生成数据,而不是一次性生成所有数据。
在Python的标准库中,许多函数都使用生成器来生成输出。如 range(),zip() 和 enumerate()。这些函数生成的序列都是惰性的,它们只在需要时才生成数据。这些生成器函数使得Python程序可以处理大量的数据集,而无需把所有数据一次性装入内存,从而大大提高了程序的效率。
使用yield关键字编写生成器函数的步骤可以总结如下:
1. 定义一个函数,并在其中添加yield关键字。
2. 在函数中使用yield表达式来返回值并暂停函数的执行。
3. 当函数的生成器被调用时,它将开始执行函数并且在遇到第一个yield表达式前暂停。
4. 当调用生成器的 __next__() 方法时,函数将从上次暂停的地方开始重复执行,并再次暂停在下一个yield表达式处。
