What does the last line mean in the following code?
import pickle, urllib
Firstly, you need to put http:// in front of the URL, ie:
handle = urllib.urlopen("http://www.pythonchallenge.com/pc/def/banner.p")
An expression [e for e in a_list]
is a list comprehension which generates a list of values.
With Python strings, the *
operator is used to repeat a string. Try typing in the commands one by one into an interpreter then look at data:
>>> data[0]
[(' ', 95)]
This shows us each line of data is a tuple containing two elements.
Thus the expression e[1] * e[0]
is effectively the string in e[0]
repeated e[1]
times.
Hence the program draws a banner.
The question itself has already been fully answered but I'd like to add that a list comprehension also supports filtering. Your original line
print "".join([e[1] * e[0] for e in elt])
could, as an example, become
print "".join([e[1] * e[0] for e in elt if len(e) == 2])
to only operate on items in elt that have two elements.
Andy's is a great answer!
If you want to see every step of the loop (with line-breaks) try this out:
for elt in data:
for e in elt:
print "e[0] == %s, e[1] == %d, which gives us: '%s'" % (e[0], e[1], ''.join(e[1] * e[0]))
[e[1] * e[0] for e in elt]
is a list comprehension, which evaluates to a list itself by looping through another list, in this case elt
. Each element in the new list is e[1]*e[0]
, where e
is the corresponding element in elt
.
join() is a string method, that works on a separator in new string
>>> ':'.join(['ab', 'cd'])
>>> 'ab:cd'
and list comprehension is not necessary there, generator would suffice
Maybe best explained with an example:
print "".join([e[1] * e[0] for e in elt])
is the short form of
x = []
for e in elt:
x.append(e[1] * e[0])
print "".join(x)
List comprehensions are simply syntactic sugar for for
loops, which make an expression out of a sequence of statements.
elt
can be an arbitrary object, since you load it from pickles, and e
likewise. The usage suggests that is it a sequence type, but it could just be anything that implements the sequence protocol.