On Tuesday 21 October 2003 06:53 pm, Guido van Rossum wrote: ... > > maybe an optimization IS possible if all the user code does with the > > LC is loop on it (or anyway just get its iter(...) and nothing else). > > But that's not very common, so I don't see the point of putting in the It IS common, at least in the code I write, e.g.: d = dict([ (f(a), g(a)) for a in S ]) s = sets.Set([ a*a for a in S ]) totsq = sum([ x*x for x in S ]) etc. I detest the look of those ([ ... ]), but that's the closest I get to dict comprehensions, set comprehensions, etc. > except when it doesn't, and then making the list comprehension lazy > can be a mistake: the following example > > for key in [k for k in d if d[k] is None]: > del d[key] > > is *not* the same as > > for key in d: > if d[key] is None: > del d Well, no, but even if that last statement was "del d[key]" you'd still be right:-). Even in a situation where the list comp is only looped over once, code MIGHT still be relying on the LC having "snapshotted" and/or exhausted iterators IT uses. I was basically thinking of passing the LC as argument to something -- the typical cases where I use LC now and WISH they were lazy, as above -- rather about for loops. And even when the LC _is_ an argument there might be cases where its current strict (nonlazy) semantics are necessary. Oh well! Alex
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4