Welche funktionalen Werkzeuge verbleiben in Python 3k?
-
08-07-2019 - |
Frage
Ich habe mehrere Einträge zum Absetzen mehrerer funktionaler Funktionen aus zukünftiger Python gelesen, einschließlich MAP und Reduzierung.
Was ist die offizielle Richtlinie in Bezug auf funktionale Erweiterungen?
Wird Lambda -Funktion bleiben?
Lösung
Nun, Python 3.0 und 3.1 sind bereits veröffentlicht, sodass Sie dies selbst überprüfen können. Das Endergebnis war, dass Karte und Filter als eingebaute Ins und Lambda gehalten wurden. Die einzige Änderung war, dass die Reduzierung in das Functools -Modul verschoben wurde. Sie müssen nur tun
from functools import reduce
um es zu benutzen.
Zukünftige 3.x-Veröffentlichungen sind in dieser Hinsicht voraussichtlich mit 3.0 und 3.1 rückwärtskompatibel.
Andere Tipps
In Python 3.x verfügt Python weiter any()
und all()
die nach Möglichkeit eine Kurzschlussbewertung haben.
Pythons "wohlwollender Diktator für das Leben" hat die Idee des Entfernens verfolgt map()
Weil Sie seine Effekte mit einem Listenverständnis trivial reproduzieren können:
lst2 = map(foo, lst)
lst3 = [foo(x) for x in lst]
lst2 == lst3 # evaluates True
Python lambda
Die Funktion wurde nicht entfernt oder umbenannt und wird es wahrscheinlich nie sein. Es wird jedoch wahrscheinlich auch nie mächtiger. Python lambda
ist auf einen einzelnen Ausdruck beschränkt; Es kann keine Aussagen enthalten und können nicht mehrere Zeilen Python -Code enthalten.
Pythons schlichtem Standard def
definiert ein Funktionsobjekt, das genauso einfach wie möglich übergeben werden kann lambda
Objekt. Sie können den Namen der Funktion sogar entbinden, nachdem Sie sie definiert haben, wenn Sie dies wirklich tun möchten.
Beispiel:
# NOT LEGAL PYTHON
lst2 = map(lambda x: if foo(x): x**2; else: x, lst)
# perfectly legal Python
def lambda_function(x):
if foo(x):
return x**2
else:
return x
lst2 = map(lambda_function, lst)
del(lambda_function) # can unbind the name if you wish
Beachten Sie, dass Sie tatsächlich den "ternären Operator" in a verwenden können lambda
Das obige Beispiel ist also etwas erfunden.
lst2 = map(lambda x: x**2 if foo(x) else x, lst)
Einige Multilinfunktionen sind jedoch schwer zu einem zu erzwingen lambda
und werden besser als einfache gewöhnliche Multilinfunktionen behandelt.
Python 3.x hat keine seiner funktionalen Kraft verloren. Es gibt ein allgemeines Gefühl, dass die Auflistung von Verständnissen und Generatorausdrücken wahrscheinlich vorzuziehen ist map()
; Insbesondere können Generatorausdrücke manchmal für das Äquivalent von a verwendet werden map()
aber ohne eine Liste zuzuweisen und sie dann erneut zu befreien. Zum Beispiel:
total = sum(map(lst, foo))
total2 = sum(foo(x) for x in lst)
assert total == total2 # same result
In Python 2.x die map()
weisen eine neue Liste zu, die summiert und sofort befreit wird. Der Generatorausdruck erhält die Werte nacheinander und verbindet niemals die Erinnerung einer ganzen Werte Liste.
In Python 3.x, map()
ist "faul", also sind beide ungefähr gleich effizient. In der Python 3.x muss jedoch das ternäre Lambda -Beispiel gezwungen werden, in eine Liste zu expandieren:
lst2 = list(map(lambda x: x**2 if foo(x) else x, lst))
Einfacher einfach das Listenverständnis zu schreiben!
lst2 = [x**2 if foo(x) else x for x in lst]