Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 2, 2010 00:15:29

knkd
От:
Зарегистрирован: 2009-06-14
Сообщения: 225
Репутация: +  0  -
Профиль   Отправить e-mail  

Можно ли скопировать итератор?

У меня есть итератор

In [16]: import itertools
In [17]: from copy import deepcopy
In [18]: a=[0,1,2,3]
In [19]: b=[9,8,7,6]
In [20]: c=it.chain(a,b)
In [21]: d=deepcopy(c)
In [22]: id(c), id(d)
Out[22]: (140332818554768, 140332818554576)
In [23]: list(c)
Out[23]: [0, 1, 2, 3, 9, 8, 7, 6]
In [24]: list(d)
Out[24]: []
Возможно ли создать независимую копию итератора, или генератора/генераторного выражения?



Офлайн

#2 Апрель 2, 2010 01:44:21

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Можно ли скопировать итератор?

Нет, нельзя.
Более того, ваше пожелание идеологически неверное, потому что

>>> iterable = range(10)
>>> i = iter(iterable)
>>> i is iter(i)
True
Делать копию итератора - неправильно. Можно поймать очень интересные баги.
copy.copy и copy.deepcopy не выбрасывают исключение для itertools исключительно по недосмотру разработчиков.



Офлайн

#3 Апрель 2, 2010 02:49:49

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Можно ли скопировать итератор?

Андрей Светлов
Нет, нельзя.
Может просто вопрос не правильно сформулирован, судя по примеру, топикастеру нужна возможность “пройти” по итератору более одного раза, если это так, то функция tee из itertools вполне может помочь
>>> import itertools
>>> a=[0,1,2,3]
>>> b=[9,8,7,6]
>>> c, d = itertools.tee(itertools.chain(a, b))
>>> list(c)
[0, 1, 2, 3, 9, 8, 7, 6]
>>> list(d)
[0, 1, 2, 3, 9, 8, 7, 6]



Отредактировано (Апрель 2, 2010 02:51:00)

Офлайн

#4 Апрель 2, 2010 13:49:29

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

Можно ли скопировать итератор?

какой вообще смысл копирования итератора? О_о'



Офлайн

#5 Апрель 2, 2010 19:09:15

knkd
От:
Зарегистрирован: 2009-06-14
Сообщения: 225
Репутация: +  0  -
Профиль   Отправить e-mail  

Можно ли скопировать итератор?

pyuser
Может просто вопрос не правильно сформулирован, судя по примеру, топикастеру нужна возможность “пройти” по итератору более одного раза, если это так, то функция tee из itertools вполне может помочь
Дада! Именно это и хотелось.
Но itertools.tee не работает с итераторами обёрнутыми в класс.
Каким именно образом он производит клонирование? Это можно повторить самому?



Офлайн

#6 Апрель 2, 2010 21:53:23

Griffon
От: Ukrain, Zaporozhie
Зарегистрирован: 2009-03-04
Сообщения: 324
Репутация: +  11  -
Профиль   Отправить e-mail  

Можно ли скопировать итератор?

А что мешает повторно выполнить chain(a, b)? Это ведь не требует много времени. Кроме того сами списки никуда не деваются.



Офлайн

#7 Апрель 3, 2010 01:47:52

knkd
От:
Зарегистрирован: 2009-06-14
Сообщения: 225
Репутация: +  0  -
Профиль   Отправить e-mail  

Можно ли скопировать итератор?

Griffon
А что мешает повторно выполнить chain(a, b)? Это ведь не требует много времени. Кроме того сами списки никуда не деваются.
Имеется объект, представляющий собой контейнер для цепочки итераторов.
Фактически лисапедная реализация некоторых функций итертулса.
a = xrange(1000)
b = MySuperClass(a)
b.imap(lambda x: x**2).ifilter(lambda x: x%2!=0).ienumerate()
и тд. и тп.
Нужна возможность на определённом этапе клонировать существующий итератор, чтобы если результаты окажутся неудовлетворительными то можно было продолжить с точки разветвления.
itertools.tee не подходит.
Для реализации вложенности (итератор цепочки тоже может быть цепочкой) итераторы ообёрнуты в класс.
itertools.tee копировать их в таком случае отказывается :(



Офлайн

#8 Апрель 3, 2010 09:20:17

Griffon
От: Ukrain, Zaporozhie
Зарегистрирован: 2009-03-04
Сообщения: 324
Репутация: +  11  -
Профиль   Отправить e-mail  

Можно ли скопировать итератор?

Может добавить метод __copy__?
http://www.python.org/dev/peps/pep-0323/



Офлайн

#9 Апрель 3, 2010 14:08:29

knkd
От:
Зарегистрирован: 2009-06-14
Сообщения: 225
Репутация: +  0  -
Профиль   Отправить e-mail  

Можно ли скопировать итератор?

Griffon
Может добавить метод __copy__?
Метод всёравно должен будет копировать итератор.

Кажется я придумал решение. Буду хранить не готовые итераторы, а только ссылки на методы и передаваемые функции. А итераторы будут создаваться по требованию.



Офлайн

#10 Апрель 3, 2010 15:01:30

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Можно ли скопировать итератор?

Это - правильно.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version