Vengo de fondo OOP y trato de aprender Python. Estoy usando la max
función que usa una expresión lambda para devolver la instancia de tipo que Player
tiene el máximo totalScore
entre la lista players
.
def winner():
w = max(players, key=lambda p: p.totalScore)
La función devuelve correctamente la instancia de tipo que Player
tiene un máximo totalScore
. Estoy confundido acerca de las siguientes tres cosas:
- ¿Cómo funciona la
max
función? ¿Cuáles son los argumentos que está tomando? Miré la documentación pero no pude entender. - ¿Para qué sirve la palabra clave
key
en la función max? Sé que también se usa en el contexto de lasort
función. - Significado de la expresión lambda? ¿Cómo leerlos? ¿Cómo trabajan?
Todas estas son preguntas conceptuales muy novatas, pero me ayudarán a entender el lenguaje. Sería útil si pudiera dar ejemplos para explicar. Gracias
python max lambda
y quizás pueda ser más útil para los nuevos usuarios.Respuestas:
lambda
es una función anónima, es equivalente a:Ahora se
max
convierte en:Pero como las
def
declaraciones son declaraciones compuestas, no se pueden usar donde se requiere una expresión, por eso a veceslambda
se usan las.Tenga en cuenta que
lambda
es equivalente a lo que pondría en una declaración de devolución de adef
. Por lo tanto, no puede usar declaraciones dentro de alambda
, solo se permiten expresiones.¿Qué
max
hacer?Entonces, simplemente devuelve el objeto que es el más grande.
Como
key
funcionaDe manera predeterminada, en Python 2
key
compara elementos basados en un conjunto de reglas basadas en el tipo de objetos (por ejemplo, una cadena siempre es mayor que un entero).Para modificar el objeto antes de la comparación, o para comparar en función de un atributo / índice particular, debe usar el
key
argumento.Ejemplo 1:
Un ejemplo simple, suponga que tiene una lista de números en forma de cadena, pero desea comparar esos elementos por su valor entero.
Aquí se
max
comparan los elementos utilizando sus valores originales (las cadenas se comparan lexicográficamente para que se obtenga'2'
como salida):Para comparar los elementos por su valor entero, use
key
uno simplelambda
:Ejemplo 2: Aplicar
max
a una lista de tuplas.Por defecto
max
comparará los elementos por el primer índice. Si el primer índice es el mismo, comparará el segundo índice. Como en mi ejemplo, todos los elementos tienen un primer índice único, por lo que obtendría esto como respuesta:Pero, ¿qué sucede si desea comparar cada elemento por el valor en el índice 1? Simple: uso
lambda
:Comparar elementos en un iterable que contiene objetos de diferente tipo :
Lista con elementos mixtos:
En Python 2 es posible comparar elementos de dos tipos diferentes :
Pero en Python 3 ya no puedes hacer eso :
Pero esto funciona, ya que estamos comparando la versión entera de cada objeto:
fuente
lengths = map(lambda word: len(word), words)
dondewords=['It', 'is', 'raining', 'cats', 'and', 'dogs']
veo que la lambda está iterando sobre cada palabra en la lista. ¿Siempre hace esto?max
notlambda
(key
arg es opcional), y durante la iteración, cada elemento se pasa a la función especificadakey
y el valor devuelto se utiliza para la comparación.max(lis, key=lambda x:int(x))
se puede simplificar comomax(lis, key=int)
. Python tiene una función incorporada, int (). Del mismo modo, puede usar cualquier otra función incorporada comokey
argumento. Por ejemplo, puede obtener la cadena más larga delis=['a', 'aa', 'aaa']
pormax(lis, key=len)
max
,min
,sorted
etc correctamente. Además, he mencionadomax(lis, key=int)
justo al final. :-)Versión muy simplificada de
max
:En cuanto a lambda:
fuente
Busca el elemento "más grande" en un iterable. Asumiré que puedes buscar qué es eso, pero si no, es algo que puedes recorrer, es decir, una lista o cadena.
Key
es una función lambda que le dirámax
qué objetos en el iterable son más grandes que otros. Di si estabas ordenando algún objeto que creaste tú mismo, y no algo obvio, como los enteros.Esa es una pregunta más grande. En términos simples, una lambda es una función que puede pasar y hacer que otros códigos la usen. Toma esto por ejemplo:
Esto toma dos objetos,
a
yb
, y una funciónf
. Llamaf()
a cada objeto, luego los agrega. Entonces mira esta llamada:sum()
toma2
, y llama a la expresión lambda en él. Entonces sef(a)
convierte en2 * 2
, que se convierte en 4. Luego hace esto porb
y suma los dos juntos.En términos no tan simples, las lambdas provienen del cálculo lambda, que es la idea de una función que devuelve una función; Un concepto matemático muy bueno para expresar la computación. Usted puede leer acerca de que aquí , y luego en realidad entender que aquí .
Probablemente sea mejor leer un poco más sobre esto, ya que las lambdas pueden ser confusas, y no es obvio de inmediato cuán útiles son. Mira aquí .
fuente
max
La función se utiliza para obtener el máximo de uniterable
.Los iteradores pueden ser listas, tuplas, objetos dictados, etc. O incluso objetos personalizados como en el ejemplo que proporcionó.
Entonces,
key=func
básicamente nos permite pasar un argumento opcionalkey
a la función sobre cuya base se ordenan los iteradores / argumentos dados y se devuelve el máximo.lambda
es una palabra clave de python que actúa como una pseudo función. Entonces, cuando le pasas unplayer
objeto, regresaráplayer.totalScore
. Por lo tanto, el iterable pasado a la funciónmax
se ordenará de acuerdo con elkey
puntaje total de losplayer
objetos que se le otorguen y devolveráplayer
quién tiene el máximototalScore
.Si no
key
se proporciona ningún argumento, el máximo se devuelve de acuerdo con los pedidos predeterminados de Python.Ejemplos -
fuente
De acuerdo con la documentación :
Lo que esto está diciendo es que en su caso, está proporcionando una lista, en este caso
players
. Luego, lamax
función iterará sobre todos los elementos de la lista y los comparará entre sí para obtener un "máximo".Como puede imaginar, con un objeto complejo como
player
determinar su valor de comparación es complicado, por lo que se le da elkey
argumento para determinar cómo lamax
función decidirá el valor de cada unoplayer
. En este caso, está utilizando una función lambda para decir "para cada unop
enplayers
obtenerp.totalscore
y usar eso como su valor para la comparación".fuente
max
está construido en una función que toma un primer argumentoiterable
(como list o tuple)El argumento de la palabra clave
key
tiene su valor predeterminadoNone
pero acepta la función para evaluar, considérelo como un contenedor que evalúa iterable en función de la funciónConsidere este diccionario de ejemplo:
Ex:
Como puede ver si solo pasa el iterable sin kwarg (una función para
key
), está devolviendo el valor máximo de la clave (alfabéticamente)Ex. En lugar de encontrar el valor máximo de la clave alfabéticamente, es posible que deba encontrar la clave máxima por la longitud de la clave:
en este ejemplo, la función lambda está devolviendo la longitud de la clave que se repetirá, por lo tanto, al evaluar los valores en lugar de considerarla alfabéticamente, realizará un seguimiento de la longitud máxima de la clave y devolverá la clave que tiene la longitud máxima
Ex.
en este ejemplo, la función lambda está devolviendo el valor de la clave de diccionario correspondiente que tiene el valor máximo
fuente