Я вивчаю "Пітон" Алекса Мартелі в короткій оболонці, і книга свідчить, що будь-який об'єкт, який має next()
метод, є (або, принаймні, може бути використаний як) ітератором . Це також передбачає, що більшість ітераторів будуються за допомогою неявних або явних викликів викликаного методу iter
.
Прочитавши це в книзі, я відчув бажання спробувати. Я запустив інтерпретатор python 2.7.3 і зробив це:
>>> x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> for number in range(0, 10):
... print x.next()
Однак результат був такий:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
AttributeError: 'list' object has no attribute 'next'
В розгубленості я спробував вивчити структуру x-об'єкта через dir(x)
і помітив, що в ньому є __iter__
функційний об'єкт. Тож я зрозумів, що його можна використовувати як ітератор, якщо він підтримує такий тип інтерфейсу.
Тому, коли я спробував ще раз, цього разу дещо інакше, намагаючись зробити це:
>>> _temp_iter = next(x)
Я отримав цю помилку:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list object is not an iterator
Але як список може НЕ бути ітератором, оскільки він, схоже, підтримує цей інтерфейс, і, безумовно, може бути використаний як такий у наступному контексті:
>>> for number in x:
... print x
Хтось може допомогти мені пояснити це на мій погляд?
next
просто повертаютьсяself
, тому ви можете зателефонуватиiter(iter(iter(iter(x))))
і отримати те саме, що іiter(x)
. Ось чомуfor
працює як з ітераторами, так і з ітераторами без нюху типу (ну, не враховуючи оптимізацію продуктивності).