Python 中的生成器是一个使用 Yield 关键字返回迭代器的函数。在本文中,我们将讨论生成器函数在 Python 中的工作原理。
Python 中的生成器函数的定义与普通函数类似,但每当它需要生成一个值时,它都会使用Yield 关键字而不是 return 来生成。如果 def 的主体包含yield,则该函数将自动成为 Python 生成器函数。
在Python中,我们只需使用def关键字和yield关键字就可以创建生成器函数。生成器在Python中具有以下语法:
def function_name(): yield statement
\例子:**
在此示例中,我们将创建一个简单的生成器,它将生成三个整数。然后我们将使用 Python for 循环打印这些整数。
# 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
Python Generator 函数返回一个可迭代的生成器对象,即可以用作Iterator。生成器对象可以通过调用生成器对象的 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 # In Python 3, __next__() print(next(x)) print(next(x)) print(next(x))
在此示例中,我们将为斐波那契数创建两个生成器,第一个是简单的生成器,第二个使用for 循环的生成器。
# 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 # In Python 3, __next__() print(next(x)) print(next(x)) print(next(x)) print(next(x)) print(next(x)) # 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
在Python中,生成器表达式是编写生成器函数的另一种方式。它使用 Python列表理解技术,但不是将元素存储在内存中的列表中,而是创建生成器对象。
Python 中的生成器表达式具有以下语法:
(expression for item in iterable)
在此示例中,我们将创建一个生成器对象,该对象将打印 0 到 5 范围内的 5 的倍数,这些倍数也可被 2 整除。
# generator expression generator_exp = (i * 5 for i in range(5) if i%2==0) for i in generator_exp: print(i)
\输出:\
0 10 20
假设我们创建一个斐波那契数流,采用生成器方法使其变得微不足道;我们只需调用 next(x) 即可获取下一个斐波那契数,而不必关心数字流在何时何地结束。一种更实用的流处理类型是处理大型数据文件,例如日志文件。生成器为此类数据处理提供了一种节省空间的方法,因为在一个给定时间点仅处理文件的一部分。我们也可以使用 Iterators 来达到这些目的,但是 Generator 提供了一种快速的方法(我们不需要在这里编写 next 和 iter 方法)。
原文链接:codingdict.net