Python如何使用生成器?详细指南

2021年3月20日14:14:58 发表评论 723 次浏览

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

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

生成器函数

生成器函数的定义与普通函数类似, 但是只要需要生成值, 就可以使用

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课程。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: