An important use of range repeating. one_to_10 = range(1,10) one_to_5 = range(1,5) for x in one_to_5: for x in one_to_10:pass if range wasn't repeatable, range would have to be called 5 times compared with 1!
On 5 August 2012 07:43, Steven D'Aprano < steve+comp.lang.pyt...@pearwood.info> wrote: > On Sat, 04 Aug 2012 21:20:36 +0200, Franck Ditter wrote: > > > Two similar iterable objects but with a different behavior : > [...] > > IMHO, this should not happen in Py3k. What is the rationale of this (bad > > ?) design, which forces the programmer to memorize which one is > > exhaustable and which one is not ?... > > What makes you say that they are "similar" iterable objects? Except that > they are both iterable, they are very different. You might as well say > that lists and dicts are "similar iterable objects". > > filter objects are iterators, and so obey the intentionally simple > iterator protocol. range objects are iterable but not iterators, and do > not obey the iterator protocol. > > py> it = filter(lambda x: x, set('abc')) > py> iter(it) is it > True > py> x = range(1, 15, 2) > py> iter(x) is x > False > > > filter relies on its input, which it consumes as it does. Since the input > may not be restartable, filter cannot be restartable either. For > simplicity, filter does not try to be "clever" and guess when the input > argument is restartable. Instead, it simply and consistently behaves the > same for any iterable input. > > range is a specialist iterable data structure that does not consume > anything. It computes its output lazily, but that is the only similarity > with iterators. There's no need to limit range objects to the simple > iterator protocol, since they don't consume their input -- a single > object can easily compute its output as often as you want. range objects > are indexable and sliceable: > > py> x = range(1, 15, 2) > py> x[4] > 9 > py> x[2:4] > range(5, 9, 2) > > > Why artificially make range objects unrestartable just to satisfy > compatibility with iterators? > > The caller already has to remember that range and filter take different > arguments, do different things, and return different objects. Why is it > hard to remember that range is restartable and filter is not? > > > -- > Steven > -- > http://mail.python.org/mailman/listinfo/python-list >
-- http://mail.python.org/mailman/listinfo/python-list