| You are here: Inicio > Inmersión en Python > El poder de la introspección > Utilización de las funciones lambda | << >> | ||||
Inmersión en PythonPython de novato a experto |
|||||
Python admite una interesante sintaxis que permite definir funciones mínimas, de una línea, sobre la marcha. Tomada de Lisp, se trata de las denominadas funciones lambda, que pueden utilizarse en cualquier lugar donde se necesite una función.
>>> def f(x): ... return x*2 ... >>> f(3) 6 >>> g = lambda x: x*2>>> g(3) 6 >>> (lambda x: x*2)(3)
6
En general, una función lambda es una función que toma cualquier número de argumentos (incluso argumentos opcionales) y devuelve el valor de una expresión simple. Las funciones lambda no pueden contener sentencias y tampoco pueden contener más de una expresión. No intente exprimir demasiado una función lambda; si necesita algo más complejo, defina en su lugar una función normal y hágala tan grande como quiera.
| Las funciones lambda son una cuestión de estilo. Su uso nunca es necesario. Puede definir una función normal separada y usarla en cualquier sitio en que pueda utilizarse una lambda. Yo las utilizo en lugares donde deseo encapsulación, código no reutilizable que no ensucie mi propio código con un montón de pequeñas funciones de una sola línea. | |
Aquí están las funciones lambda de apihelper.py:
processFunc = collapse and \
(lambda s: " ".join(s.split())) or (lambda s: s)Observe que aquí usamos la forma simple del truco and-or, lo cual está bien porque una función lambda siempre es verdadera en un contexto booleano (esto no significa que una función lambda no pueda devolver un valor falso; la función es siempre verdadera; su valor de retorno puede ser cualquier cosa).
Adiverta también que estamos usando la función split sin argumentos. Ya ha visto usarla con uno o más argumentos, pero sin argumentos hace la división en los espacios en blanco.
>>> s = "esto es\nuna\tprueba">>> print s esto es una prueba >>> print s.split()
['esto', 'es', 'una', 'prueba'] >>> print " ".join(s.split())
'esto es una prueba'
| Ésta es una cadena de varias líneas definida por caracteres de escape en lugar de triples comillas. \n es el retorno de carro; \t es el carácter de tabulación. | |
| split sin argumentos divide en los espacios en blanco. De modo que tres espacios, un retorno de carro y un carácter de tabulación son lo mismo. | |
| Se puede normalizar el espacio en blanco dividiendo una cadena con split y volviéndola a unir con join y un espacio simple como delimitador. Esto es lo que hace la función info para unificar las cadenas de documentación de varias líneas en una sola. |
Entonces, ¿qué hace realmente la función info con estas funciones lambda, con split y con los trucos and-or?
processFunc es ahora una función, pero qué función en concreto es algo depende del valor de la variable collapse. Si collapse es verdadera, processFunc(cadena) unificará el espacio en blanco; en caso contrario, processFunc(cadena) devolverá su argumento sin cambios.
Para hacer esto con un lenguaje menos robusto, como Visual Basic, probablemente crearía usted una función que tomara una cadena y un argumento collapse utilizando una sentencia if, para decidir si unificar o no el espacio en blanco y devolver después el valor apropiado. Esto sería ineficaz, porque la función tendría que considerar todos los casos posibles; cada vez que fuera invocada tendría que decidir si unificar o no el espacio en blanco antes de devolver el valor deseado. En Python, puede tomarse esta decisión fuera de la función y definir una función lambda adaptada para devolver exactamente (y únicamente) lo que se busca. Esto es más eficaz, más elegante, y menos propenso a esos errores del tipo “Huy, creía que esos argumentos iban al revés”.
<< La peculiar naturaleza de and y or |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
Todo junto >> |