if does not evaluate

Jim Newton jimka at rdrop.com
Fri Jun 11 10:39:23 EDT 2004


ah so i must encapsulate the predicate function in another named
function which uses yield in order to have the iteration abort
when the target item is reached?  can i simply put the predicate
function inside a lambda?

-jim


Peter Otten wrote:
> Jim Newton wrote:
> 
> 
>>sorry, i do not understand.  The python syntax is a bit
>>difficult for me.
> 
> 
> Maybe I obscured the issue by comparing name attributes to a string instead
> of using a predicate() function.
> 
> 
>>if i have a list x and a function f how do i know if
>>there is an element of x on which f returns something
>>other than False?
> 
> 
> Using the above identifiers, let's assume we are looking for a name starting
> with "M":
> 
> 
>>>>x = ["Peter", "Paul", "Mary", "Jane"]
>>>>def f(o):
> 
> ...     print "checking", o
> ...     return o.startswith("M")
> ...
> 
> If we call
> 
> 
>>>>map(f, x)
> 
> checking Peter
> checking Paul
> checking Mary
> checking Jane
> [False, False, True, False]
> 
> it invokes f() for every item in x and returns the above list of booleans.
> The equivalent list comprehension would be [f(i) for i in x]. Now
> 
> 
>>>>True in map(f, x)
> 
> checking Peter
> checking Paul
> checking Mary
> checking Jane
> True
> 
> gives the correct result but unfortunately does too much work as we don't
> need to calculate f("Jane") when we already know the outcome. Enter
> generator
> 
> 
>>>>def lazymap(predicate, seq):
> 
> ...     for item in seq:
> ...             yield predicate(item)
> ...
> 
> which calulates f(item) as needed. Proof:
> 
> 
>>>>True in lazymap(f, x)
> 
> checking Peter
> checking Paul
> checking Mary
> True
> 
> 
> itertools.imap() is just the fast C implementation of lazymap().
> The equivalent generator expression (new in Python 2.4) will be 
> (f(i) for i in x).
> 
> Peter
> 




More information about the Python-list mailing list