Code: Alles auswählen
>>> print(*map(float, range(3)), sep='\n')
0.0
1.0
2.0
Code: Alles auswählen
>>> print(*map(float, range(3)), sep='\n')
0.0
1.0
2.0
In der Tat, das mit * kannte ich bisher nicht. Das macht natürlich die Sache etwas einfacher - jedenfalls von der Code-Länge her.snafu hat geschrieben:Man kann `map()` durchaus direkt verwenden. [...]
Gut, wieder was neues gelernt und den Hintergrund gleich dazusnafu hat geschrieben:Der Grund für das Design von `map()` (bezogen auf Python 3), ist dass man direkt über das Ergebnis iterieren kann, ohne dass aus den einelnen Elementen erst noch in eine Datenstruktur gebaut wird (also z.B. eine Liste), die nach dem Iterieren eh wieder weggeworfen würde. Wenn man es mit sehr vielen Elementen zu tun hat, dann kann das durchaus ein spürbarer Performancegewinn sein. Wenn man hingegen tatsächlich eine Liste benötigt, dann muss man dies explizit angeben, oder eben - wie gezeigt - `map()` komplett weglassen und stattdessen eine List Comprehension benutzen.
Ja, da habe ich mich etwas undeutlich ausgedrückt. Da ich versucht hatte, den Rückgabewert von map direkt über print auszugeben und es nicht geklappt hatte, dachte ich, dass die map Funktion keinen direkt verwendbaren Wert liefert.BlackJack hat geschrieben:@thomas07: `map()` hat einen verwendbaren Rückgabewert, nur halt nicht das was Du erwartet hast.
Ich habe mit der Version 2 nur sehr wenig gearbeitet und kenne z. B. itertools nicht (aber werde es gleich nachholen), aber mit der 3er Version möchte ich mich intensiver beschäftigen und danke Euch sehr für Eure Unterstützung, denn manchmal komme ich mit der Dokumentation und Probieren nicht weiter.BlackJack hat geschrieben:Wenn ich schaue wie oft ich in Python 2 `map()` verwende und wie oft `itertools.imap()` dann ist es IMHO schon ein guter Schritt bei Python 3 gewesen `map()` durch etwas zu ersetzen was sich wie `itertools.imap()` verhält. Oft ist das Ergebnis ja nur ein Zwischenschritt.
Das Ergebnis von `map()` in Python 3.x ist im Grunde ja nur ein "stinknormaler" Iterator. Ich würde sagen, das ist keine Datenstruktur oder höchstens ein Randfall. Denn bei Datenstrukturen erwartet man als Anwender, dass man eine für den Datentyp typische Funktionalität für Zugriff und Modifikation der enthaltenen Daten erhält (bei Listen z.B. "gib Element an Index 0", "füge Element 'x' hinzu", usw). Bei Iteratoren hingegen kann man im Regelfall immer nur das nächste Element, was an der Reihe ist, erhalten. Außerdem teilt einem der Iterator mit, wann keine für die Ausgabe bestimmten Elemente mehr übrig sind. Und das war's dann auch schon. Gut, das ist natürlich immer noch ein allgemein bekannter Mechanismus - eine Datenstruktur ist es aber eher nicht. Aber wie gesagt: Hier kann man vielleicht auch anderer Meinung sein, sofern man "Datenstruktur" etwas anders definieren möchte.thomas07 hat geschrieben:aber eine Sache noch: das Ergebnis von map ist zwar keine List, Tuple, Dict oder Set, aber dennoch liegen die Daten ja in einer bestimmten Struktur vor. Deshalb meine Frage: Kann man das Ergebnis von map nicht als eine Datenstruktur betrachten? Oder haben Datenstrukturen besondere Eigenschaften, die dem map-Ergebnis fehlen?
Code: Alles auswählen
class Map(object):
def __init__(self, function, *iterables):
self.function = function
self.arguments = zip(*iterables)
def __iter__(self):
return self
def __next__(self):
return self.function(*next(self.arguments))
Code: Alles auswählen
def map_(function, *iterables):
return (function(*arguments) for arguments in zip(*iterables))
Code: Alles auswählen
class Zip(object):
def __init__(self, *iterables):
self.iterables = iterables
def __iter__(self):
return self
def __next__(self):
return tuple(next(it) for it in self.iterables)
# Alternativ als Funktion:
def zip_(*iterables):
while True:
yield tuple(next(it) for it in iterables)