Suggestion for impriving list comprehensions

Steven D. Majewski sdm7g at Virginia.EDU
Fri Jul 27 03:20:54 CEST 2001


On 26 Jul 2001, Thomas Bellman wrote:

> or my personal favourite
> 
>     map(lambda x,g=fib(): g.next(), range(N))
> 

Cool. 

I see I can get the odd values from the first 10 fibonacci numbers with:

>>> def odd(x): return x % 2 
... 
>>> def even(x) : return not(odd(x))
... 
>>> filter( odd, map( lambda n,f=fib().next: f(), range(10) ))
[1, 1, 3, 5, 13, 21, 55]


But the first 10 odd fibonacci numbers doesn't work the same way. 

But Re: Guido's suggestion about an iterator algebra : 
 maybe what we need are iterator versions of map, filter, reduce, etc. 


Given:

>>> def gfilter( f, s ):
...     for x in s:
...             if f(x): yield x

Then the first 10 odd fibonacci numbers are:

>>> map( lambda n,f=gfilter( odd, fib() ).next: f(), range(10) )
[1, 1, 3, 5, 13, 21, 55, 89, 233, 377]



( I'm not completely sure that I actually *like* all the iterator 
  syntax and semantics -- the extra indirection which sometimes
  needs to be explicit  ( the "next" attribute ) but sometimes 
  gets done automagically by 'for' is something I'm not quite 
  used to yet! ) 


-- Steve Majewski






More information about the Python-list mailing list