可爱的 Python: 迭代器和简单生成器
2008-11-13 13:17:36 来源:WEB开发网从我的观点来看,过去对生成器工厂的语法选择有点欠缺。 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
更多精彩
赞助商链接