Форум сайта python.su
0
Изучаю python по книге лутца и возник вопрос. В книге написано - ‘В python 3.0 функция range возвращает итератор который генерирует элементы по требованию, поэтому чтобы отобразить результаты ее работы мы должны обернуть результаты ее работы в вызов функции list.’ При использовании функции range, н-р, range (3), возвращается результат range (0, 3). Но непонятно каким образом выполняется извлечение значений из диапазана? Если объект возвращаемый функцией объект-итератор то почему не поддерживается протокол итераций? (метод next не работает)?
Офлайн
88
help(range)
Отредактировано Shaman (Май 28, 2013 17:33:26)
Офлайн
1
Итератор можно получить вызовом функции iter() и использовать для выполнения итераций вручную.
>>> R = range(4) >>> I = iter(R) >>> next(I) 0 >>> next(I) 1 >>> next(I) 2 >>> next(I) 3 >>> next(I) Traceback (most recent call last): File "<pyshell#8>", line 1, in <module> next(I) StopIteration >>>
Офлайн
0
Shaman,К сожалению не прояснил
Офлайн
88
MaksimКак минимум, можно было заметить
К сожалению не прояснил
range.__iter__()
range.__getitem__() range.__len__()
Отредактировано Shaman (Май 28, 2013 19:00:56)
Офлайн
0
Shaman, я заметил их. Это методы которые могут использоваться с данным объектом. о чем они могут мне сказать?
Офлайн
88
MaksimПервый относится к протоколу итератора, два прочих к протоколу последовательности.
о чем они могут мне сказать?
Офлайн
0
ShamanЭто понятно, непонятно что за объект возвращается функцией, это не итератор, не список, и вообще где видно что он возвращает возрастающие целочисленные элементы?. он возвращает непонятные range (x,y), н-р, если бы он возвращал список то все было бы понятно.
Первый относится к протоколу итератора, два прочих к протоколу последовательности.
Офлайн
88
Возвращает объект класса
class range(object)
Офлайн
88
class Test(object): def __init__(self, rng): self.r = range(rng) def __iter__(self): return iter(self.r) def __getitem__(self, i): return self.r[i] def __len__(self): return len(self.r) def __repr__(self): return repr(self.r) if __name__ == '__main__': t = Test(3) print (t) print (t[0], t[2]) for i in t: print (i)
Офлайн