2011-12-05 5 views
8

La documentazione per le funzioni interne max e min in Python indicano che il parametro key dovrebbe operare come fa nella funzione sort. In altre parole, dovrei essere in grado di fare questo:chiave predefinita per Python incorporato max/min funzioni

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

Tuttavia, questo genera un errore: TypeError: 'NoneType' object is not callable

Ma, se faccio qualcosa di simile con la funzione sort, ottengo i risultati attesi:

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

Nessun errore viene generato e viene utilizzato l'ordinamento predefinito. Diversi libri implicano anche che dovrei essere in grado di farla franca con lo stesso comportamento nelle funzioni max e min. Vedi questo estratto da Python in a Nutshell.

È questo il comportamento predefinito delle funzioni max e min? Dovrebbe essere? Non dovrebbero corrispondere alla funzione di ordinamento?

risposta

23

Sei incappato in una differenza nell'implementazione di .sort e max più di un problema con la lingua.

list.sort() accetta un argomento di parole chiave "chiave" che avviene per impostazione predefinita su Nessuno. Ciò significa che il metodo di ordinamento non è in grado di distinguere tra la fornitura di un argomento key=None o il solo valore predefinito. In entrambi i casi, si comporta come se non fosse stata fornita alcuna funzione chiave.

max d'altra parte sta controllando la presenza di un argomento chiave "chiave". Non ha un valore predefinito e il suo valore è usato come funzione chiave se presente.

In entrambi i casi, la chiave non deve mai essere fornita come Nessuna. Si suppone che sia una funzione che viene utilizzata per estrarre un valore "chiave" dagli elementi nell'elenco/iterabile. Ad esempio:

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

Grazie per la risposta. Sapevo che l'effettiva implementazione di queste funzionalità era diversa, ma ero un po 'frustrato dal fatto che tutta la documentazione che ho trovato non rendesse esplicita questa differenza. –

+0

Nessun problema. Se questo risponde alla tua domanda, accettarla è sempre apprezzata. –

+1

"chiave" è un nome davvero terribile ... – OlivierBlanvillain

7

@ La risposta di David è perfetta. Solo l'aggiunta, nel caso in cui vi state chiedendo, la key valore di default (sia in sort e in max/min funzioni) è qualcosa di simile:

lambda x: x 
+1

Tuttavia, ordina gli handle passando None come valore predefinito, mentre min/max no. Quindi, qualcosa viene implementato in modo diverso. Se si guarda il codice, la funzione min e max controlla semplicemente se è stata definita nel dizionario degli argomenti. Non credo ci sia un valore predefinito per l'argomento chiave max/min, solo comportamento predefinito. –

Problemi correlati