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?.
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.
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 sorted
obtenemos 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 sorted
sin 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).
key
en este caso es un argumento de palabra clave y no tiene nada que ver conlambda
.– 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