WEB开发网
开发学院软件开发Python 可爱的 Python: 迭代器和简单生成器 阅读

可爱的 Python: 迭代器和简单生成器

 2008-11-13 13:17:36 来源:WEB开发网   
核心提示: 从我的观点来看,过去对生成器工厂的语法选择有点欠缺,可爱的 Python: 迭代器和简单生成器(6), yield 语句可以非常好地存在于函数体中,您可能无法确定是否函数一定会在函数体最初 N 行内的某处作为生成器工厂而存在,这里不需要象类的 .__iter__() 方法,遇到的每个 yi

从我的观点来看,过去对生成器工厂的语法选择有点欠缺。 yield 语句可以非常好地存在于函数体中,您可能无法确定是否函数一定会在函数体最初 N 行内的某处作为生成器工厂而存在。当然,对于函数工厂,也存在这样的问题,但是由于函数工厂不改变函数体的实际 语法(并且有时允许函数体返回普通值,尽管这可能不是出自良好的设计)。对于我来说,新关键字 ― 比如 generator 代替 def ― 会是一个比较好的选择。

先不考虑语法,当调用生成器来担当迭代器时,生成器有良好的状况来自动担当迭代器。这里不需要象类的 .__iter__() 方法。遇到的每个 yield 都成为生成器的 .next() 方法的返回值。为了清楚起见,我们来看一个最简单的生成器:

最简单可行的 Python 2.2 生成器

>>>
  
     from
    
     __future__
  
     import
    
     generators
>>>
  
     def
  
     gen
    
    ():
    yield 1
>>> g = gen()
>>> g.next()
1
>>> g.next()
Traceback (most recent call last):
 File "<pyshell#15>", line 1,
  
     in
    
     ?
  g.next()
StopIteration
   

让我们使生成器工作在我们样本问题中:

RandomWalk_Generator.py

  
     from
    
     __future__
  
     import
    
     generators 
    
    # only needed for Python 2.2
     
     import
    
     random
  
     def
  
     randomwalk_generator
    
    ():
  last, rand = 1, random.random()
    
    # initialize candidate elements
     
     
     while
    
     rand > 0.1:       
    
    # threshhold terminator
         
     
     print
    
     '*',         
    
    # display the rejection
         
     
     if
    
     abs(last-rand) >= 0.4: 
    
    # accept the number
      last = rand      
    
    # update prior value
      yield rand       
    
    # return AT THIS POINT
    rand = random.random()   
    
    # new candidate
  yield rand           
    
    # return the final small element
   

上一页  1 2 3 4 5 6 7  下一页

Tags:可爱 Python 迭代

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接