callable-iterator和listiterator以及迭代器之间的区别?

时间:2013-10-10 04:27:43

标签: python iterator

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

>>> 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?你绝对不能称之为。

2 个答案:

答案 0 :(得分:2)

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

从“作为迭代器”的角度来看,它们之间没有区别。它们都是迭代器,这意味着你可以迭代它们。当然可能存在其他之间的差异 - 它们可能有其他方法或行为定义 - 但作为迭代器的迭代器它们是相同的。

您可以将迭代器视为某种“知道如何”迭代特定数据结构的doodad。不同类型的数据结构可能有自己的自定义类来迭代它们;这些迭代器可能会做不同的事情,但都共享相同的公共接口(迭代器协议)。

答案 1 :(得分:2)

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

>>> 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.

即便:

>>> 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]