On Mon, 16 Jan 2006 02:58:39 -0800, Paul Rubin wrote: > Steven D'Aprano <[EMAIL PROTECTED]> writes: >> For finite sequences, your proposal adds nothing new to existing >> solutions like range and xrange. > > Oh come on, [5,4,..0] is much easier to read than range(5,-1,-1).
Only in isolation, and arguably not even then. Or do you think that Perl is much easier to read than Python simply because you can write your programs in fewer characters? It looks too much like the list [5,4,0], and is easy to make typos: [5,4,.0] gives you no syntax error but very different results. The meaning isn't particular clear: is it supposed to be [start, stop, step] (the natural expectation for those used to Python slices and ranges) or [start, next, stop]? It is actually the second, but go back to the original post by Gregory: after giving examples, he still wrongly described his proposal as having a "step" parameter. There is no step parameter -- the step is implied, by subtracting start from next. Such confusion doesn't bode well. Python indexing deliberately goes to one-past-the-end counting for a reason: it helps prevent off-by-one signpost errors. This syntax goes against that decision, and adds one more thing to memorise about Python: the end index is not included in the list, except for arithmetic sequences, where it is, sometimes but not necessarily. In [5,6,10] the end index 10 is included; in [5,7,10] it isn't. You've picked the most awkward example of range, I admit. But let's look at a few others: [0,..9] versus range(10) [55, ...73] versus range(55, 74) [1, 3, ..len(mystr)] versus range(1, len(mystr)+1, 2) [55, 65, 295] versus range(55, 296, 10) How often do you find yourself knowing the first two terms of a sequence but not the step size anyway? Is that a common use case? >> The only added feature this proposal >> introduces is infinite iterators, and they aren't particularly hard to >> make: >> >> def arithmetic_sequence(start, step=1): >> yield start >> while 1: >> start += step >> yield start > > Well, that would be itertools.count(start, step) but in general a simple > expression is nicer than 5 lines of code. I didn't say that my generator was the only way to produce the required result, I was pointing out how simple it is. Yes, itertools is the way to go for this sort of thing. >> If your proposal included support for ranges of characters, I'd be more >> interested. > > There's something to be said for that. Should ['a'..'z'] be a list or a > string? It uses [ something ] syntax, so for consistency with lists and list comprehensions it should be a list. But a string would be more practical, since list(['a'..'z']) is easier and more intuitive than ''.join(['a'..'z']). But I'm not sure that it is *that* much more practical to deserve breaking the reader's expectation. So I think the best thing would be to create itertools.chars('a', 'z') or similar, not new syntax. -- Steven. -- http://mail.python.org/mailman/listinfo/python-list