Найти - Пользователи
Полная версия: Функция range
Начало » Python для новичков » Функция range
1 2
Maksim
Изучаю python по книге лутца и возник вопрос. В книге написано - ‘В python 3.0 функция range возвращает итератор который генерирует элементы по требованию, поэтому чтобы отобразить результаты ее работы мы должны обернуть результаты ее работы в вызов функции list.’ При использовании функции range, н-р, range (3), возвращается результат range (0, 3). Но непонятно каким образом выполняется извлечение значений из диапазана? Если объект возвращаемый функцией объект-итератор то почему не поддерживается протокол итераций? (метод next не работает)?
Shaman
help(range)
вашей версии Python многое прояснит
ATOM
Итератор можно получить вызовом функции 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
>>> 
Maksim
Shaman,К сожалению не прояснил
Shaman
Maksim
К сожалению не прояснил
Как минимум, можно было заметить
range.__iter__()
, а кроме него
range.__getitem__()
range.__len__()
, раз рискнули углубиться в такие тонкости, как протокол итераций.
Maksim
Shaman, я заметил их. Это методы которые могут использоваться с данным объектом. о чем они могут мне сказать?
Shaman
Maksim
о чем они могут мне сказать?
Первый относится к протоколу итератора, два прочих к протоколу последовательности.
Maksim

Shaman
Первый относится к протоколу итератора, два прочих к протоколу последовательности.
Это понятно, непонятно что за объект возвращается функцией, это не итератор, не список, и вообще где видно что он возвращает возрастающие целочисленные элементы?. он возвращает непонятные range (x,y), н-р, если бы он возвращал список то все было бы понятно.
Shaman
Возвращает объект класса
class range(object)
Который поддерживает протокол итерирования и последовательности.
Shaman
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)
-для медитаций)
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