On , I learned ...
How to create a tuple when i would have made a list
When creating tuples of elements you can use the same syntax as lists, except
with ()s instead of []s. e.g. (1, 2, 3) instead of [1, 2, 3].
tuple([1, 2, 3]) creates a list, then builds a tuple out of the elements in
that list and discards the list, which is a bunch of extra wasteful work. This
includes empty tuples empty_tuple = ().
The one confusing caveat to this is tuple comprehension. Whereas for a list you
can do [x * 2 for x in range(5)] to build the list [0, 2, 4, 6, 8], if you
used parenthesis it doesn’t make a tuple, but a lazy-evaluated generator, which
is typically not want. So that’s the case where you would use
tuple(x * 2 for x in range(5)).
>>> [x * 2 for x in range(5)]
[0, 2, 4, 6, 8]
>>> tuple(x * 2 for x in range(5))
(0, 2, 4, 6, 8)
>>> (x * 2 for x in range(5))
<generator object <genexpr> at 0x7fc41fbff9f0>