2013-03-08 12 views
8

Czy istnieje sposób na zrobienie leniwego map? A może jest inna implementacja tego wbudowana w Pythonie?Funkcja leniwej mapy w Pythonie

Chcę coś jak to działa:

from itertools import count 

for x in map(lambda x: x**2, count()): 
    print x 

Oczywiście, powyższy kod nie skończy, ale chciałbym po prostu wprowadzić dowolny warunek (lub bardziej skomplikowane logika) wewnątrz for i zatrzymaj się w pewnym momencie.

+1

Zobacz tutaj: [ Wiedzieć, kiedy być Lazy] (http://davywybiral.blogspot.com/2008/08/python-know-when-to-be-lazy.html). W skrócie: użyj wyrażeń generatora lub użyj modułu itertools. –

+0

@RobertHarvey: Nice link. W rzeczywistości, poza robieniem 'x * 2' zamiast' x ** 2', blog jest idealnie dopasowany do tego pytania! – abarnert

+0

@RobertHarvey Bardzo fajny artykuł. Dziękuję Ci! –

Odpowiedz

27

użycie itertools.imap na Pythona 2.x lub uaktualnienie do Python 3.x

Można też po prostu użyć prostego generatora wyrażenie, które jest o wiele bardziej pythonic:

foo = (x**2 for x in count()) 
+5

+1 za polecenie wyrażenia generatora. Gdziekolwiek potrzebujesz 'lambda',' map() 'nie jest dobrym wyborem. –

+0

Dziękuję za odpowiedź. Po prostu próbowałem utworzyć prostszą próbkę kodu dla pytania (przy użyciu 'map'). –

4

itetools.imap jest leniwy.

In [3]: itertools.imap? 
Type:  type 
String Form:<type 'itertools.imap'> 
Docstring: 
imap(func, *iterables) --> imap object 

Make an iterator that computes the function using arguments from 
each of the iterables. Like map() except that it returns 
an iterator instead of a list and that it stops when the shortest 
iterable is exhausted instead of filling in None for shorter 
iterables.