可爱的 Python: 迭代器和简单生成器
2008-11-13 13:17:36 来源:WEB开发网利用这个函数就象如下所示般简单:
随机遍历列表的迭代
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
更多精彩
赞助商链接