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?

War es hilfreich?

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]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top