Ich komme aus dem OOP-Hintergrund und versuche, Python zu lernen. Ich verwende die max
Funktion, die einen Lambda-Ausdruck verwendet, um die Instanz des Typs Player
mit dem Maximum totalScore
in der Liste zurückzugeben players
.
def winner():
w = max(players, key=lambda p: p.totalScore)
Die Funktion gibt eine Instanz des Typs Player
mit Maximum korrekt zurück totalScore
. Ich bin verwirrt über die folgenden drei Dinge:
- Wie funktioniert die
max
Funktion? Was sind die Argumente dafür? Ich sah mir die Dokumentation an, verstand sie aber nicht. - Was ist die Verwendung des Schlüsselworts
key
in der Max-Funktion? Ich weiß, dass es auch im Kontext dersort
Funktion verwendet wird - Bedeutung des Lambda-Ausdrucks? Wie lese ich sie? Wie arbeiten Sie?
Dies sind alles sehr noobische konzeptionelle Fragen, die mir jedoch helfen werden, die Sprache zu verstehen. Es wäre hilfreich, wenn Sie Beispiele zur Erklärung geben könnten. Vielen Dank
python max lambda
und möglicherweise für neue Nutzer hilfreicher.Antworten:
lambda
ist eine anonyme Funktion und entspricht:Jetzt
max
wird:Da
def
Anweisungen zusammengesetzte Anweisungen sind, können sie nicht verwendet werden, wenn ein Ausdruck erforderlich ist. Deshalb werden manchmal auch Anweisungenlambda
verwendet.Beachten Sie, dass dies dem
lambda
entspricht, was Sie in eine return-Anweisung von a eingefügt habendef
. Daher können Sie keine Anweisungen in a verwendenlambda
, nur Ausdrücke sind zulässig.Was macht
max
dasEs wird also einfach das größte Objekt zurückgegeben.
Wie funktioniert das
key
?Standardmäßig
key
vergleicht Python 2 Elemente basierend auf einer Reihe von Regeln, die auf dem Typ der Objekte basieren (z. B. ist eine Zeichenfolge immer größer als eine Ganzzahl).Um das Objekt vor dem Vergleich zu ändern oder anhand eines bestimmten Attributs / Index zu vergleichen, müssen Sie das
key
Argument verwenden.Beispiel 1:
Angenommen, Sie haben eine Liste von Zahlen in Zeichenfolgenform, möchten diese Elemente jedoch anhand ihres ganzzahligen Werts vergleichen.
Hier werden
max
die Elemente anhand ihrer ursprünglichen Werte verglichen (Zeichenfolgen werden lexikografisch verglichen, sodass Sie sie'2'
als Ausgabe erhalten):Um die Elemente anhand ihres ganzzahligen Werts zu vergleichen, verwenden Sie
key
Folgendeslambda
:Beispiel 2: Anwenden
max
auf eine Liste von Tupeln.Standardmäßig
max
werden die Elemente anhand des ersten Index verglichen. Wenn der erste Index identisch ist, wird der zweite Index verglichen. Wie in meinem Beispiel haben alle Elemente einen eindeutigen ersten Index, sodass Sie diesen als Antwort erhalten:Was aber, wenn Sie jedes Element anhand des Werts bei Index 1 vergleichen möchten? Einfach: verwenden
lambda
:Vergleichen von Elementen in einer Iterable, die Objekte unterschiedlichen Typs enthält :
Liste mit gemischten Elementen:
In Python 2 können Elemente zweier verschiedener Typen verglichen werden :
Aber in Python 3 können Sie das nicht mehr tun :
Dies funktioniert jedoch, da wir die Ganzzahlversion jedes Objekts vergleichen:
quelle
lengths = map(lambda word: len(word), words)
wowords=['It', 'is', 'raining', 'cats', 'and', 'dogs']
ich sehe, dass das Lambda über jedes Wort in der Liste iteriert. Tut es das immer?max
notlambda
(key
arg ist optional), und während der Iteration wird jedes Element an die in angegebene Funktion übergeben,key
und der zurückgegebene Wert wird dann zum Vergleich verwendet.max(lis, key=lambda x:int(x))
kann vereinfacht werden alsmax(lis, key=int)
. Python hat eine eingebaute Funktion, int (). Ebenso können Sie alle anderen integrierten Funktionen alskey
Argument verwenden. Zum Beispiel können Sie die längste Zeichenfolge vonlis=['a', 'aa', 'aaa']
bismax(lis, key=len)
max
,min
,sorted
etc richtig. Außerdem habe ichmax(lis, key=int)
gleich am Ende erwähnt. :-)Stark vereinfachte Version von
max
:In Bezug auf Lambda:
quelle
Es sucht nach dem "größten" Element in einer Iterable. Ich gehe davon aus, dass Sie nachschlagen können, was das ist, aber wenn nicht, können Sie es durchlaufen, dh eine Liste oder eine Zeichenfolge.
Key
ist eine Lambda-Funktion,max
die erkennt , welche Objekte in der Iterable größer sind als andere. Sagen Sie, wenn Sie ein Objekt sortiert haben, das Sie selbst erstellt haben, und nicht etwas Offensichtliches wie Ganzzahlen.Das ist eine größere Frage. In einfachen Worten, ist eine Lambda - Funktion kann man herumgehen , und haben andere Teile des Codes verwenden es. Nehmen Sie zum Beispiel:
Dies erfordert zwei Objekte
a
undb
und eine Funktionf
. Es ruftf()
jedes Objekt auf und addiert sie dann. Schauen Sie sich diesen Aufruf an:sum()
nimmt2
und ruft den Lambda-Ausdruck darauf auf. Sof(a)
wird2 * 2
, was 4 wird. Dann tut es dies fürb
und addiert die beiden zusammen.In nicht ganz so einfachen Worten stammen Lambdas aus dem Lambda-Kalkül, der Idee einer Funktion, die eine Funktion zurückgibt. Ein sehr cooles mathematisches Konzept zum Ausdrücken von Berechnungen. Sie können darüber lesen hier , und dann tatsächlich verstehen es hier .
Es ist wahrscheinlich besser, etwas mehr darüber zu lesen, da Lambdas verwirrend sein können und es nicht sofort offensichtlich ist, wie nützlich sie sind. Überprüfen Sie hier .
quelle
max
Funktion wird verwendet, um das Maximum aus einem herauszuholeniterable
.Die Iteratoren können Listen, Tupel, Diktierobjekte usw. oder sogar benutzerdefinierte Objekte sein, wie in dem von Ihnen angegebenen Beispiel.
Das
key=func
erlaubt uns also grundsätzlich, ein optionales Argumentkey
an die Funktion zu übergeben, auf deren Basis der angegebene Iterator / die angegebenen Argumente sortiert und das Maximum zurückgegeben wird.lambda
ist ein Python-Schlüsselwort, das als Pseudofunktion fungiert. Wenn Sie also einplayer
Objekt übergeben, wird es zurückgegebenplayer.totalScore
. Somit ist die iterable zu Funktion übergegangenmax
wird nach Art zumkey
totalScore derplayer
Objekte gegeben und die Rückkehr ,player
das Maximum hattotalScore
.Wenn kein
key
Argument angegeben wird, wird das Maximum gemäß den Standardreihenfolgen von Python zurückgegeben.Beispiele -
quelle
Laut Dokumentation :
Dies bedeutet, dass Sie in Ihrem Fall in diesem Fall eine Liste bereitstellen
players
. Dannmax
durchläuft die Funktion alle Elemente in der Liste und vergleicht sie miteinander, um ein "Maximum" zu erhalten.Wie Sie sich vorstellen können, ist es bei einem komplexen Objekt wie der
player
Bestimmung seines Vergleichswertes schwierig, den Wert eines jedenkey
zu bestimmen. Daher erhalten Sie das Argument, wie diemax
Funktion den Wert jedes Objekts bestimmen sollplayer
. In diesem Fall verwenden Sie eine Lambda-Funktion, um "für jedenp
inplayers
getp.totalscore
und verwenden Sie dies als seinen Vergleichswert" zu sagen .quelle
max
ist eine eingebaute Funktion, die das erste Argument an nimmtiterable
(wie Liste oder Tupel)Das Schlüsselwortargument
key
hat seinen StandardwertNone
, akzeptiert jedoch die zu bewertende Funktion. Betrachten Sie es als Wrapper, der die iterierbare Funktion basierend auf der Funktion bewertetBetrachten Sie dieses Beispielwörterbuch:
Ex:
Wie Sie sehen können
key
, gibt es den Maximalwert des Schlüssels (alphabetisch) zurück, wenn Sie das iterable nur ohne kwarg (eine Funktion an ) übergeben.Ex. Anstatt den Maximalwert des Schlüssels alphabetisch zu ermitteln, müssen Sie möglicherweise den Maximalschlüssel anhand der Schlüssellänge ermitteln:
In diesem Beispiel gibt die Lambda-Funktion die Länge des Schlüssels zurück, die daher iteriert wird, während Werte ausgewertet werden, anstatt sie alphabetisch zu berücksichtigen. Sie verfolgt die maximale Länge des Schlüssels und gibt den Schlüssel mit der maximalen Länge zurück
Ex.
In diesem Beispiel gibt die Lambda-Funktion den Wert des entsprechenden Wörterbuchschlüssels zurück, der den Maximalwert hat
quelle