📜  Python中的生成器

📅  最后修改于: 2022-05-13 01:54:52.125000             🧑  作者: Mango

Python中的生成器

先决条件:产量关键字和迭代器

当我们讨论生成器时,涉及到两个术语。

  1. 生成器函数:生成器函数的定义与普通函数一样,但每当需要生成值时,它都会使用 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

所以生成器函数返回一个可迭代的生成器对象,即可以用作 Iterators 。

作为另一个示例,下面是斐波那契数列的生成器。

# 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) 来获取下一个斐波那契数,而不必担心数字流在何时何地结束。
更实用的流处理类型是处理大型数据文件,例如日志文件。生成器为此类数据处理提供了一种节省空间的方法,因为在一个给定的时间点只处理文件的一部分。我们也可以将迭代器用于这些目的,但是 Generator 提供了一种快速的方法(我们不需要在这里编写 __next__ 和 __iter__ 方法)。

有关Python中生成器的更高级应用,请参阅下面的链接。
http://www.dabeaz.com/finalgenerator/