On Tue, 25 Jan 2005 23:53:26 +1000, Nick Coghlan <[EMAIL PROTECTED]> wrote:

>Peter Otten wrote:
>> Nick Coghlan wrote:
>> 
>> 
>>>>Py> print islice((x for x in xrange(1, 996) if x % 2 == 0), 1, 2).next()
>>>>4
>>>
>>>Wouldn't it be nice if this could be spelt:
>>>
>>>print (x for x in xrange(1, 996) if x % 2 == 0)[2]
>>>
>>>Well, I just put a patch on SF to enable exactly that:
>>>http://www.python.org/sf/1108272
>> 
>>  
>> I like it. Of course you always have to bear in mind that one giant leap for
>> a list could be _many_ small steps for an iterator.
>
>Indeed. The main cases I am thinking of involve picking off the first few 
>items 
>of an iterator (either to use them, or to throw them away before using the 
>rest).
>
>And if an app actually *needs* random access, there's a reason lists still 
>exist ;)
>
You can bail out of a generator expression with a raise-StopIteration 
expression spelled iter([]).next() ;-)

 >>> def show(x): print x,; return x
 ...
 >>> list(show(x) for x in xrange(20) if x<8 or iter([]).next())
 0 1 2 3 4 5 6 7
 [0, 1, 2, 3, 4, 5, 6, 7]

Well, since

 >>> list(show(x) for x in xrange(20) if x<8)
 0 1 2 3 4 5 6 7
 [0, 1, 2, 3, 4, 5, 6, 7]

this change due to adding iter([]).next() might be more convincing:

 >>> list(show(x) for x in xrange(20) if x<8 or True)
 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]


 >>> list(show(x) for x in xrange(20) if x<8 or iter([]).next() or True)
 0 1 2 3 4 5 6 7
 [0, 1, 2, 3, 4, 5, 6, 7]


Applied to example,

 >>> print list(x for i,x in enumerate(x for x in xrange(1, 996) if x % 2 ==0) 
 >>> if i<3 or iter([]).next())[2]
 6

or in case you just want one item as result,

 >>> print list(x for i,x in enumerate(x for x in xrange(1, 996) if x % 2 ==0) 
 >>> if i==2 or i==3 and iter([]).next())[0]
 6

Regards,
Bengt Richter
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to