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