根据您要迭代的内容,有多个迭代器类:
>>> 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?你绝对不能这么说。发布于 2013-10-10 04:34:52
作为迭代器意味着实现迭代器协议,而不是特定类的成员--迭代器就像迭代器一样。您可以编写属于迭代器的自定义类,它们不会是您列出的任何类。
从“作为迭代器”的角度来看,它们之间没有区别。它们都是迭代器,这意味着您可以对它们进行迭代。当然,它们之间可能还有其他的区别--它们可能有额外的方法或行为定义--但作为迭代器、qua迭代器,它们是相同的。
您可以将迭代器看作是某种“知道如何”对特定数据结构进行迭代的涂鸦。不同类型的数据结构可能有自己的自定义类来对它们进行迭代;这些迭代器可能在幕后执行不同的操作,但它们都共享相同的公共接口(迭代器协议)。
发布于 2013-10-10 04:39:45
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]https://stackoverflow.com/questions/19287066
复制相似问题