l = range(int(1E9))

Terry Reedy tjreedy at udel.edu
Sat May 2 19:51:58 EDT 2015


On 5/2/2015 5:31 PM, Ian Kelly wrote:

> Would it have been better if range() had been implemented as xrange()
> from the beginning? Sure, that would have been great. Except for one
> small detail: the iterator protocol didn't exist back then.

For loops originally used the getitem iterator protocol. xrange objects 
have a __getitem__ method, but not __iter__ or __next__.  As Mark 
pointed out, they were introduced in 1993.

Getitem iterators still work.  If iter(ob) is passed object ob without 
.__iter__, iter looks for ob.__getitem__ and if present, returns 
iterator(ob), where iterator is an internal protocol adapter class.  Its 
__next__ method calls ob.__getitem__ and converts IndexError to 
StopIteration.

In 3.4.3:

class xrange:
     def __init__(self, start, stop, step):
         if step < 1:
             raise ValueError('incomplete xrange require positive step')
         self.val = start
         self.stop = stop
         self.step = step
     def __getitem__(self, dummy):
         val = self.val
         self.val = val + self.step
         if val < self.stop:
             return val
         else:
             raise IndexError('')

it = iter(xrange(1, 10, 3))
print(type(it))
for i in it:
     print(i)
#
<class 'iterator'>
1
4
7

-- 
Terry Jan Reedy




More information about the Python-list mailing list