Форум сайта python.su
Набросал класс для “ограничения” 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)
Офлайн
Параметры по умолчанию для __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)
Офлайн
Андрей Светловя пробовал прикинуть какие дефолтные значения у ренжа
Параметры по умолчанию для __call__ неудачные.
Офлайн
Хм… Собственно: http://forum.script-coding.info/viewtopic.php?id=462
Последний пост.
Офлайн
ZZZ
Чукча - не читатель. Чукча - писатель!
Офлайн
Ну что-то вроде. Это я тогда не для себя… Так объяснял принципы работы с итераторами/генераторами. Успешно.
Офлайн