2016-04-07 13 views
2

Ich wollte die Summe der Quadrate bis n berechnen. Angenommen, n ist 4 erzeugt dann eine Liste dieser Code ein Kartenobjekt im Bereich von 0 bis 4:Python: 'Liste' auf einem Kartenobjekt zweimal aufrufen

m = map(lambda x: x**2, range(0,4)) 

Ease genug. Nun Liste m nennen, und dann Summe:

>>> sum(list(m)) 
>>> 14 

Das unerwartete Verhalten ist, dass wenn ich die letzte Zeile wieder laufen, die Summe ist 0:

>>> sum(list(m)) 
>>> 0 

Ich vermute, dass dies, weil ist die Liste aufrufen (m) gibt eine leere Liste zurück, aber ich kann keine Erklärung für dieses Verhalten finden. Kann mir jemand dabei helfen?

+1

'map' ist ein * Iterator *, der vom ersten' listen' Aufruf konsumiert wird. Warum ordnest du 'list (m)' nicht zu und verwendest es wieder? – jonrsharpe

+0

@jonrsharpe Ja, ich sehe das ist eine Alternative, aber ich wollte wissen, warum das passiert. Sie sagen also, dass list() den Iterator konsumiert? Kannst du mir mehr erzählen (oder wo finde ich mehr heraus)? – ADB

+2

Python Tutorials/Dokumentation? Google-Suche nach * "python iterator" *? – jonrsharpe

Antwort

7

map gibt den Generator in Python 3 zurück. Der Generator kann einmal verbraucht werden, danach ist er erschöpft und liefert keine Werte mehr.

In Ihrem Code-Snippet verbrauchen Sie Generator mehrmals. jedes Mal versucht, Liste neu zu erstellen, und für die zweite und nächste Läufe erstellte Liste wird immer leer sein (seit Quelle Generator wurde in ersten list(m) Operation verbraucht).

Einfach den Generator in die Liste umwandeln und danach auf der Liste arbeiten.

m = map(lambda x: x**2, range(0,4)) 
l = list(m) 
assert sum(l) == 14 
assert sum(l) == 14 
+0

Danke, das ist die Information, die ich gesucht habe. – ADB

+0

Wenn Sie dieses Verhalten bei Generatoren vermeiden möchten, können Sie stattdessen die Karte überspringen und direkt zu einer Liste wechseln, indem Sie ein Listenverständnis verwenden. 'm = [x ** 2 für x im Bereich (4)]' –

+0

@TylerS Sie haben Recht, aber ich wollte auch Einblick in dieses spezielle Verhalten gewinnen. – ADB

Verwandte Themen