5

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

>>> 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. 为什么第一个叫a callable-iterator?你绝对不能调用它。
4

2 回答 2

3

BrenBarn非常愉快地回答了#1,但我相信我已经解开了#2 的奥秘。也就是说,acallable-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]
于 2013-10-10T04:39:45.627 回答
2

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

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

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

于 2013-10-10T04:34:52.277 回答