Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 12, 2009 20:52:18

bazooka
От:
Зарегистрирован: 2009-04-12
Сообщения: 165
Репутация: +  0  -
Профиль   Отправить e-mail  

итераторы

Набросал класс для “ограничения” range
т.е создается экземпляр с минимумом и максимумом и вызыватся для создания цикла %)
выглядит примерно так, описать сложно
>>> x, y = 0, 50
>>> lr = lrange(5,10)
>>> for i in lr(x,y):
print(i)


5
6
7
8
9
10

еще вариант:
for i in lrange(min,max)(start,stop):

для чево нужно?
например для прохода по спискам, чтоб не ловить индекс ерроры

что-то типо:
for x in range(start,stop):
try:
li = 0
except IndexError:
continue

превращяется в
for x in lr(start,stop):
li = 0

очень удобно если неизвестны заранее x и y
запостил для критики и предложений

############ КЛАСС ################
class lrange:
mi = None
ma = None

def __repr__(self):
return ‘lrange(%s,%s)’ % (self.mi, self.ma)

def __init__(self, mi = None, ma = None):
‘lrange(mi, ma): mi - minimum, ma - maximum ’
self.mi = mi
self.ma = ma

def __call__(self, start, stop = False, step = True):
self.range = range(start, stop, step)
return self

def __iter__(self):
self.iterator = iter(self.range)
return self


def __next__(self):
while True:
step = next(self.iterator)
if self.mi and self.mi <= step and \
self.ma and self.ma >= step:
return step
##################################



Отредактировано (Апрель 12, 2009 22:49:45)

Офлайн

#2 Апрель 12, 2009 22:52:25

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

итераторы

Параметры по умолчанию для __call__ неудачные. Например, если стандартный range вызвать с одним числом - это будет stop. step, если есть - это число. А вообще-то все можно сделать гораздо короче.

>>> import functools
>>> def lrange(min=None, max=None):
... functools.wraps(lrange)
... def inner(*args, **kwargs):
... for i in range(*args, **kwargs):
... if min is not None and i<min:
... continue
... if max is not None and i>max:
... continue
... yield i
... return inner
...
>>> lr = lrange(5, 10)
>>> list(lr(100))
[5, 6, 7, 8, 9, 10]
>>> list(lr(7, 100))
[7, 8, 9, 10]
>>> list(lr(7, 100, -1))
[]
>>> list(lr(100, 7, -1))
[10, 9, 8]



Отредактировано (Апрель 12, 2009 22:53:11)

Офлайн

#3 Апрель 12, 2009 23:02:35

bazooka
От:
Зарегистрирован: 2009-04-12
Сообщения: 165
Репутация: +  0  -
Профиль   Отправить e-mail  

итераторы

Андрей Светлов
Параметры по умолчанию для __call__ неудачные.
я пробовал прикинуть какие дефолтные значения у ренжа
a = range(1,None,None)
не подошел, методом тыка пришло это
наверно надо *args отправлять просто



Офлайн

#4 Апрель 12, 2009 23:22:32

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

итераторы

Хм… Собственно: http://forum.script-coding.info/viewtopic.php?id=462
Последний пост.



Офлайн

#5 Апрель 13, 2009 00:51:16

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

итераторы

ZZZ
Чукча - не читатель. Чукча - писатель!



Офлайн

#6 Апрель 13, 2009 02:03:26

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

итераторы

Ну что-то вроде. Это я тогда не для себя… Так объяснял принципы работы с итераторами/генераторами. Успешно.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version