On 10 Nov 2005 04:56:34 -0800, "[EMAIL PROTECTED]" <[EMAIL PROTECTED]> wrote:
> >Peter Hansen wrote: >> (I say "readable or somehow better" since you stated in another post "I >> just try to use list/generator expression when possible" but you didn't >> explain your reason for doing so. I assume you have some reason other >> than arbitrary whim.) >The reason is simple: > >I found it easier to read for me and using list/generator expression >helped me uncover a number of subtle bugs comparing with an imperative >approach. > >on its own : > >takewhile(lambda x: condition(x), some_generator) is not very much >difference than(well, still more things to type) > >(x for x in some_generator when condition(x)) I wish you wouldn't write "when" like that, as if it were legal python python syntax. (Nor do I like guessing what it's supposed to mean ;-) >>> list (x for x in xrange(20) when x<5)) File "<stdin>", line 1 list (x for x in xrange(20) when x<5)) ^ SyntaxError: invalid syntax If you want to terminate a generator expression after the first sequence of elements satisfying a condition, and you don't want to use takewhile, I don't know of a gotcha to prevent you from just raising StopIteration, using an expression that will do that, e.g., >>> list (x for x in xrange(20) if x<5 or iter([]).next()) [0, 1, 2, 3, 4] Or a bit more readably: >>> def stop(): raise StopIteration ... >>> list (x for x in xrange(20) if x<5 or stop()) [0, 1, 2, 3, 4] IOW, your "when condition(x)" (IIUIC) can be spelled "if condition(x) or stop()" > >but when I have a number of them in the same expression, the >takewhile/dropwhile becomes to add up. If you don't like Alex'(s?) good advice, you can continue bracketed expressions on several lines, and indent and group for clarity. Regards, Bengt Richter -- http://mail.python.org/mailman/listinfo/python-list