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))
\输出:**
1
2
3
\例子:**
在此示例中,我们将为斐波那契数创建两个生成器,第一个是简单的生成器,第二个使用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