我们讨论生成器时涉及两个术语。
生成器函数的定义与普通函数类似, 但是只要需要生成值, 就可以使用
yield关键字
而不是返回。如果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
生成器对象:
生成器函数返回生成器对象。可以通过在生成器对象上调用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
应用范围:
假设我们创建一个斐波纳契数流, 采用生成器方法使其变得微不足道;我们只需要调用next(x)即可获得下一个斐波那契数, 而不必担心数字流在何处或何时结束。
流处理的一种更实用的类型是处理大型数据文件, 例如日志文件。生成器为此类数据处理提供了一种节省空间的方法, 因为在一个给定的时间点仅处理文件的一部分。我们也可以将Iterators用于这些目的, 但是Generator提供了一种快速的方法(我们无需在此处编写__next__和__iter__方法)。
请参阅下面的链接, 以了解Python中生成器的更多高级应用程序。
http://www.dabeaz.com/finalgenerator/
本文作者:Shwetanshu Rohatgi。如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请发表评论。
注意怪胎!巩固你的基础Python编程基础课程和学习基础知识。
首先, 你的面试准备可通过以下方式增强你的数据结构概念:Python DS课程。