Sie map
anstelle der for
Schleife verwenden, könnten Sie gezeigt haben, aber da Sie nicht das Ergebnis von item.my_func()
zu verwenden scheinen, ist dies nicht empfohlen. map
sollte verwendet werden, wenn Sie eine Funktion ohne Nebenwirkungen auf alle Elemente einer Liste anwenden möchten. In allen anderen Situationen verwenden Sie eine explizite for-Schleife.
Auch, wie von Python 3.0 map
gibt einen Generator, so dass in diesem Fall map
nicht gleich verhalten (es sei denn, Sie explizit alle Elemente auszuwerten durch den Generator zurückgeführt, zum Beispiel durch list
darauf Aufruf).
bearbeiten: kibibu fragt in den Kommentaren für eine Klarstellung darüber, warum map
s erste Argument sollte nicht eine Funktion mit Nebenwirkungen. Ich antworte auf diese Frage eine Aufnahme:
map
soll eine Funktion f
in the mathematical sense übergeben werden. Unter diesen Umständen spielt es keine Rolle, in welcher Reihenfolge f
auf die Elemente des zweiten Arguments angewendet wird (vorausgesetzt, dass sie natürlich in ihrer ursprünglichen Reihenfolge zurückgegeben werden). unter diesen Umständen noch wichtiger ist, ist map(g, map(f, l))
semantisch äquivalent map(lambda x: g(f(x)), l)
, unabhängig von der Reihenfolge, in der f
und g
an ihren jeweiligen Eingängen angewendet werden.
Zum Beispiel ist es egal, ob map
zurückgibt und Iterator oder eine vollständige Liste auf einmal. Wenn jedoch f
und/oder g
Nebenwirkungen verursachen, dann ist diese Äquivalenz nur dann, wenn die Semantik der map(g, map(f, l))
solche garantiert sind, dass in jeder Phase g
an die ersten n Elemente durch map(f, l)
vor map(f, l)
gilt f
an die zurück angewendet wird (n + 1) st Element von l
. (Was bedeutet, dass map
müssen die faulste möglich Iteration durchführen ---, die es funktioniert in Python 3, aber nicht in Python 2!)
Einen Schritt weiter gehen: Auch wenn wir die Python 3 Implementierung von map
, die semantische Äquivalenz übernehmen kann leicht zusammenbrechen, wenn der Ausgang von map(f, l)
ist z passierte durch itertools.tee
, bevor es an den äußeren map
Anruf geliefert wurde.
Die obige Diskussion mag theoretischer Natur erscheinen, aber wenn Programme komplexer werden, werden sie schwieriger zu diskutieren und daher schwieriger zu debuggen. Sicherzustellen, dass einige Dinge invariant sind, mildert dieses Problem etwas und kann tatsächlich eine ganze Klasse von Fehlern verhindern.
Schließlich erinnert map
viele Menschen an ihr wirklich funktionales Gegenstück in verschiedenen (rein) funktionalen Sprachen. Wenn man eine "Funktion" mit Nebenwirkungen passiert, werden diese Leute verwirrt. Wenn daher die Alternative (dh die Verwendung einer expliziten Schleife) nicht schwieriger zu implementieren ist als ein Aufruf an map
, wird dringend empfohlen, die Verwendung von map
auf Fälle zu beschränken, in denen die anzuwendende Funktion keine Nebenwirkungen verursacht .
Danke allen! – roder
Warum ist es nicht empfehlenswert? Ist es ein Semantik-Ding oder eine Art verteiltes Verarbeitungs-Ding (wo Nebenwirkungen Parallelität brechen)? – kibibu
@ kibibu: Ich habe angefangen, Ihre Frage zu beantworten, aber endete mit viel zu viel Text für dieses Kommentarfeld zu enthalten. Also habe ich die Antwort aktualisiert :) Wie das hilft! (Was Ihre Bemerkung über die verteilte Verarbeitung des Iterablen angeht: Obwohl das * als zusätzliches Argument angeführt werden könnte, wenn in anderen Sprachen von 'map' gesprochen wird, glaube ich nicht, dass Python (derzeit) irgendwelche Optimierungen dieser Art durchführt.) – Stephan202