15-10-2015 18:43
Hola, te pongo unos ejemplillos:
Las funciones lambda siguen la siguiente sintaxis básica:
Por ejemplo:
Su propósito en la vida es coger un valor y devolver otro sin alterar el estado del objeto que recibe como parámetro.
Python viene de serie con un conjunto de funciones que aceptan objetos iterables y funciones ( que pueden ser lambda, funciones normales, o cualquier objeto que se puede "llamar" con () ):
Por ejemplo la función map, aplica a cada elemento de una lista u objeto iterable una función:
Ahora lo mismo pero esta vez con funciones lambda:
La lista permanece intacta, map genera un nuevo objeto iterable que se puede combinar en otras expresiones.
Dentro de un función lambda, está permitido utilizar if en su expresión ternaria:
Un ejemplo un poco más complejo de funciones lambda sería el siguiente, por ejemplo como implementar la propia función map:
Es decir, aplicamos la función a elemento 0 de la lista, metemos ese valor dentro de una nueva lista:
[funcion(lista[0])]
y si todavía queda más de un elemento en la lista, llamamos de forma recursiva a _map con el resto de la lista _map(funcion, lista[1:]),
la sublistas se concatenan y al final obtiene lista final.
Volviendo a tu ejemplo, la función max devuelve el valor máximo de una lista:
max acepta otro argumento, key,  si max no recibe key, la key de cada elemento de la lista es el propio valor del elemento y max
se basa en la key para determinar cual es el elemento mayor.
Ahora bien, si por ejemplo, le pasamos la siguiente expresión lambda como key
Lo que hace es aplicar a cada elemento de la lista la función lambda para obtener la key:
Ahora la key máxima es 100, que pertenece al elemento 0. Por lo tanto devuelve 0.
Las funciones lambda siguen la siguiente sintaxis básica:
Código:
lambda lista_de_parámetros : valor de retorno
Por ejemplo:
Código:
multiplica = lambda a, b: a * b
multiplica(2, 5) -> devuelve 10
Su propósito en la vida es coger un valor y devolver otro sin alterar el estado del objeto que recibe como parámetro.
Python viene de serie con un conjunto de funciones que aceptan objetos iterables y funciones ( que pueden ser lambda, funciones normales, o cualquier objeto que se puede "llamar" con () ):
Por ejemplo la función map, aplica a cada elemento de una lista u objeto iterable una función:
Código:
lista = [1, 2, 3, 4, 5, 6, 7]
def dobla(a):
    return a * 2
map(dobla, lista) -> evalua a [2, 4, 6, 8, 10, 12, 14]
Ahora lo mismo pero esta vez con funciones lambda:
Código:
map(lambda a : a * 2, lista) -> evalua a  [2, 4, 6, 8, 10, 12, 14]
La lista permanece intacta, map genera un nuevo objeto iterable que se puede combinar en otras expresiones.
Dentro de un función lambda, está permitido utilizar if en su expresión ternaria:
Código:
mayorque10 = lambda n : True if n > 10 else False
mayorque10(100) -> True
mayorque10(9) -> False
Un ejemplo un poco más complejo de funciones lambda sería el siguiente, por ejemplo como implementar la propia función map:
Código:
_map = lambda funcion, lista : [funcion(lista[0])] + _map(funcion, lista[1:]) if len(lista) > 1 else [funcion(lista[0])]
Es decir, aplicamos la función a elemento 0 de la lista, metemos ese valor dentro de una nueva lista:
[funcion(lista[0])]
y si todavía queda más de un elemento en la lista, llamamos de forma recursiva a _map con el resto de la lista _map(funcion, lista[1:]),
la sublistas se concatenan y al final obtiene lista final.
Volviendo a tu ejemplo, la función max devuelve el valor máximo de una lista:
Código:
lista = [0, 10, 15]
max(lista) -> 15
max acepta otro argumento, key,  si max no recibe key, la key de cada elemento de la lista es el propio valor del elemento y max
se basa en la key para determinar cual es el elemento mayor.
Código:
Elemento   Key
0,         0
10,        10
15         15
Ahora bien, si por ejemplo, le pasamos la siguiente expresión lambda como key
Código:
max(lista, key=lambda a : 100 if a == 0 else a) -> evalua a 0
Lo que hace es aplicar a cada elemento de la lista la función lambda para obtener la key:
Código:
Elemento   Key
0,         100
10,        10
15         15
Ahora la key máxima es 100, que pertenece al elemento 0. Por lo tanto devuelve 0.