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

Reply via email to