2013-10-10 7 views
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. Почему первый называется callable-iterator? Вы определенно не можете это назвать.

ответ

2

Будучи итератором, подразумевает реализацию протокола итератора, не являющегося членом определенного класса - итератором является как итератор. Вы можете написать свои собственные пользовательские классы, которые являются итераторами, и они не будут перечислены в списке тех классов.

С точки зрения «быть итератором» между ними нет никакой разницы. Все они итераторы, и это означает, что вы можете перебирать их. Есть, конечно, могут быть другие различия между ними - они могут иметь дополнительные методы или поведение, определенные - но, как итераторы, итераторы, они одинаковы.

Вы можете просмотреть итератор как своего рода doodad, который «знает, как» перебирать конкретную структуру данных. У разных типов структур данных могут быть свои собственные пользовательские классы для итерации по ним; эти итераторы могут делать разные вещи под капотом, но все они имеют один и тот же публичный интерфейс (протокол итератора).

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] 
Смежные вопросы