Terry J. Reedy <tjre...@udel.edu> 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 <rep...@bugs.python.org>
<http://bugs.python.org/issue13549>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to