filter
, map
Und reduce
arbeitet perfekt in Python 2. Hier ist ein Beispiel:
>>> def f(x):
return x % 2 != 0 and x % 3 != 0
>>> filter(f, range(2, 25))
[5, 7, 11, 13, 17, 19, 23]
>>> def cube(x):
return x*x*x
>>> map(cube, range(1, 11))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
>>> def add(x,y):
return x+y
>>> reduce(add, range(1, 11))
55
In Python 3 erhalte ich jedoch die folgenden Ausgaben:
>>> filter(f, range(2, 25))
<filter object at 0x0000000002C14908>
>>> map(cube, range(1, 11))
<map object at 0x0000000002C82B70>
>>> reduce(add, range(1, 11))
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
reduce(add, range(1, 11))
NameError: name 'reduce' is not defined
Ich würde mich freuen, wenn mir jemand erklären könnte, warum das so ist.
Screenshot des Codes für weitere Klarheit:
python
python-3.x
filter
functional-programming
reduce
Dick Lucas
quelle
quelle
Antworten:
Sie können über die Veränderungen in lesen Was ist neu in Python 3.0 . Sie sollten es sorgfältig lesen, wenn Sie von 2.x auf 3.x wechseln, da sich viel geändert hat.
Die ganze Antwort hier sind Zitate aus der Dokumentation.
Ansichten und Iteratoren anstelle von Listen
Builtins
quelle
list(map(...)
Überall hinzufügen ... wie in aller Welt ist das für eine bessere Lesbarkeit ...python
scheint nicht mit der progressiven / Streaming-Anwendung von Funktionskombinatoren umzugehen. Andere Sprachen Ich kann ein Dutzend Operationen mit einer Sammlung hintereinander verketten und sie ist lesbar. Hier? Was willst du - ein Dutzend verschachteltin
?list
Anruf überhaupt hinzufügen müssen ? Ich dachte, die Bedeutung von "Streaming" ist "es wird überhaupt keine Liste erstellt; verarbeiten Sie jedes Element der Eingabe vollständig, bevor Sie mit dem nächsten fortfahren".map
.Die Funktionalität von
map
undfilter
wurde absichtlich geändert, um Iteratoren zurückzugeben, und die Reduzierung wurde aus der integrierten Funktion entfernt und eingefügtfunctools.reduce
.Sie können sie also für
filter
undmap
umschließenlist()
, um die Ergebnisse wie zuvor anzuzeigen.Die Empfehlung lautet nun, dass Sie Ihre Verwendung von Map und Filter durch Generatorausdrücke oder Listenverständnisse ersetzen. Beispiel:
Sie sagen, dass for-Loops zu 99 Prozent leichter zu lesen sind als zu reduzieren, aber ich würde einfach dabei bleiben
functools.reduce
.Bearbeiten : Die 99-Prozent-Zahl wird direkt von der Seite " Was ist neu in Python 3.0?" Von Guido van Rossum abgerufen.
quelle
[i*i*i for i in range(1,11)]
i**3
anrufeni.__pow__(3)
undi*i*i
i.__mul__(i).__mul__(i)
(oder so ähnlich). Bei Ints spielt es keine Rolle, aber bei Numpy-Zahlen / benutzerdefinierten Klassen kann es sogar zu unterschiedlichen Ergebnissen kommen.list(list(list(.. )))
zu tun, was in Python bereits ausführlich war.Als Ergänzung zu den anderen Antworten klingt dies wie ein guter Anwendungsfall für einen Kontextmanager, der die Namen dieser Funktionen denen zuordnet, die eine Liste zurückgeben und
reduce
in den globalen Namespace einführen .Eine schnelle Implementierung könnte folgendermaßen aussehen:
Mit einer Verwendung, die so aussieht:
Welche Drucke:
Nur meine 2 Cent :-)
quelle
python
als Sprache ist ein Chaos - aber es v gut bis ausgezeichnet Bibliotheken hat:numpy
,pandas
,statsmodels
und Freunde .. hatte ich buliding Bequemlichkeit Bibliotheken wurden wie Sie hier zeigen , den Schmerz der Muttersprache zu reduzieren - aber haben die Energie verloren und versuchen , nicht zu weit weg von einemdata.frame
/datatable
oderxarray
. Aber einreduce
Vergessen Sie nicht, die Methodefunctools
in Ihren Code zu importieren, da die Methode aus der integrierten Funktion von Python3 entfernt wurde . Bitte schauen Sie sich das Code-Snippet unten an.quelle
Hier sind die Beispiele für Funktionen zum Filtern, Zuordnen und Reduzieren.
//Filter
//Karte
//Reduzieren
Die Reduktionsfunktion wurde, da sie nicht häufig verwendet wird, aus den in Python 3 integrierten Funktionen entfernt. Sie ist weiterhin im functools-Modul verfügbar, sodass Sie Folgendes tun können:
quelle
Einer der Vorteile von Map, Filter und Reduce ist, wie lesbar sie werden, wenn Sie sie zu einer komplexen Aufgabe "verketten". Die eingebaute Syntax ist jedoch nicht lesbar und "rückwärts". Daher schlage ich vor, das
PyFunctional
Paket zu verwenden ( https://pypi.org/project/PyFunctional/ ). Hier ist ein Vergleich der beiden:PyFunctional Version
Sehr gut lesbare Syntax. Sie können sagen:
Standard-Python-Version
Es ist alles rückwärts. Sie müssen sagen:
quelle