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

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

 2008-11-13 13:17:36 来源:WEB开发网   
核心提示: 利用这个函数就象如下所示般简单:随机遍历列表的迭代for num in randomwalk_list():print num,上面这种方法中有几个值得注意的局限性,这个特定的示例中极不可能产生庞大的数字列表,可爱的 Python: 迭代器和简单生成器(3),但只通过将阀值终结符定义得较严

利用这个函数就象如下所示般简单:

随机遍历列表的迭代

for num in randomwalk_list():
  print num,

上面这种方法中有几个值得注意的局限性。这个特定的示例中极不可能产生庞大的数字列表,但只通过将阀值终结符定义得较严格,就可以创建任意大流(随机精确大小,但可以预见数量级)。在某种程度上,内存和性能问题可能使得这种方法不切实际,以及没有必要。同样是这个问题,使得 Python 较早的版本中添加了 xrange() 和 xreadlines() 。更重要的是,许多流取决于外部事件,并且当每个元素可用时,才处理这些流。例如,流可以侦听一个端口,或者等待用户输入。试图在流之外创建完整的列表并不就是这些情形中的某一种。

在 Python 2.1 和较早版本中,我们的诀窍是使用“静态”函数局部变量来记住关于函数的上一次调用的一些事情。显而易见,全局变量可以做同样的工作,但它们带来了大家熟知的全局性名称空间污染的问题,并会因非局部性而引起错误。这里,如果您不熟悉这个诀窍,可能会感到诧异 ― Python 没有“正式”的静态范围声明。然而,如果赋予了命名参数可变的缺省值,那么参数就可以,用作以前调用的持久存储器。明确的讲,列表是一些便利的可变对象,他们甚至可以方便地保留多个值。

使用“静态”方法,可以编写如下的函数:

RandomWalk_Static.py

  
     import
    
     random
  
     def
  
     randomwalk_static
    
    (last=[1]):  
    
    # init the "static" var(s)
  rand = random.random()     
    
    # init a candidate value
     
     
     if
    
     last[0] < 0.1:       
    
    # threshhold terminator
         
     
     return
    
     None        
    
    # end-of-stream flag
     
     
     while
    
     abs(last[0]-rand) < 0.4: 
    
    # look for usable candidate
         
     
     print
    
     '*',         
    
    # display the rejection
    rand = random.random()   
    
    # new candidate
  last[0] = rand         
    
    # update the "static" var
     
     
     return
    
     rand
   

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

Tags:可爱 Python 迭代

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