Vengo de fondo OOP y trato de aprender Python. Estoy usando la maxfunción que usa una expresión lambda para devolver la instancia de tipo que Playertiene el máximo totalScoreentre la lista players.
def winner():
w = max(players, key=lambda p: p.totalScore)
La función devuelve correctamente la instancia de tipo que Playertiene un máximo totalScore. Estoy confundido acerca de las siguientes tres cosas:
- ¿Cómo funciona la
maxfunción? ¿Cuáles son los argumentos que está tomando? Miré la documentación pero no pude entender. - ¿Para qué sirve la palabra clave
keyen la función max? Sé que también se usa en el contexto de lasortfunció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 lambday quizás pueda ser más útil para los nuevos usuarios.Respuestas:
lambdaes una función anónima, es equivalente a:Ahora se
maxconvierte en:Pero como las
defdeclaraciones son declaraciones compuestas, no se pueden usar donde se requiere una expresión, por eso a veceslambdase usan las.Tenga en cuenta que
lambdaes 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é
maxhacer?Entonces, simplemente devuelve el objeto que es el más grande.
Como
keyfuncionaDe manera predeterminada, en Python 2
keycompara 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
keyargumento.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
maxcomparan 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
keyuno simplelambda:Ejemplo 2: Aplicar
maxa una lista de tuplas.Por defecto
maxcomparará 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?maxnotlambda(keyarg es opcional), y durante la iteración, cada elemento se pasa a la función especificadakeyy 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 comokeyargumento. Por ejemplo, puede obtener la cadena más larga delis=['a', 'aa', 'aaa']pormax(lis, key=len)max,min,sortedetc 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.
Keyes una función lambda que le dirámaxqué 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,
ayb, 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 porby 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
maxLa 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=funcbásicamente nos permite pasar un argumento opcionalkeya la función sobre cuya base se ordenan los iteradores / argumentos dados y se devuelve el máximo.lambdaes una palabra clave de python que actúa como una pseudo función. Entonces, cuando le pasas unplayerobjeto, regresaráplayer.totalScore. Por lo tanto, el iterable pasado a la funciónmaxse ordenará de acuerdo con elkeypuntaje total de losplayerobjetos que se le otorguen y devolveráplayerquién tiene el máximototalScore.Si no
keyse 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, lamaxfunció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
playerdeterminar su valor de comparación es complicado, por lo que se le da elkeyargumento para determinar cómo lamaxfunción decidirá el valor de cada unoplayer. En este caso, está utilizando una función lambda para decir "para cada unopenplayersobtenerp.totalscorey usar eso como su valor para la comparación".fuente
maxestá construido en una función que toma un primer argumentoiterable(como list o tuple)El argumento de la palabra clave
keytiene su valor predeterminadoNonepero 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