首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可调用迭代器与语言迭代器和迭代器的区别?

可调用迭代器与语言迭代器和迭代器的区别?
EN

Stack Overflow用户
提问于 2013-10-10 04:27:42
回答 2查看 1.8K关注 0票数 5

根据您要迭代的内容,有多个迭代器类:

代码语言:javascript
复制
>>> import re
>>> re.finditer("\d+", "1 ha 2 bah").__class__
<type 'callable-iterator'>
>>> iter([1, 2]).__class__
<type 'listiterator'>
>>> iter("hurm").__class__
<type 'iterator'>

两个问题:

  1. 他们之间有什么有意义的区别吗?
  2. 为什么第一个名为callable-iterator?你绝对不能这么说。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-10 04:34:52

作为迭代器意味着实现迭代器协议,而不是特定类的成员--迭代器就像迭代器一样。您可以编写属于迭代器的自定义类,它们不会是您列出的任何类。

从“作为迭代器”的角度来看,它们之间没有区别。它们都是迭代器,这意味着您可以对它们进行迭代。当然,它们之间可能还有其他的区别--它们可能有额外的方法或行为定义--但作为迭代器、qua迭代器,它们是相同的。

您可以将迭代器看作是某种“知道如何”对特定数据结构进行迭代的涂鸦。不同类型的数据结构可能有自己的自定义类来对它们进行迭代;这些迭代器可能在幕后执行不同的操作,但它们都共享相同的公共接口(迭代器协议)。

票数 2
EN

Stack Overflow用户

发布于 2013-10-10 04:39:45

BrenBarn非常愉快地回答了#1,但我相信我已经解开了#2的奥秘。也就是说,callable-iterator是使用iter的第二种形式返回的:

代码语言:javascript
复制
>>> help(iter)
iter(...)
    iter(collection) -> iterator
    iter(callable, sentinel) -> iterator

    Get an iterator from an object.  In the first form, the argument must
    supply its own iterator, or be a sequence.
    In the second form, the callable is called until it returns the sentinel.

即:

代码语言:javascript
复制
>>> def globals_are_bad_mmkay():
        global foo
        foo += 1
        return foo

>>> foo = 0
>>> it = iter(globals_are_bad_mmkay, 10)
>>> it
<callable-iterator object at 0x021609B0>
>>> list(it)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19287066

复制
相关文章

相似问题

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