首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >发电机中的StopIteration

发电机中的StopIteration
EN

Stack Overflow用户
提问于 2017-05-08 14:15:11
回答 1查看 2.2K关注 0票数 2

我正在学习python的生成器、迭代器、迭代器,我无法解释为什么下面的内容不能工作。作为练习,我想创建一个函数zip的简单版本。我所做的是:

代码语言:javascript
复制
def myzip(*collections):

    iterables = tuple(iter(collection) for collection in collections)

    yield tuple(next(iterable) for iterable in iterables)

test = myzip([1,2,3],(4,5,6),{7,8,9})

print(next(test))
print(next(test))
print(next(test))

我所做的是:

  • 我有collections,它是一些集合的一个元组
  • 我创建了一个新的元组iterables,其中对于每个集合(这是可迭代的),我使用iter获得迭代器。
  • 然后,我创建了一个新的元组,在每个元组上,我调用next。这个元组是屈服的。

因此,我希望在第一次执行时创建(并存储)对象iterables。然后,在每次迭代(包括第一次迭代)中,我对存储在前面的每个可迭代性调用next并返回它。

然而,这是我得到的:

代码语言:javascript
复制
(1, 4, 8)
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-108-424963a58e58> in <module>()
      8 
      9 print(next(test))
---> 10 print(next(test))

StopIteration: 

所以我看到第一次迭代很好,结果是正确的。但是,第二次迭代会引发一个StopIteration异常,我不明白为什么:每个迭代仍然有一些值,所以next的任何一个返回StopIteration。事实上,这样做是可行的:

代码语言:javascript
复制
def myziptest(*collections):

    iterables = tuple(iter(collection) for collection in collections)

    for _ in range(3):
        print(tuple(next(iterable) for iterable in iterables))

test = myziptest([1,2,3],(4,5,6),{7,8,9})

输出:

代码语言:javascript
复制
(1, 4, 8)
(2, 5, 9)
(3, 6, 7)

那是怎么回事?非常感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-08 15:07:01

这里有一个可行的解决方案

代码语言:javascript
复制
def myzip(*collections):

    iterables = tuple(iter(collection) for collection in collections)

    while True:
        try:
            yield tuple([next(iterable) for iterable in iterables])
        except StopIteration:
            # one of the iterables has no more left.                
            break

test = myzip([1,2,3],(4,5,6),{7,8,9})

print(next(test))
print(next(test))
print(next(test))

此代码与您的代码之间的区别在于,您的代码只生成一个结果。也就是说,多次调用next将为您提供一个StopIteration。

yield x看作是将x放入队列,而next则是从该队列中弹出。当您尝试从空队列中弹出时,您将得到Stopiteration。你只能弹出你放的那么多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43849987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档