Pull to refresh

Comments 25

>Чтобы получить итератоп по объекту (например, по списку),
интератор?
Спасибо, исправил. Как не вылавливай ошибки, пара всегда ускользает… Горькая правда для программиста :)
> Чтобы получить итератор по объекту (например, по списку), к нему нужно применить функцию iter()

Можно ещё упомянуть, как получить итераторы для dict: itervalues(), iterkeys(), iteritems().
> Итераторы — это специальные объекты, представляющие последовательный доступ к данным из контейнера. При этом немаловажную роль играет то, что память фактически не тратится

Не очень понимаю, как в таких условиях реализован sorted().
Ступил. Жаль комментарии удалять нельзя.
А я и на Delphi придумал простой интерфейс IIterator с двумя методами Rewind и Next. И кучу реализаций этого самого итератора. Конечно, Delphi не Python и на нём всё не так красиво, но и на «рабочей лошадке» Delphi хочу чуть больше хорошего.

А началось всё с того, что в одной из программ линейный список пришлось переиначить в древовидный.
можно короче написать итератор:
def Fibonacci1(n):
    a, b = 0, 1
    while b < n:
        yield b
        a, b = b, a+b

if __name__ == '__main__':
    for i in Fibonacci1(100): print i,

UFO just landed and posted this here
Генераторы используются как раз для создания итераторов.
UFO just landed and posted this here
Вообще в питоне это генератором зовётся. А если понимать что это «лениво»-вычисленный контейнер то и итератор подходит ;)
Генераторы — это следующий шаг. Вообще основная фишка итераторов по сравнению с обычными структурами именно в их ленивости и именно вследствии этого экономности используемых ресурсов, хотя в заметке об этом почему-то не говорится.
UFO just landed and posted this here
Хм. Собственно говоря и в обычной сишке итераторы — вполне привычный механизм. STL весь на них построен, все те же листы, мапы и векторы с их сортировками и перестановками оперируют именно итераторами. И все те же foreach и конструирование итераторов на лету — тоже обычное дело.
В этом ключе не очень понял чем же подход Питона к ним является таким особенным?
Наверное, yield'ом, о котором не упомянули в статье. Кстати, не в «сишке», а в С++.
Хотя бы тем, что в механизм итераторов built-in в Python. В С++ для итераторов нужны доплнительные либы. Если в проекте не используется STL (довольно распространенное явление), прийдется изобретать свои велосипеды (контейнеры и итераторы).
Итератор удобно использовать вместе с последовательностью. Любой объект, поддерживающий интерфейс итератора, имеет метод next(), позволяющий переходить на следующую ступень вычисления. Чтобы получить итератор по объекту (например, по списку), к нему нужно применить функцию iter().

Масло маслянное. Для меня не совсем очевидны те редкие случаи, когда вам может понадобится применять iter() к уже готовому списку, хотя вы только этим в своей статье и занимаетесь. Вы бы лучше про внутреннее устройсто итератора рассказали, помимо функции next(), ну и про генераторы тоже полезно было бы.
Прочитал. Ещё раз прочитал. Так и не понял зачем нужны и в чём отличие итераторов. И зачем они нужны.
Если статья для тех кто зхнает язык, то она тупо не нужна.
А если для тех кто не знаком с этим языком и автор хотел показать как всё круто в питоне, то тема не раскрыта.

Например
«testIt = iter([1, 2, 3, 4, 5])
print [x for x in testIt]

Конечно, это простейшее использование цикла for, только записанное немного по-другому.
«И что же тут нового?» — спросите вы»
«Для меня тут всё новое» — отвечу я.

PS Мне интересен язык. Но, повторюсь, тема не раскрыта…
итераторы — самое главное это не «собрать данные, пробежаться по данным», а «взять следующее пока не кончились». Другими словами:

for i in xrange(1000000000):
print i
break

не создаст в памяти огромный список.

В общем-то основной смысл итераторов раскрывается в генераторах +). Например, собираете вы веб-темплейт. Предположим данные для этого собирает некая функция-генератор:

def prepare_data():
yield 'asd', 123
yield 'dsa', 123
if not something_happens:
yield 'zzz', 123

Собственно суть в том что логику с something_happens можно перенести в саму функцию генератора, а не во внешнюю часть. И тем самым не делать того, чего не нужно в данном конкретном случае. К слову, это все становится заметным вовсе не на пресловутых примерах с числами и малюсенькими строками. А в больших приложениях, особенно после анализа разношерстных django и тп.
а вот первый пример автора с «простейшим циклом for» я и сам не понял.

testit = [1,2,3,4,5]
print [x for x in testit]

и без итератора — аналогичный результат. А так и вовсе на лету генератор делается:
testit = [1,2,3,4,5]
generator = (x for x in testit)
print list(generator)

Зачем там вызывать iter() — неясно +).
Sign up to leave a comment.

Articles