Nicht-faule Evaluierungsversion der Map in Python3?

9

Ich versuche, map in Python3 zu verwenden. Hier ist ein Code, den ich verwende:

%Vor%

Da map in Python3 jedoch einen Iterator zurückgibt, funktioniert dieser Code nicht in Python3 (funktioniert aber gut in Python2, da diese Version von map immer eine list zurückgibt)

Meine aktuelle Lösung besteht darin, einen list Funktionsaufruf über den Iterator hinzuzufügen, um die Auswertung zu erzwingen. Aber es scheint seltsam (ich interessiere mich nicht für den Rückgabewert, warum sollte ich den Iterator in eine Liste konvertieren?)

Irgendwelche besseren Lösungen?

    
yegle 25.08.2013, 20:41
quelle

3 Antworten

14

Die Verwendung von map für seine Nebenwirkungen (zB Funktionsaufruf), wenn Sie an zurückgegebenen Werten nicht interessiert sind, ist sogar in Python2.x unerwünscht. Wenn die Funktion None zurückgibt, aber millionenfach wiederholt wird, würden Sie eine Liste von einer Million None s erstellen, nur um sie zu verwerfen. Der richtige Weg besteht darin, entweder eine For-Schleife zu verwenden und zu rufen:

%Vor%

oder wie das Modul csv erlaubt, verwenden Sie:

%Vor%

Wenn Sie aus irgendeinem Grund wirklich map verwenden möchten, können Sie das consume Rezept von itertools verwenden und eine Null-Länge erzeugen, zB:

%Vor%     
Jon Clements 25.08.2013, 20:44
quelle
2

Wenn Sie den Rückgabewert nicht interessieren, ist map nicht das beste Werkzeug für den Job. Ein einfacher for wäre besser:

%Vor%

Das wird in Python 2.x und 3.x funktionieren. Beachten Sie, dass map nützlich ist, wenn Sie eine neue Liste erstellen möchten, wenn Sie nur für den Effekt über eine iterable gehen, und verwenden Sie dann for .

    
Óscar López 25.08.2013 20:44
quelle
2

Sie können dazu eine Null-Länge-Deque einrichten:

%Vor%

Dies ist die gleiche Art, wie das Rezept itertools.consume (Iterator, None) funktioniert. Es wird funktional den Iterator erschöpfen, ohne die Liste zu erstellen.

Sie können auch einfach das Rezept verwenden von itertools verwenden.

Aber eine Schleife ist für mich lesbarer und Pythonic, aber YMMV.

    
dawg 25.08.2013 20:55
quelle

Tags und Links