2011-12-05 16 views
8

La documentación para las funciones integradas max y min en Python indica que el parámetro key debe funcionar como lo hace en la función sort. En otras palabras, yo debería ser capaz de hacer esto:Clave predeterminada para funciones máximas/mínimas integradas de Python

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

Sin embargo, esto plantea un error: TypeError: 'NoneType' object is not callable

Pero, si hago algo similar con la función sort, consigo los resultados esperados:

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

No se genera ningún error y se utiliza la clasificación predeterminada. Varios libros también implican que debería ser capaz de salirse con la misma conducta en las funciones max y min. Vea este extracto del Python in a Nutshell.

¿Es este el comportamiento predeterminado de las funciones max y min? ¿Deberia ser? ¿No deberían coincidir con la función de clasificación?

Respuesta

23

Ha tropezado con una diferencia en la implementación de .sort y max más que un problema con el idioma.

list.sort() toma un argumento de palabra clave "clave" que pasa a establecerse como Ninguno. Esto significa que el método de ordenación no puede distinguir la diferencia entre el suministro de un argumento key=None o simplemente la adopción del valor predeterminado. En cualquier caso, se comporta como si no se hubiera proporcionado ninguna función clave.

max por otro lado está comprobando la presencia de un argumento de palabra clave "clave". No tiene un valor predeterminado y su valor se utiliza como la función clave si está presente.

De cualquier forma, la clave nunca debe suministrarse como Ninguna. Se supone que es una función que se usa para extraer un valor "clave" de los elementos en la lista/iterable. Por ejemplo:

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

Gracias por la respuesta. Sabía que la implementación real de estas características era diferente, pero me frustraba que toda la documentación que podía encontrar no hiciera explícita esta diferencia. –

+0

No hay problema. Si esto responde su pregunta, siempre se agradece su aceptación. –

+1

"clave" es un nombre realmente terrible ... – OlivierBlanvillain

7

@ La respuesta de David es perfecta. Simplemente añadiendo, en caso de que se esté preguntando, el key valor predeterminado (tanto en sort y en max/min funciones) es algo así como:

lambda x: x 
+1

Pero, clasifica los identificadores que pasan Ninguno como valor predeterminado, mientras que min/max no. Entonces, algo se está implementando de manera diferente. Si observa el código, la función mínima y máxima simplemente verifica si se ha definido en el diccionario de argumentos. No creo que haya un valor predeterminado para el argumento de la clave max/min, solo comportamiento predeterminado. –

Cuestiones relacionadas