This thing has bitten me in the past - At the time I put together the "stackfull" package -
if allows stuff like: from stackfull import push, pop ... [push(f(x)) + g(pop()) for x in range(10)] It is painfully simple in its workings: it creates a plain old list in the fame f_locals and uses that as a stack in all stackfull.* operations. Just posting because people involved in this thread might want to experiment with that. (it is on pypi) js -><- On 22 February 2018 at 16:04, Serhiy Storchaka <storch...@gmail.com> wrote: > Yet one discussion about reusing common subexpressions in comprehensions > took place last week on the Python-ideas maillist (see topic "Temporary > variables in comprehensions" [1]). The problem is that in comprehension like > `[f(x) + g(f(x)) for x in range(10)]` the subexpression `f(x)` is evaluated > twice. In normal loop you can introduce a temporary variable for `f(x)`. The > OP wanted to add a special syntax for introducing temporary variables in > comprehensions. This idea already was discussed multiple times in the past. > > There are several ways of resolving this problem with existing syntax. > > 1. Inner generator expression: > > result = [y + g(y) for y in (f(x) for x in range(10))] > > 2. The same, but with extracting the inner generator expression as a > variable: > > f_samples = (f(x) for x in range(10)) > result = [y+g(y) for y in f_samples] > > 3. Extracting the expression with repeated subexpressions as a function with > local variables: > > def func(x): > y = f(x) > return y + g(y) > result = [func(x) for x in range(10)] > > 4. Implementing the whole comprehension as a generator function: > > def gen(): > for x in range(10): > y = f(x) > yield y + g(y) > result = list(gen()) > > 5. Using a normal loop instead of a comprehension: > > result = [] > for x in range(10): > y = f(x) > result.append(y + g(y)) > > And maybe there are other ways. > > Stephan Houben proposed an idiom which looks similar to new hypothetic > syntax: > > result = [y + g(y) for x in range(10) for y in [f(x)]] > > `for y in [expr]` in a comprehension means just assigning expr to y. I never > seen this idiom before, but it can be a good replacement for a hypothetic > syntax for assignment in comprehensions. It changes the original > comprehension less than other approaches, just adds yet one element in a > sequence of for-s and if-s. I think that after using it more widely it will > become pretty idiomatic. > > I have created a patch that optimizes this idiom, making it as fast as a > normal assignment. [2] Yury suggested to ask Guido on the mailing list if he > agrees that this language patten is worth optimizing/promoting. > > [1] https://mail.python.org/pipermail/python-ideas/2018-February/048971.html > [2] https://bugs.python.org/issue32856 > > _______________________________________________ > Python-Dev mailing list > Python-Dev@python.org > https://mail.python.org/mailman/listinfo/python-dev > Unsubscribe: > https://mail.python.org/mailman/options/python-dev/jsbueno%40python.org.br _______________________________________________ Python-Dev mailing list Python-Dev@python.org https://mail.python.org/mailman/listinfo/python-dev Unsubscribe: https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com