Kennen Sie andere funktionale Sprachen? Versuchen Sie also zu lernen, wie Python funktionale Programmierung ausführt, oder versuchen Sie, etwas über funktionale Programmierung und die Verwendung von Python als Vehikel zu lernen?
Verstehst du auch das Listenverständnis?
map(f, sequence)
ist direkt äquivalent (*) zu:
[f(x) for x in sequence]
Tatsächlich war ich der Meinung map()
, dass das Entfernen aus Python 3.0 einmal als redundant geplant war (das ist nicht geschehen).
map(f, sequence1, sequence2)
ist meistens gleichbedeutend mit:
[f(x1, x2) for x1, x2 in zip(sequence1, sequence2)]
(Es gibt einen Unterschied in der Behandlung des Falls, in dem die Sequenzen unterschiedlich lang sind. Wie Sie gesehen haben, wird map()
None ausgefüllt, wenn eine der Sequenzen abgelaufen ist, während zip()
angehalten wird, wenn die kürzeste Sequenz stoppt.)
Um Ihre spezifische Frage zu beantworten, versuchen Sie, das Ergebnis zu erzielen:
foos[0], bars
foos[1], bars
foos[2], bars
# etc.
Sie können dies tun, indem Sie eine Funktion schreiben, die ein einzelnes Argument verwendet und es druckt, gefolgt von Balken:
def maptest(x):
print x, bars
map(maptest, foos)
Alternativ können Sie eine Liste erstellen, die folgendermaßen aussieht:
[bars, bars, bars, ] # etc.
und verwenden Sie Ihren Original-Maptest:
def maptest(x, y):
print x, y
Eine Möglichkeit, dies zu tun, besteht darin, die Liste im Voraus explizit zu erstellen:
barses = [bars] * len(foos)
map(maptest, foos, barses)
Alternativ können Sie das itertools
Modul einziehen. itertools
enthält viele clevere Funktionen, mit denen Sie in Python eine funktionale Lazy-Evaluation-Programmierung durchführen können. In diesem Fall möchten wir, dass itertools.repeat
das Argument unbegrenzt ausgegeben wird, wenn Sie darüber iterieren. Diese letzte Tatsache bedeutet, dass wenn Sie Folgendes tun:
map(maptest, foos, itertools.repeat(bars))
Sie erhalten eine endlose Ausgabe, da map()
so lange weitergearbeitet wird, wie eines der Argumente noch eine Ausgabe erzeugt. Ist itertools.imap
jedoch genau wie map()
, stoppt aber, sobald die kürzeste iterierbare Stopps.
itertools.imap(maptest, foos, itertools.repeat(bars))
Hoffe das hilft :-)
(*) In Python 3.0 ist das etwas anders. Dort gibt map () im Wesentlichen einen Generatorausdruck zurück.