【发布时间】:2013-05-04 03:18:24
【问题描述】:
为什么在示例函数中终止:
def func(iterable):
while True:
val = next(iterable)
yield val
但是如果我取消yield语句函数会引发StopIteration异常?
编辑:抱歉误导了你们。我知道生成器是什么以及如何使用它们。当然,当我说函数终止时,我并不是指急切地评估函数。我只是暗示当我使用函数生成生成器时:
gen = func(iterable)
在 func 的情况下,它可以工作并返回相同的生成器,但在 func2 的情况下:
def func2(iterable):
while True:
val = next(iterable)
它引发 StopIteration 而不是 None 返回或无限循环。
让我更具体一点。 itertools中有一个函数tee相当于:
def tee(iterable, n=2):
it = iter(iterable)
deques = [collections.deque() for i in range(n)]
def gen(mydeque):
while True:
if not mydeque: # when the local deque is empty
newval = next(it) # fetch a new value and
for d in deques: # load it to all the deques
d.append(newval)
yield mydeque.popleft()
return tuple(gen(d) for d in deques)
事实上,有一些魔法,因为嵌套函数 gen 有无限循环,没有 break 语句。 gen 函数在 it 中没有项目时由于 StopIteration 异常而终止。但它正确终止(不引发异常),即只是停止循环。 所以问题是:StopIteration 是在哪里处理的?
【问题讨论】:
-
你怎么称呼这个?
标签: python yield stopiteration