Stephen said:
'>>> a = [i*2*b for i in range(3) for b in range(4)]
'>>> a
[0, 0, 0, 0, 0, 2, 4, 6, 0, 4, 8, 12]
Might take you a while to correlate the answer with the loop, but you
should be able to see after a while that this nesting is the same as
'>>> a = []
'>>> for b in range(4):
'>>> for i in range(3):
'>>> a.append(i*2*b)
There is a subtle error in this explanation.
if you run the example, you'll notice that it's not so subtle. read on.
The equivilence actually looks like:
'> a = []
'> l1 = range(4)
'> l2 = range(3)
'> for b in l1:
'> for i in l2:
'> a.append(i*2*b)
really?
def myrange(x):
print "RANGE", x
return range(x)
print [i*2*b for i in myrange(3) for b in myrange(4)]
a = []
for b in myrange(4):
for i in myrange(3):
a.append(i*2*b)
print a
a = []
l1 = myrange(4)
l2 = myrange(3)
for b in l1:
for i in l2:
a.append(i*2*b)
print a
prints
RANGE 3
RANGE 4
RANGE 4
RANGE 4
[0, 0, 0, 0, 0, 2, 4, 6, 0, 4, 8, 12]
RANGE 4
RANGE 3
RANGE 3
RANGE 3
RANGE 3
[0, 0, 0, 0, 2, 4, 0, 4, 8, 0, 6, 12]
RANGE 4
RANGE 3
[0, 0, 0, 0, 2, 4, 0, 4, 8, 0, 6, 12]
(to translate a list comprehension to nested statements, remove
the result expression, insert colons and newlines between the for/if
statement parts, and put the append(result expression) part inside
the innermost statement)
</F>