Comments 25
>Чтобы получить итератоп по объекту (например, по списку),
интератор?
интератор?
-4
> Чтобы получить итератор по объекту (например, по списку), к нему нужно применить функцию iter()
Можно ещё упомянуть, как получить итераторы для dict: itervalues(), iterkeys(), iteritems().
Можно ещё упомянуть, как получить итераторы для dict: itervalues(), iterkeys(), iteritems().
0
> Итераторы — это специальные объекты, представляющие последовательный доступ к данным из контейнера. При этом немаловажную роль играет то, что память фактически не тратится
Не очень понимаю, как в таких условиях реализован sorted().
Не очень понимаю, как в таких условиях реализован sorted().
0
А я и на Delphi придумал простой интерфейс IIterator с двумя методами Rewind и Next. И кучу реализаций этого самого итератора. Конечно, Delphi не Python и на нём всё не так красиво, но и на «рабочей лошадке» Delphi хочу чуть больше хорошего.
А началось всё с того, что в одной из программ линейный список пришлось переиначить в древовидный.
А началось всё с того, что в одной из программ линейный список пришлось переиначить в древовидный.
0
можно короче написать итератор:
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,
+1
UFO just landed and posted this here
Вообще в питоне это генератором зовётся. А если понимать что это «лениво»-вычисленный контейнер то и итератор подходит ;)
+1
А yeld?
0
Хм. Собственно говоря и в обычной сишке итераторы — вполне привычный механизм. STL весь на них построен, все те же листы, мапы и векторы с их сортировками и перестановками оперируют именно итераторами. И все те же foreach и конструирование итераторов на лету — тоже обычное дело.
В этом ключе не очень понял чем же подход Питона к ним является таким особенным?
В этом ключе не очень понял чем же подход Питона к ним является таким особенным?
0
Наверное, yield'ом, о котором не упомянули в статье. Кстати, не в «сишке», а в С++.
+2
Хотя бы тем, что в механизм итераторов built-in в Python. В С++ для итераторов нужны доплнительные либы. Если в проекте не используется STL (довольно распространенное явление), прийдется изобретать свои велосипеды (контейнеры и итераторы).
0
Итератор удобно использовать вместе с последовательностью. Любой объект, поддерживающий интерфейс итератора, имеет метод next(), позволяющий переходить на следующую ступень вычисления. Чтобы получить итератор по объекту (например, по списку), к нему нужно применить функцию iter().
Масло маслянное. Для меня не совсем очевидны те редкие случаи, когда вам может понадобится применять iter() к уже готовому списку, хотя вы только этим в своей статье и занимаетесь. Вы бы лучше про внутреннее устройсто итератора рассказали, помимо функции next(), ну и про генераторы тоже полезно было бы.
Масло маслянное. Для меня не совсем очевидны те редкие случаи, когда вам может понадобится применять iter() к уже готовому списку, хотя вы только этим в своей статье и занимаетесь. Вы бы лучше про внутреннее устройсто итератора рассказали, помимо функции next(), ну и про генераторы тоже полезно было бы.
0
Прочитал. Ещё раз прочитал. Так и не понял зачем нужны и в чём отличие итераторов. И зачем они нужны.
Если статья для тех кто зхнает язык, то она тупо не нужна.
А если для тех кто не знаком с этим языком и автор хотел показать как всё круто в питоне, то тема не раскрыта.
Например
«testIt = iter([1, 2, 3, 4, 5])
print [x for x in testIt]
Конечно, это простейшее использование цикла for, только записанное немного по-другому.
«И что же тут нового?» — спросите вы»
«Для меня тут всё новое» — отвечу я.
PS Мне интересен язык. Но, повторюсь, тема не раскрыта…
Если статья для тех кто зхнает язык, то она тупо не нужна.
А если для тех кто не знаком с этим языком и автор хотел показать как всё круто в питоне, то тема не раскрыта.
Например
«testIt = iter([1, 2, 3, 4, 5])
print [x for x in testIt]
Конечно, это простейшее использование цикла for, только записанное немного по-другому.
«И что же тут нового?» — спросите вы»
«Для меня тут всё новое» — отвечу я.
PS Мне интересен язык. Но, повторюсь, тема не раскрыта…
0
итераторы — самое главное это не «собрать данные, пробежаться по данным», а «взять следующее пока не кончились». Другими словами:
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 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 и тп.
0
а вот первый пример автора с «простейшим циклом 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() — неясно +).
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() — неясно +).
0
reversed забыли =)
0
Sign up to leave a comment.
Итерируем все и вся