¿Qué es `lambda` en código Python? ¿Cómo funciona con argumentos `clave` para `ordenado`, `suma`, etc.?

5 minutos de lectura

Avatar de usuario de Thiru
Thiru

Vi algunos ejemplos usando funciones integradas como sorted, sum etc que utilizan key=lambda.

Que hace lambda significa aquí? ¿Como funciona?


Para conocer el concepto informático general de una lambda, consulte ¿Qué es una (función) lambda?.

  • key en este caso es un argumento de palabra clave y no tiene nada que ver con lambda.

    – l4mpi

    2 de diciembre de 2012 a las 12:34

  • Vea esto: stackoverflow.com/questions/8966538/…

    – Sachin Jain

    24 de julio de 2013 a las 6:49

Avatar de usuario de Martijn Pieters
Martijn Pieters

A lambda es una función anónima:

>>> f = lambda: 'foo'
>>> print f()
foo

A menudo se utiliza en funciones tales como sorted() que toman un invocable como parámetro (a menudo el key parámetro de palabra clave). Podría proporcionar una función existente en lugar de una lambda allí también, siempre que sea un objeto invocable.

toma el sorted() función como ejemplo. Devolverá el iterable dado en orden ordenado:

>>> sorted(['Some', 'words', 'sort', 'differently'])
['Some', 'differently', 'sort', 'words']

pero eso ordena las palabras en mayúsculas antes que las palabras en minúsculas. Utilizando el key palabra clave puede cambiar cada entrada para que se ordene de manera diferente. Podríamos poner en minúsculas todas las palabras antes de ordenarlas, por ejemplo:

>>> def lowercased(word): return word.lower()
...
>>> lowercased('Some')
'some'
>>> sorted(['Some', 'words', 'sort', 'differently'], key=lowercased)
['differently', 'Some', 'sort', 'words']

Tuvimos que crear una función separada para eso, no pudimos alinear el def lowercased() línea en el sorted() expresión:

>>> sorted(['Some', 'words', 'sort', 'differently'], key=def lowercased(word): return word.lower())
  File "<stdin>", line 1
    sorted(['Some', 'words', 'sort', 'differently'], key=def lowercased(word): return word.lower())
                                                           ^
SyntaxError: invalid syntax

A lambda por otro lado, se puede especificar directamente, en línea en el sorted() expresión:

 >>> sorted(['Some', 'words', 'sort', 'differently'], key=lambda word: word.lower())
['differently', 'Some', 'sort', 'words']

Las lambdas están limitadas a una sola expresión, cuyo resultado es el valor de retorno.

Hay un montón de lugares en la biblioteca de Python, incluidas las funciones integradas, que toman un invocable como palabra clave o argumento posicional. Hay demasiados para nombrarlos aquí y, a menudo, desempeñan un papel diferente.

avatar de usuario de hygull
hygull

en Python, lambda es una palabra clave utilizada para definir funciones anónimas(es decir, funciones que no tienen nombre), a veces llamadas funciones lambda (después de la palabra clave, que a su vez proviene de teoría).

Veamos algunos ejemplos:

>>> # Define a lambda function that takes 2 parameters and sums them:
>>> lambda num1, num2: num1 + num2 
<function <lambda> at 0x1004b5de8>
>>> 
>>> # We can store the returned value in variable & call it:
>>> addition = lambda num1, num2: num1 + num2
>>> addition(62, 5)
67
>>> addition(1700, 29)
1729
>>> 
>>> # Since it's an expression, we can use it in-line instead:
>>> (lambda num1, num2: num1 + num2)(120, 1)
121
>>> (lambda num1, num2: num1 + num2)(-68, 2)
-66
>>> (lambda num1, num2: num1 + num2)(-68, 2**3)
-60
>>> 

Ahora veamos cómo funciona esto en el contexto de sorted.

Supongamos que tenemos una lista como esta, con una mezcla de enteros y cadenas con contenido numérico:

nums = ["2", 1, 3, 4, "5", "8", "-1", "-10"]

y que nos gustaría ordenar los valores según el número que representan: por lo tanto, el resultado debe ser ['-10', '-1', 1, '2', 3, 4, '5', '8'].

Si tratamos de ordenarlo usando sortedobtenemos un resultado incorrecto:

>>> nums = ["2", 1, 3, 4, "5", "8", "-1", "-10"]
>>> sorted(nums) # in 2.x
[1, 3, 4, '-1', '-10', '2', '5', '8']
>>> # In 3.x, an exception is raised instead

usando un key por sortedsin embargo, podemos ordenar los valores de acuerdo al resultado de aplicar el key función a cada valor:

>>> nums = ["2", 1, 3, 4, "5", "8", "-1", "-10"]
>>> sorted(nums, key=int)
['-10', '-1', 1, '2', 3, 4, '5', '8']
>>> 

Ya que lambda crea un invocable (específicamente, una función), podemos usar uno para el key:

>>> names = ["Rishikesh", "aman", "Ajay", "Hemkesh", "sandeep", "Darshan", "Virendra", "Shwetabh"]
>>> names2 = sorted(names)
>>> names2
['Ajay', 'Darshan', 'Hemkesh', 'Rishikesh', 'Shwetabh', 'Virendra', 'aman', 'sandeep']
>>> # Let's use a lambda to get a case-insensitive sort:
>>> names3 = sorted(names, key=lambda name:name.lower())
>>> names3
['Ajay', 'aman', 'Darshan', 'Hemkesh', 'Rishikesh', 'sandeep', 'Shwetabh', 'Virendra']
>>>

Lambda puede ser cualquier función. Así que si tuvieras una función

def compare_person(a):
         return a.age

Puede ordenar una lista de Persona (cada una de las cuales tiene un atributo de edad) como esta:

sorted(personArray, key=compare_person)

De esta forma, la lista estaría ordenada por edad en orden ascendente.

El parámetro se llama lambda porque python tiene ingeniosas palabras clave lambda para definir tales funciones sobre la marcha. En lugar de definir una función compare_person y pasarla a sorted, también puede escribir:

sorted(personArray, key=lambda a: a.age)

que hace lo mismo.

 >>> sorted(['Some', 'words', 'sort', 'differently'], key=lambda word: word.lower())

En realidad, los códigos anteriores pueden ser:

>>> sorted(['Some','words','sort','differently'],key=str.lower)

De acuerdo a https://docs.python.org/2/library/functions.html?highlight=sorted#sorted, key especifica una función de un argumento que se utiliza para extraer una clave de comparación de cada elemento de la lista: key=str.lower. El valor predeterminado es Ninguno (compare los elementos directamente).

¿Ha sido útil esta solución?