
28.02.18 00:27, Chris Angelico пише:
Example usage =============
These list comprehensions are all approximately equivalent::
# Calling the function twice stuff = [[f(x), f(x)] for x in range(5)]
The simplest equivalent of [f(x), f(x)] is [f(x)]*2. It would be worth to use less trivial example, e.g. f(x) + x/f(x).
# Helper function def pair(value): return [value, value] stuff = [pair(f(x)) for x in range(5)]
# Inline helper function stuff = [(lambda v: [v,v])(f(x)) for x in range(5)]
# Extra 'for' loop - see also Serhiy's optimization stuff = [[y, y] for x in range(5) for y in [f(x)]]
# Expanding the comprehension into a loop stuff = [] for x in range(5): y = f(x) stuff.append([y, y])
# Using a statement-local name stuff = [[(f(x) as y), y] for x in range(5)]
Other options: stuff = [[y, y] for y in (f(x) for x in range(5))] g = (f(x) for x in range(5)) stuff = [[y, y] for y in g] def g(): for x in range(5): y = f(x) yield [y, y] stuff = list(g) Seems the two last options are generally considered the most Pythonic. map() and itertools can be helpful in particular cases.