Найти - Пользователи
Полная версия: итераторы
Начало » Python для новичков » итераторы
1
bazooka
Набросал класс для “ограничения” 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
##################################
Андрей Светлов
Параметры по умолчанию для __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]
bazooka
Андрей Светлов
Параметры по умолчанию для __call__ неудачные.
я пробовал прикинуть какие дефолтные значения у ренжа
a = range(1,None,None)
не подошел, методом тыка пришло это
наверно надо *args отправлять просто
ZZZ
Хм… Собственно: http://forum.script-coding.info/viewtopic.php?id=462
Последний пост.
Андрей Светлов
ZZZ
Чукча - не читатель. Чукча - писатель!
ZZZ
Ну что-то вроде. Это я тогда не для себя… Так объяснял принципы работы с итераторами/генераторами. Успешно.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB