根据您要迭代的内容,有多个迭代器类:
>>> import re
>>> re.finditer("\d+", "1 ha 2 bah").__class__
<type 'callable-iterator'>
>>> iter([1, 2]).__class__
<type 'listiterator'>
>>> iter("hurm").__class__
<type 'iterator'>
两个问题:
callable-iterator
?你绝对不能称之为。答案 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]