[ x for x in xrange(10) when p(x) ]
Bengt Richter
bokr at oz.net
Fri Nov 11 22:18:01 EST 2005
On Thu, 10 Nov 2005 21:46:37 -0800, aleax at mail.comcast.net (Alex Martelli) wrote:
>bonono at gmail.com <bonono at gmail.com> wrote:
>
>> > >>> 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()"
>> If it is a single loop, takewhile/dropwhile is perfectly fine but as I
>> mentioned in another post, it is nested and the condition needs
>> surrounding scope so seperate function and StopIteration doesn't work
>> as it breaks out of the whole thing expression.
>
>Can you give one example where this stop() function wouldn't work and
>your hypothetical ``when'' would? I don't see how "it breaks out of the
>whole thing expression" -- it terminates ONE for-clause (and what else
>would your cherished ``when'' do?).
>
Well, it seems you do have to put them in the scopes of different generators,
not just for-clauses, depending on the semantics you want e.g.,
>>> def stop(): raise StopIteration
...
>>> list( ((x,y) for x in xrange(20) if x<5 or stop() for y in xrange(20) if y<3 or stop()))
[(0, 0), (0, 1), (0, 2)]
>>> list( ((x,y) for x in xrange(20) if x<5 or stop() for y in (y for y in xrange(20) if y<3 or stop())))
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2), (3, 0), (3, 1), (3, 2),
(4, 0), (4, 1), (4, 2)]
Regards,
Bengt Richter
More information about the Python-list
mailing list