我们讨论生成器时涉及两个术语。
1)Generator-Function:generator-function的定义类似于普通函数,但是每当需要生成值时,它都使用yield关键字而不是return来生成。如果def的主体包含yield,该函数将自动成为生成器函数。
# A generator function that yields 1 for first time,
# 2 second time and 3 third time
def simpleGeneratorFun():
yield 1
yield 2
yield 3
# Driver code to check above generator function
for value in simpleGeneratorFun():
print(value)
输出:
1
2
3
2)Generator-Object:生成器函数返回生成器对象。可以通过在生成器对象上调用next方法或在“ for in”循环中使用生成器对象来使用生成器对象(如上述程序所示)。
# A Python program to demonstrate use of
# generator object with next()
# A generator function
def simpleGeneratorFun():
yield 1
yield 2
yield 3
# x is a generator object
x = simpleGeneratorFun()
# Iterating over the generator object using next
print(x.next()); # In Python 3, __next__()
print(x.next());
print(x.next());
输出:
1
2
3
因此,生成器函数返回可迭代的生成器对象,即可用作迭代器。
作为另一个示例,下面是斐波那契数的生成器。
# A simple generator for Fibonacci Numbers
def fib(limit):
# Initialize first two Fibonacci Numbers
a, b = 0, 1
# One by one yield next Fibonacci Number
while a < limit:
yield a
a, b = b, a + b
# Create a generator object
x = fib(5)
# Iterating over the generator object using next
print(x.next()); # In Python 3, __next__()
print(x.next());
print(x.next());
print(x.next());
print(x.next());
# Iterating over the generator object using for
# in loop.
print("\nUsing for in loop")
for i in fib(5):
print(i)
输出:
0
1
1
2
3
Using for in loop
0
1
1
2
3
应用:假设我们要创建一个Fibonacci数流,采用生成器方法会使它变得很简单;我们只需调用next(x)就可以得到下一个Fibonacci数,而不必担心数字流在哪里或何时结束。
流处理的一种更实用的类型是处理大型数据文件,例如日志文件。生成器为此类数据处理提供了一种节省空间的方法,因为在一个给定的时间点仅处理文件的一部分。我们也可以将Iterators用于这些目的,但是Generator提供了一种快速的方法(我们无需在此处编写__next__和__iter__方法)。