Pochodzę z OOP i próbuję nauczyć się Pythona. Używam max
funkcji, która używa wyrażenia lambda, aby zwrócić wystąpienie typu, Player
które ma maksimum totalScore
na liście players
.
def winner():
w = max(players, key=lambda p: p.totalScore)
Funkcja poprawnie zwraca instancję typu Player
mającą maksimum totalScore
. Jestem zdezorientowany co do następujących trzech rzeczy:
- Jak działa ta
max
funkcja? Jakie argumenty podejmuje? Przejrzałem dokumentację, ale nie zrozumiałem. - Jakie jest zastosowanie słowa kluczowego
key
w funkcji max? Wiem, że jest również używany w kontekściesort
funkcji - Znaczenie wyrażenia lambda? Jak je czytać? Jak oni pracują?
Są to bardzo niedorzeczne konceptualne pytania, ale pomogą mi zrozumieć język. Byłoby pomocne, gdybyś mógł podać przykłady wyjaśniające. Dzięki
python max lambda
dla nowych użytkowników i może być bardziej pomocna.Odpowiedzi:
lambda
jest funkcją anonimową, jest odpowiednikiem:Teraz
max
staje się:Ponieważ jednak
def
instrukcje są instrukcjami złożonymi, nie można ich używać tam, gdzie wymagane jest wyrażenie, dlatego czasamilambda
są używane.Zauważ, że
lambda
jest to równoważne temu, co umieściłeś w instrukcji zwrotu plikudef
. Dlatego nie możesz używać instrukcji wewnątrz alambda
, dozwolone są tylko wyrażenia.Co robi
max
?Więc po prostu zwraca obiekt, który jest największy.
Jak to
key
działa?Domyślnie w Pythonie 2
key
porównuje elementy w oparciu o zestaw reguł opartych na typie obiektów (na przykład łańcuch jest zawsze większy niż liczba całkowita).Aby zmodyfikować obiekt przed porównaniem lub porównać na podstawie określonego atrybutu / indeksu, musisz użyć
key
argumentu.Przykład 1:
Prosty przykład: załóżmy, że masz listę liczb w postaci ciągu, ale chcesz porównać te elementy według ich wartości całkowitych.
Tutaj
max
porównuje elementy przy użyciu ich oryginalnych wartości (łańcuchy są porównywane leksykograficznie, aby uzyskać'2'
wynik):Aby porównać elementy według ich wartości całkowitej, użyj
key
prostegolambda
:Przykład 2: zastosowanie
max
do listy krotek.Domyślnie
max
porównuje elementy według pierwszego indeksu. Jeśli pierwszy indeks jest taki sam, porówna drugi indeks. Tak jak w moim przykładzie, wszystkie elementy mają unikalny pierwszy indeks, więc otrzymasz odpowiedź:Ale co by było, gdybyś chciał porównać każdą pozycję według wartości pod indeksem 1? Proste: użycie
lambda
:Porównanie elementów w iterowalnej, która zawiera obiekty różnego typu :
Lista z elementami mieszanymi:
W Pythonie 2 możliwe jest porównanie elementów dwóch różnych typów :
Ale w Pythonie 3 nie możesz już tego robić :
Ale to działa, ponieważ porównujemy wersję całkowitą każdego obiektu:
źródło
lengths = map(lambda word: len(word), words)
gdziewords=['It', 'is', 'raining', 'cats', 'and', 'dogs']
widzę, że lambda iteruje po każdym słowie na liście. Czy zawsze to robi?max
notlambda
(key
argument jest opcjonalny), a podczas iteracji każdy element jest przekazywany do funkcji określonej w,key
a zwracana wartość jest następnie używana do porównania.max(lis, key=lambda x:int(x))
można uprościć jakomax(lis, key=int)
. Python ma wbudowaną funkcję int (). Podobnie możesz użyć dowolnych innych funkcji wbudowanych jakokey
argumentu. Na przykład można uzyskać najdłuższy łańcuch zlis=['a', 'aa', 'aaa']
przezmax(lis, key=len)
max
,min
,sorted
etc prawidłowo. Poza tym wspomniałemmax(lis, key=int)
na końcu. :-)Mocno uproszczona wersja
max
:Odnośnie lambda:
źródło
Szuka „największego” elementu w iterowalnej. Zakładam, że możesz sprawdzić, co to jest, ale jeśli nie, jest to coś, co możesz zapętlić, np. Lista lub łańcuch.
Key
to funkcja lambda, która powie,max
które obiekty w iterowalnej są większe niż inne. Powiedz, czy sortujesz obiekt, który sam stworzyłeś, a nie coś oczywistego, na przykład liczby całkowite.To trochę większe pytanie. Mówiąc najprościej, lambda to funkcja, którą można przekazywać i używać jej w innych fragmentach kodu. Weź to na przykład:
To wymaga dwóch obiektów
a
ib
, i funkcjif
. Wzywaf()
każdy obiekt, a następnie dodaje je do siebie. Więc spójrz na to wezwanie:sum()
przyjmuje2
i wywołuje wyrażenie lambda.f(a)
Staje się więc2 * 2
, co staje się 4. Następnie robi to zab
i dodaje je do siebie.Mówiąc nie tak prosto, lambdy pochodzą z rachunku lambda, który jest ideą funkcji, która zwraca funkcję; bardzo fajna koncepcja matematyczna do wyrażania obliczeń. Możesz o tym poczytać tutaj , a potem faktycznie to zrozumieć tutaj .
Prawdopodobnie lepiej jest o tym poczytać trochę więcej, ponieważ lambdy mogą być mylące i nie jest od razu oczywiste, jak są przydatne. Sprawdź tutaj .
źródło
max
funkcja służy do uzyskania maksimum z plikuiterable
.Iteratorami mogą być listy, krotki, obiekty dyktowania itp. Lub nawet obiekty niestandardowe, jak w podanym przykładzie.
Tak więc w
key=func
zasadzie pozwala nam przekazać opcjonalny argumentkey
do funkcji, na podstawie której sortowany jest dany iterator / argumenty i zwracane jest maksimum.lambda
jest słowem kluczowym Pythona, które działa jak pseudo funkcja. Tak więc, kiedy przekażesz muplayer
obiekt, zwróciplayer.totalScore
. Zatem iterable przeszło do funkcjimax
będzie sortowania wedługkey
Całkowity wynik zplayer
przedmiotów podanych do niego i zwróciplayer
który ma maksimumtotalScore
.Jeśli nie
key
podano argumentu, zwracana jest wartość maksymalna zgodnie z domyślną kolejnością Pythona.Przykłady -
źródło
Zgodnie z dokumentacją :
To mówi, że w twoim przypadku dostarczasz listę, w tym przypadku
players
. A późniejmax
funkcja dokona iteracji po wszystkich elementach na liście i porówna je ze sobą, aby uzyskać „maksimum”.Jak możesz sobie wyobrazić, w przypadku złożonego obiektu, takiego jak
player
określenie jego wartości do porównania, jest trudne, więc maszkey
argument do określenia, w jaki sposóbmax
funkcja zdecyduje o wartości każdego z nichplayer
. W tym przypadku używasz funkcji lambda, aby powiedzieć „for eachp
inplayers
getp.totalscore
i użyj tego jako jego wartości do porównania”.źródło
max
jest wbudowaną funkcją, która przyjmuje pierwszy argument aniterable
(jak lista lub krotka)Argument słowo kluczowe
key
ma swoją wartość domyślną,None
ale akceptuje funkcję do oceny, traktuje ją jako opakowanie, które ocenia iterowalność na podstawie funkcjiRozważmy ten przykładowy słownik:
Dawny:
Jak widać, jeśli przekażesz tylko iterowalną bez kwarg (funkcję do
key
), zwraca maksymalną wartość klucza (alfabetycznie)Dawny. Zamiast znajdować maksymalną wartość klucza alfabetycznie, może być konieczne znalezienie maksymalnego klucza według długości klucza:
w tym przykładzie funkcja lambda zwraca długość klucza, który będzie iterowany, dlatego podczas obliczania wartości zamiast rozważać alfabetycznie będzie śledzić maksymalną długość klucza i zwróci klucz, który ma maksymalną długość
Dawny.
w tym przykładzie funkcja lambda zwraca wartość odpowiedniego klucza słownika, który ma maksymalną wartość
źródło