[Python-ideas] A real life example of "given"
Chris Angelico
rosuav at gmail.com
Thu May 31 08:55:46 EDT 2018
On Thu, May 31, 2018 at 10:24 PM, Steven D'Aprano <steve at pearwood.info> wrote:
> Do you have an equally compelling example for your given-comprehension
> syntax? I didn't think your example was obviously better than what we
> can already do:
>
> # calculate tx only once per x loop
> [process(tx, y) for x in xs given tx = transform(x) for y in ys]
>
> # existing solution
> [process(tx, y) for tx in (transform(x) for x in xs) for y in yz]
# alternate existing solution
[process(tx, y) for x in xs for tx in [transform(x)] for y in yz]
This syntax allows you to use both x and tx in the resultant
expression. For instance:
[process(value, row_total) for row in dataset for row_total in
[sum(row)] for value in row]
ret = []
for row in dataset:
row_total = sum(row)
for value in row:
ret.append(process(value, row_total))
If done without optimization, each row would take O(n²) time, but this
way it's O(n).
I think Serhiy was trying to establish this form as a standard idiom,
with optimization in the interpreter to avoid constructing a list and
iterating over it (so it would be functionally identical to actual
assignment). I'd rather see that happen than the creation of a messy
'given' syntax.
ChrisA
More information about the Python-ideas
mailing list