On 5/2/2015 11:26 AM, BartC wrote:

When I first looked at Python 20 or so years ago this seemed to be the
standard way of writing a for-loop:

for i in range(N):
    ....

As Mark said, the actual syntax was originally

for item in sequence: ...

where sequence technically meant an object with a .__getitem__(x) method that either returned an item or raised IndexError. In 2.2, 'sequence' was replaced by the more general concept 'iterable'.

In python, 'for' is and has always been an abbreviation of 'for each' or 'foreach', as used in other languages. C for loops are not 'for each' loops but are initialized while loops, and are so explained in K&R's book, page 56.

'''
for (initializer; condition; update;) body

is equivalent to

initializer
while (condition) {
    body
    update;
}
...
Whether to use while or for is largely a matter of taste.
'''

(I substituted 'initializer', 'condition', 'update' for 'expr1', 'expr2', and 'expr3' as more meaningful.) The proper translation of a C for loop to Python is the translation of the equivalent C while loop. Translating to a Python 'for range' loop is a bit of a mis-translation. One should not be surprised if non-equivalent code behaves differently.

I remember being completely astonished at the time that 'range' actually
created a list of values from 0 to N-1.

The purpose and *documented* behavior of range was to produce an arithmetic sequence. Map, filter, dict.keys, dict.values, dict.items, many others functions also returned lists. In Python3, the ones I named above and some others now return 'less spacious' iterables.

Python was already known to be slow yet it deliberately crippled itself
by using just about the slowest method imaginable of executing a simple
iterative loop? By first creating a list of a million objects!

No, you were also free to do the sensible thing when you did not need a concrete arithmetic sequence (list).

n = 0
while n < 1000000:
    pass
    n = n+1

And sometimes you weren't even interested in the values but just wanted
to execute something N times so it was a wasted effort.

# even simpler
n = 1000000
while n:
    pass
    n -= 1

Using for ... range() is a convenient abbreviation of either pattern. It works for small values of n, it did not work for large values. When Python 1.0 was released in Feb 1992, memory for many system was limited to a megabyte or less. At that time, range(1000000) was an impossible object, so no one aware of memory constraints would try to create it.

--
Terry Jan Reedy

--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to