Комментарии 41
В избранное, немедленно в избранное!
P.S. Большое спасибо за понятное объяснение.
P.S. Большое спасибо за понятное объяснение.
+3
Спасибо, стало гораздо понятнее.
Тоже сохранил в избранное.
Тоже сохранил в избранное.
+1
Кажется, уже было, но в избранном пусть полежит. А то я знаю про них, умею пользоваться, но не использую — в питоне с большим объемом данных не работаю.
0
Сорри за некропостинг. Это не только с большими данными. К примеру поиск файла с определенными критериями как Вы организовываете?
1.Очень многие сначала пробегаются по директории рекурсивно, создают список, а потом в for-конструкции берут очередной элемент этого списка, т.е. имя файла и уже работают с ним.
2. А это можно значительно улучшить тем, что как только нашли имя файла, то вместо сохранения в список, сразу же yield filename.
1.Очень многие сначала пробегаются по директории рекурсивно, создают список, а потом в for-конструкции берут очередной элемент этого списка, т.е. имя файла и уже работают с ним.
2. А это можно значительно улучшить тем, что как только нашли имя файла, то вместо сохранения в список, сразу же yield filename.
0
def node._get_child_candidates
— разве это нормально? Скорее всего имелось в виду — def _get_child_candidates
0
И действительно, что отмечают и в комментариях на SO:
Посмотрел в исходники (http://well-adjusted.de/~jrschulz/mspace/mspace-pysrc.html#VPTree._get_child_candidates) — там тоже такого нет. Непонятно, в общем, откуда автор вопроса такое взял.
def anobject.method(): pass is invalid syntax in Python. – J.F. Sebastian Oct 24 '08 at 19:09
Посмотрел в исходники (http://well-adjusted.de/~jrschulz/mspace/mspace-pysrc.html#VPTree._get_child_candidates) — там тоже такого нет. Непонятно, в общем, откуда автор вопроса такое взял.
0
Пару месяцев назад разобрался с yield именно благодаря этому топику на stackoverflow.
0
Смутно вспоминаю, что в документации было написано, что не стоит менять список во время итерации по нему.
+2
Это не совсем модификация списка, это такой хитрый способ перебрать дерево.
0
Разве? У нас же while по candidates.
А в теле цикла candidates.extend.
А в теле цикла candidates.extend.
0
Наверное, также стоит добавить, что итерирование завершается за счет выбрасывания исключения
на самом деле работает как-то так:
Это важно понимать, если для итерирования генеретора не достаточно констрункции
StopIteration
. Т.е. вот этот кодfor i in gen: print i
на самом деле работает как-то так:
try: while True: print gen.next() catch StopIteration: pass
Это важно понимать, если для итерирования генеретора не достаточно констрункции
for ... in
, и нужно закрутить что-то с while
'ом. +4
Только конечно не
catch
, а except
. ) 0
Еще, в статье не упоминается, что в коде генератора также можно использовать
return
, но без возвращаемого значения, который воспринимается, как завершение итерирования и аналогичен raise StopIteration
+4
НЛО прилетело и опубликовало эту надпись здесь
Я вам попытался ответить на этот комментарий, но попал в top-level: habrahabr.ru/blogs/python/132554/#comment_4401013 — взгляните, там хорошая ссылка.
0
А насколько в питоне исключения быстро работают? В некоторых языках, например жава, не рекомендуется использовать исключения для штатных ситуаций, потому что это работает не очень быстро. В питоне, получается, такого нет.
0
Питон не позиционируется как системный язык, а потому в вопросе использования исключений принято исходить из удобства. Ситуация, когда функция возвращает «не успешность» своего выполнения как значение (return) является скорее антипаттерном.
0
Ответ на ваш вопрос stackoverflow.com/questions/8107695/python-faq-how-fast-are-exceptions
0
Например, через yield генератор может не только возвращать значение, но и принимать произвольный аргумент:
Более того, это само интересное в yield-е и есть. yield i разжёвывать и смысла особого нет — ну генераторы и генераторы. А вот j = yield i позволяет делать сопроцедуры (coroutines). Которые открывают совершенно новые возможности в Python-е, от цепочек «потребителей» (в смысле, они являются как бы антонимом к «генераторам», но, точно так же, как и генераторы, могут объединяться в цепочки) до кооперативной многозадачности (!!!).
На эту тему есть хорошая (правда, длинная и на английском) презентация: www.dabeaz.com/coroutines/Coroutines.pdf
+4
НЛО прилетело и опубликовало эту надпись здесь
На основе этого сделан inline callback в асинхронных фреймворках twisted, web tornado.
0
Шикарная вещь, узнал об этом буквально неделю назад. Понял, что во многих местах нужно было использовать именно g.send() вместо костылей.
0
вот ещё статья, про использование генераторов для управления задачами: www.kamaelia.org/MiniAxon.html.
0
Итерация это процесс, включающий итерируемые объекты (реализующие метод __iter__()) и итераторы (реализующие __next__())
Только не __next_()_, а next().
0
Отличное изложение, все понятно и по делу.
0
>Генераторам же предшествуют итераторы.
Всё никак не могу понять: в теории итераторы и генераторы — это просто множества со схожими свойствами/интерфейсами или одно из них является подмножеством (или наследником, если угодно) другого? Является ли корректным высказывание: «Любой итератор — это генератор»?
Всё никак не могу понять: в теории итераторы и генераторы — это просто множества со схожими свойствами/интерфейсами или одно из них является подмножеством (или наследником, если угодно) другого? Является ли корректным высказывание: «Любой итератор — это генератор»?
0
Бывают iterators, iterables и generators.
Iterable (iterable interface) — интерфейс, позволяющий итерироваться (метод next/__next__ и raise StopIteration в конце).
Iterator — объект с iterable interface.
Generator — функция, возвращающая iterator.
The Python Tutorial — Classes
Building Skills in Python — Iterators and Generators
Iterable (iterable interface) — интерфейс, позволяющий итерироваться (метод next/__next__ и raise StopIteration в конце).
Iterator — объект с iterable interface.
Generator — функция, возвращающая iterator.
The Python Tutorial — Classes
Building Skills in Python — Iterators and Generators
+2
Да StackOverflow уже не торт, там всякие Димы Маликовы тусуются.
-2
Ужасно!
В объяснении удалось избежать функциональных замыканий, continuations и сопроцедур!
В объяснении удалось избежать функциональных замыканий, continuations и сопроцедур!
-1
а в питоне поддерживается возбуждение исключения в месте yield?
0
Требую мануал по рекурсивным генераторам! :)
0
Зарегистрируйтесь на Хабре , чтобы оставить комментарий
Как работает yield