2011-12-05 12 views
8

Dokumentacja wbudowanych funkcji max i min w języku Python wskazuje, że parametr key powinien działać tak jak w przypadku funkcji sort. Innymi słowy, powinien być w stanie to zrobić:Klucz domyślny dla wbudowanych funkcji max/min w języku Python

a = [1, 2, 3, 4] 
max(a, key=None) 

Jednak to powoduje błąd: TypeError: 'NoneType' object is not callable

Ale jeśli mam zrobić coś podobnego z funkcją sort, uzyskać oczekiwane rezultaty:

a = [1, 2, 3, 4] 
a.sort(key=None) 

Nie jest generowany błąd i używany jest sortowanie domyślne. Kilka książek sugeruje, że powinienem być w stanie odejść z takim samym zachowaniem w funkcjach max i min. Zobacz ten fragment z Python in a Nutshell.

Czy to naprawdę jest domyślne zachowanie funkcji max i min? Tak być powinno? Czy nie powinny pasować do funkcji sortowania?

Odpowiedz

23

Wpadłeś na różnice w implementacji .sort i max bardziej niż problem z językiem.

list.sort() przyjmuje parametr kluczowy "klucz", który ma wartość domyślną Brak. Oznacza to, że metoda sortowania nie jest w stanie odróżnić argumentu użytkownika od argumentu key=None lub po prostu przyjmuje wartość domyślną. W obu przypadkach zachowuje się tak, jakby nie podano żadnej funkcji klucza.

max z drugiej strony sprawdza obecność słowa kluczowego "klucz". Nie ma wartości domyślnej, a jej wartość jest używana jako funkcja klucza, jeśli w ogóle jest obecna.

Tak czy inaczej, klucz nigdy nie powinien być podawany jako Brak. Jest to funkcja, która służy do wyodrębnienia "klucza" z pozycji na liście/iteracji. Na przykład:

a = [("one", 1), ("two", 2), ("three", 3), ("four", 4)] 
a.sort(key=lambda item:item[1]) 
+0

Dzięki za odpowiedź. Wiedziałem, że rzeczywista implementacja tych funkcji była inna, ale byłem sfrustrowany tym, że cała dokumentacja, którą udało mi się znaleźć, nie spowodowała wyraźnej różnicy. –

+0

Bez problemu. Jeśli to odpowie na twoje pytanie, akceptacja jest zawsze doceniana. –

+1

"klucz" to naprawdę straszna nazwa ... – OlivierBlanvillain

7

@ Odpowiedź Davida jest idealna. Wystarczy dodać, w przypadku, gdy zastanawiasz się, domyślny key wartości (zarówno w sort iw max/min funkcji) jest coś takiego jak:

lambda x: x 
+1

Ale, sortuje przekazywanie None jako wartość domyślną, podczas gdy min/max nie. Coś jest wdrażane inaczej. Jeśli spojrzysz na kod, funkcja min i max po prostu sprawdź, czy zostało to zdefiniowane w słowniku argumentów. Nie sądzę, że istnieje wartość domyślna dla argumentu klucz maks/min, tylko zachowanie domyślne. –

Powiązane problemy