Joining a list:
>>> ''.join([ str(_) for _ in xrange(10) ])
'0123456789'
join must take an iterable.
Apparently, join‘s argument is [ str(_) for _ in xrange(10) ], and it’s a list comprehension.
Look at this:
>>>''.join( str(_) for _ in xrange(10) )
'0123456789'
Now, join‘s argument is just str(_) for _ in xrange(10), no [], but the result is the same.
Why? Does str(_) for _ in xrange(10) also produce a list or an iterable?
This is called a generator expression, and is explained in PEP 289.
The main difference between generator expressions and list comprehensions is that the former don’t create the list in memory.
Note that there’s a third way to write the expression: