2013-03-08 8 views
8

Gibt es eine Möglichkeit map faul zu machen? Oder gibt es eine andere Implementierung von Python?Lazy Kartenfunktion in Python

ich so etwas wie dies will arbeiten:

from itertools import count 

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

Natürlich wird der obige Code nicht zu Ende, aber ich möchte nur jede Bedingung eingeben (oder komplexere Logik) im Inneren des for und An einem bestimmten Punkt anhalten.

+1

Siehe hier: [ Wissen, wann man faul sein soll (http://davywybiral.blogspot.com/2008/08/python-know-when-to-be-lazy.html). Kurz gesagt: entweder Generator Ausdrücke verwenden oder verwenden Sie das Itertools-Modul. –

+0

@RobertHarvey: Netter Link. Anders als 'x * 2' anstelle von' x ** 2' ist der Blog ziemlich genau auf diese Frage zugeschnitten! – abarnert

+0

@RobertHarvey Sehr schöner Artikel. Vielen Dank! –

Antwort

27

Verwendung itertools.imap auf Python 2.x oder ein Upgrade auf Python 3.x

Sie können einen einfachen Generator Ausdruck verwenden, auch nur die weit mehr pythonic ist:

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

+1 für die Empfehlung des Generatorausdrucks. Wo auch immer Sie 'lambda' brauchen,' map() 'ist keine gute Wahl. –

+0

Danke für Ihre Antwort. Ich habe gerade versucht, ein einfacheres Codebeispiel für die Frage zu erstellen (bei Verwendung von 'map'). –

4

itetools.imap ist faul.

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.