Terry J. Reedy <[email protected]> added the comment:
Comments:
1. The first sentence is a bit too opinionated for my taste. Consider:
map(f, seq)
[f(x) for x in seq]
The map is *more* concise, by 8 chars, than the list comp and, in *my* opinion,
clearer and easier to read without the extra boilerplate and extraneous dummy
variable. I would write the first sentence more like:
"List comprehensions provide a concise way to create lists without having to
use either a blank list followed by list.append or combinations of map, filter,
and lambda expressions."
2. The added examples are nice and should help.
3. "In a list comprehension might contain arbitrary expressions, including
other listcomps." is not a sentence. I think this in meant to say: "The initial
expression in a list comprehension can be any arbitrary expression, including
another list comprehension."
4. I completely agree with removing the scary hobgoblin stuff. In fact, I think
the platitudinous next sentence "Nested list comprehensions are a powerful tool
but -- like all powerful tools -- they need to be used carefully, if at all."
could also go. It does not add anything not better said in what follows. Python
is a powerful tool, but -- like all powerful tools -- it needs to by used
carefully. Yeah, right ;-).
I believe the later sentence "To avoid apprehension when nesting list
comprehensions, read from right to left." means to say "To avoid
mis-apprehandion [or misunderstanding] when nesting list comprehension, read
from outside in." But even this only indirectly points to what I think is the
real danger -- which is to read the nested l.c. as unnested, and hence to get
the order of the clauses wrong. In other words, reading
[[f(x,y) for x in xseq] for y in yseq]
as
[ f(x,y) for x in xseq for y in yseq]
I initally made that mistake when reading the nested example. So I think the
appropriate warning sentence should be something like:
"The main danger to avoid is reading nested comprehensions as if they were one
comprehension with multiple for clauses." This could go after the revised
initial sentence in place of the useless platitude.
4. The example is more confusing than need be because of using a symmetric
matrix. The literal [0,1,2] is both range(len(mat)) and range(len(mat[0])) but
it is only the latter that is relevant. So I strongly urge using an asymmetric
matrix (3x4) and suggest using range(4) instead of [0,1,2,3]
So, change "Consider the following example of a 3x3 matrix held as a list
containing three lists, one list per row::" to
"Suppose one has a 3x4 matrix implemented as a list of 3 lists of length 4::"
Change mat display accordingly, using 1 to 12.
Change "Now, if you wanted to swap rows and columns, you could use this list
comprehension::" to
"The following list comprehension will transpose rows and columns."
>>> [[row[i] for row in mat] for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
I think the more verbose version (slightly modified to match the below) should
be followed by an even more (completely) verbose version:
trans = []
for i in range(4):
transrow = []
for row in mat:
transrow.append(row[i])
trans.append(transrow)
print(trans)
5. "In real world," should be "In the real world,".
----------
_______________________________________
Python tracker <[email protected]>
<http://bugs.python.org/issue13549>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com