Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 15, 2008 01:31:46

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Задачка на комбинаторику.

Да, и стоит добавить, что функция iter должна возвращать генератор с любого итератора… :-)
(выполняется метод __iter__ объекта)



Офлайн

#2 Ноя. 17, 2008 09:08:59

Dimka665
От:
Зарегистрирован: 2008-09-19
Сообщения: 177
Репутация: +  0  -
Профиль   Отправить e-mail  

Задачка на комбинаторику.

ноуу(
iter возвращает итератор с любого класса.



Офлайн

#3 Ноя. 18, 2008 00:21:07

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Задачка на комбинаторику.

Да?

class C(object): pass
c = C()
iter(c)



Офлайн

#4 Ноя. 18, 2008 07:30:55

Dimka665
От:
Зарегистрирован: 2008-09-19
Сообщения: 177
Репутация: +  0  -
Профиль   Отправить e-mail  

Задачка на комбинаторику.

Да! )))

class ifib():
def __init__(self, n):
self.n = n
self.prev = 1
self.prevprev = 0

def __iter__(self):
return self

def next(self):
self.prev, self.prevprev = self.prev + self.prevprev, self.prev
if self.prev<self.n:
return self.prev
else:
raise StopIteration
вы б лучше привели пример того,
ZZZ
что функция iter должна возвращать генератор с любого итератора… :-)



Офлайн

#5 Ноя. 18, 2008 15:40:07

Butjok
От:
Зарегистрирован: 2008-10-26
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Задачка на комбинаторику.

В универе нам задали написать перестановки для строк, но только на Си, вот что из этого вышло:

void perm(char *in, char *buf, int len) {
static cur = 0;
int i;
if (cur == len) {
puts(buf);
return;
}
for (i = 0; i < len; i++) {
if (in[i]) {
buf[cur] = in[i];
in[i] = 0;
cur++;
perm(in, buf, len);
in[i] = buf[--cur];
}
}
}
:-D



Отредактировано (Ноя. 18, 2008 15:44:44)

Офлайн

#6 Ноя. 19, 2008 00:19:17

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Задачка на комбинаторику.

Dimka665
Да! )))
Во-пераых, ты сказал “любого класса”. Или у меня галюцинации? Слуховые…
Во-вторых, что случится, если твой объект твоего класса начать перебирать дважды одновременно (не обязательно в нитях, можно и вложенном цикле)? Мне кажется, что ничего хорошего. А ты никогда не пробовал в двух уровнях перебирать стандартные листы? Ну нет никаких проблем.

Dimka665
вы б лучше привели пример того,
ZZZ
что функция iter должна возвращать генератор с любого итератора… :-)
Да сколько угодно! Простой пример.
class C(object):
def __init__(self, L):
self.list = L
def __iter__(self):
for i in xrange(0, len(self.list)):
yield self.list[i]
Вот теперь перебирайте сколько угодно! Изменять self.list во время перебора не рекомендую, но при желании и это можно решить.
С другой стороны мы можем создать в __iter__ класс-итератор типа твоего и его и вернуть – тоже допустимо и иногда полезно.

P.S. Давай на “ты”! :-)

P.P.S. За понты не банят?
def ifibonacci():
last, curr = 0, 1
while True:
last, curr = curr, last + curr
yield curr



Офлайн

#7 Ноя. 19, 2008 08:35:59

Dimka665
От:
Зарегистрирован: 2008-09-19
Сообщения: 177
Репутация: +  0  -
Профиль   Отправить e-mail  

Задачка на комбинаторику.

не не не зетзетзет, не не не…

ZZZ
Во-пераых, ты сказал “любого класса”. Или у меня галюцинации? Слуховые…
это массовые слуховые галлюцинации ;-)
ZZZ
Во-вторых, что случится, если твой объект твоего класса начать перебирать дважды одновременно (не обязательно в нитях, можно и вложенном цикле)? Мне кажется, что ничего хорошего. А ты никогда не пробовал в двух уровнях перебирать стандартные листы? Ну нет никаких проблем.
ээээ… слышь?! :-) ты мой класс не трогай. и ничего плохого с ним не случится. и вообще речь шла не об этом.
ты сказал, что iter, оно же __iter__, оно же - функция вызываемая при for in, “должна возвращать генератор с любого итератора”. это не верно. она должна возвращать итератор ~ объект с методом next, бла бла бла.
>>> print iter.__doc__
iter(collection) -> iterator
iter(callable, sentinel) -> iterator

Get an iterator from an object. In the first form, the argument must
supply its own iterator, or be a sequence.
In the second form, the callable is called until it returns the sentinel.
генераторы имеют интерфейс итераторов, то есть фактически являются итераторами.
берем твой простой пример.
>>> class C(object):
def __init__(self, L):
self.list = L
def __iter__(self):
for i in xrange(0, len(self.list)):
yield self.list[i]

>>> s = C([1,2,3])
>>> a = iter(s)
>>> a
<generator object at 0x011592B0>
>>> a.next()
1
>>> a.next()
2
>>> a.next()
3
>>> a.next()

Traceback (most recent call last):
File "<pyshell#118>", line 1, in <module>
a.next()
StopIteration
————-
have fun!)))



Отредактировано (Ноя. 19, 2008 08:42:53)

Офлайн

#8 Ноя. 20, 2008 00:57:59

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Задачка на комбинаторику.

slivlen
Есть пример аналог на питоне.
Ага. но он какой-то странный. Посмотрим… =)



Офлайн

#9 Ноя. 20, 2008 00:59:18

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Задачка на комбинаторику.

Butjok
Один в один, как вариант Dimka665 на питоне =)



Офлайн

#10 Ноя. 20, 2008 01:03:34

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Задачка на комбинаторику.

Dimka665
не не не зетзетзет, не не не…
Мой ник по-русски читается как “Спящий”. Меня так с детства близкие друзья звали. :-)

Dimka665
генераторы имеют интерфейс итераторов, то есть фактически являются итераторами.
Я бы сказал так: генератор, это частный случай итератора. Согласен? Кто прав? Дружба. :-)
Реально же я считаю в корне не верным и очень не красивым делать так:
class C(object):
def __iter__(self): return self
Генератор – в девяносто девяти случаях из ста является серебрянной лож… эээ… пулей.

Dimka665
генераторы имеют интерфейс итераторов, то есть фактически являются итераторами.
берем твой простой пример.
И что ты этим хотел сказать? Совершенно адекватное поведение генератора. И, кстати, генератора.

Вот, взгляни на код:
# -*- coding: utf-8 -*-

class xrange(object):
"""xrange([start = 0], end, [step = 1])"""

def __init__(self, start_or_stop, end = None, step = 1):
if end is None:
start, end = 0, start_or_stop
else:
start = start_or_stop
self.start = start
self.end = end
self.step = step

# Вычисляем количество членов последовательности
if start < end and step < 0:
self.len = 0
elif start > end and step > 0:
self.len = 0
elif start == end:
self.len = 0
elif step == 0:
raise ValueError("xrange() step argument must not be zero")
else:
self.len = abs((end - start) / step)

# Максимальный и минимальный (отрицательный) индексы
self.max_index = self.len - 1
self.min_index = self.len * (-1)

def __len__(self): return self.len

def __getitem__(self, n): # Вызывается при доступе к индексу
if self.len == 0:
raise IndexError("xrange object index out of range")
elif not self.min_index <= n <= self.max_index:
raise IndexError("xrange object index out of range")

if n < 0: # Если индекс отрицательный, то приводим его к положительному
n = self.len + n

return self.start + self.step * n # Вспоминаем шестой(?) класс средней школы

print type(iter(xrange(10, 20, 2)))
Метод __iter__ вообще отсутствует, однако итератор вполне неплохо создаётся и работает.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version