stringtranslate.com

Función anónima

En programación informática , una función anónima ( literal de función , expresión o bloque ) es una definición de función que no está vinculada a un identificador . Las funciones anónimas suelen ser argumentos que se pasan a funciones de orden superior o se utilizan para construir el resultado de una función de orden superior que necesita devolver una función. [1] Si la función solo se utiliza una vez, o un número limitado de veces, una función anónima puede ser sintácticamente más ligera que utilizar una función con nombre. Las funciones anónimas son omnipresentes en los lenguajes de programación funcional y otros lenguajes con funciones de primera clase , donde cumplen el mismo papel para el tipo de función que los literales para otros tipos de datos .

Las funciones anónimas se originan en el trabajo de Alonzo Church en su invención del cálculo lambda , en el que todas las funciones son anónimas, en 1936, antes de las computadoras electrónicas. [2] En varios lenguajes de programación, las funciones anónimas se introducen utilizando la palabra clave lambda , y las funciones anónimas a menudo se denominan lambdas o abstracciones lambda. Las funciones anónimas han sido una característica de los lenguajes de programación desde Lisp en 1958, y un número creciente de lenguajes de programación modernos admiten funciones anónimas.

Nombres

Los nombres "abstracción lambda", "función lambda" y "expresión lambda" hacen referencia a la notación de abstracción de funciones en el cálculo lambda, donde la función habitual f ( x ) = M se escribiría x . M ) , y donde M es una expresión que utiliza x . Compárese con la sintaxis de Python de .lambda x: M

El nombre "función flecha" hace referencia al símbolo matemático " maps to ", xM . Compárese con la sintaxis de JavaScript de . [3]x => M

Usos

Las funciones anónimas se pueden utilizar para contener funcionalidades que no necesitan ser nombradas y posiblemente para uso a corto plazo. Algunos ejemplos notables incluyen cierres y currying .

El uso de funciones anónimas es una cuestión de estilo. Su uso nunca es la única forma de resolver un problema; cada función anónima podría definirse como una función nombrada y llamarse por su nombre. Las funciones anónimas suelen proporcionar una notación más breve que la definición de funciones nombradas. En lenguajes que no permiten la definición de funciones nombradas en ámbitos locales, las funciones anónimas pueden proporcionar encapsulación a través de un ámbito localizado, sin embargo, el código en el cuerpo de dicha función anónima puede no ser reutilizable o susceptible de pruebas por separado. Las funciones anónimas cortas/simples utilizadas en expresiones pueden ser más fáciles de leer y comprender que las funciones nombradas definidas por separado, aunque sin un nombre descriptivo pueden ser más difíciles de entender.

En algunos lenguajes de programación, las funciones anónimas se implementan comúnmente para propósitos muy específicos, como vincular eventos a devoluciones de llamadas o instanciar la función para valores particulares, lo que puede ser más eficiente en un lenguaje de programación dinámico , más legible y menos propenso a errores que llamar a una función con nombre.

Los siguientes ejemplos están escritos en Python 3.

Clasificación

Al intentar ordenar de una manera no estándar, puede ser más fácil incluir la lógica de ordenación como una función anónima en lugar de crear una función con nombre. La mayoría de los lenguajes proporcionan una función de ordenación genérica que implementa un algoritmo de ordenación que ordenará objetos arbitrarios. Esta función generalmente acepta una función arbitraria que determina cómo comparar si dos elementos son iguales o si uno es mayor o menor que el otro.

Considere este código Python que ordena una lista de cadenas por longitud de la cadena:

>>>  a  =  [ 'casa' ,  'coche' ,  'bicicleta' ] >>>  a . sort ( key = lambda  x :  len ( x )) >>>  a [ 'coche' ,  'bicicleta' ,  'casa' ]

La función anónima en este ejemplo es la expresión lambda:

lambda  x :  longitud ( x )

La función anónima acepta un argumento, x, y devuelve la longitud de su argumento, que luego el sort()método utiliza como criterio de clasificación.

La sintaxis básica de una función lambda en Python es

lambda  arg1 ,  arg2 ,  arg3 ,  ... :  < operación  sobre  los  argumentos  que devuelve  un  valor >

La expresión devuelta por la función lambda se puede asignar a una variable y utilizar en el código en varios lugares.

>>>  suma  =  lambda  a :  a  +  a >>>  suma ( 20 ) 40

Otro ejemplo sería ordenar elementos de una lista por el nombre de su clase (en Python, todo tiene una clase):

>>>  a  =  [ 10 ,  'número' ,  11.2 ] >>>  a . sort ( key = lambda  x :  x . __class__ . __name__ ) >>>  a [ 11.2 ,  10 ,  'número' ]

Tenga en cuenta que 11.2tiene el nombre de clase " float", 10tiene el nombre de clase " int" y 'number'tiene el nombre de clase " str". El orden de clasificación es " float", " int" y luego " str".

Cierres

Los cierres son funciones que se evalúan en un entorno que contiene variables vinculadas . El siguiente ejemplo vincula la variable "umbral" en una función anónima que compara la entrada con el umbral.

def  comp ( umbral ):  devuelve  lambda  x :  x  <  umbral

Esto se puede utilizar como una especie de generador de funciones de comparación:

>>>  func_a  =  comp ( 10 ) >>>  func_b  =  comp ( 20 )>>>  print ( func_a ( 5 ),  func_a ( 8 ),  func_a ( 13 ),  func_a ( 21 )) Verdadero  Verdadero  Falso Falso >>>  imprimir ( func_b ( 5 ),  func_b ( 8 ),  func_b ( 13 ),  func_b ( 21 )) Verdadero Verdadero  Verdadero  Falso 

Sería poco práctico crear una función para cada función de comparación posible y puede resultar demasiado inconveniente mantener el umbral para su uso posterior. Independientemente del motivo por el que se utilice un cierre, la función anónima es la entidad que contiene la funcionalidad que realiza la comparación.

Zurra

Currying es el proceso de cambiar una función de modo que, en lugar de tomar múltiples entradas, tome una sola entrada y devuelva una función que acepte la segunda entrada, y así sucesivamente. En este ejemplo, una función que realiza una división por cualquier número entero se transforma en una que realiza una división por un número entero determinado.

>>>  def  divide ( x ,  y ): ...  devuelve  x  /  y>>>  def  divisor ( d ): ...  return  lambda  x :  divide ( x ,  d )>>>  mitad  =  divisor ( 2 ) >>>  tercio  =  divisor ( 3 )>>>  imprimir ( mitad ( 32 ),  tercio ( 32 )) 16.0  10.6666666666666666>>>  imprimir ( mitad ( 40 ),  tercio ( 40 )) 20.0  13.333333333333334

Si bien el uso de funciones anónimas quizás no sea común en la currificación, aún se puede utilizar. En el ejemplo anterior, la función divisor genera funciones con un divisor especificado. Las funciones half y third currifican la función divide con un divisor fijo.

La función divisor también forma un cierre al vincular la variable d.

Funciones de orden superior

Una función de orden superior es una función que toma una función como argumento o devuelve una como resultado. Esto se usa comúnmente para personalizar el comportamiento de una función definida de manera genérica, a menudo una construcción de bucle o un esquema de recursión. Las funciones anónimas son una forma conveniente de especificar dichos argumentos de función. Los siguientes ejemplos están en Python 3.

Mapa

La función map realiza una llamada a una función en cada elemento de una lista. El siguiente ejemplo eleva al cuadrado cada elemento de una matriz con una función anónima.

>>>  a  =  [ 1 ,  2 ,  3 ,  4 ,  5 ,  6 ] >>>  lista ( mapa ( lambda  x :  x * x ,  a )) [ 1 ,  4 ,  9 ,  16 ,  25 ,  36 ]

La función anónima acepta un argumento y lo multiplica por sí mismo (lo eleva al cuadrado). La forma anterior es desaconsejada por los creadores del lenguaje, quienes sostienen que la forma presentada a continuación tiene el mismo significado y está más alineada con la filosofía del lenguaje:

>>>  a  =  [ 1 ,  2 ,  3 ,  4 ,  5 ,  6 ] >>>  [ x * x  para  x  en  a ] [ 1 ,  4 ,  9 ,  16 ,  25 ,  36 ]

Filtrar

La función de filtro devuelve todos los elementos de una lista que evalúan como Verdadero cuando se pasan a una función determinada.

>>>  a  =  [ 1 ,  2 ,  3 ,  4 ,  5 ,  6 ] >>>  lista ( filtro ( lambda  x :  x  %  2  ==  0 ,  a )) [ 2 ,  4 ,  6 ]

La función anónima comprueba si el argumento que se le pasa es par. Al igual que con map, se considera más apropiada la siguiente forma:

>>>  a  =  [ 1 ,  2 ,  3 ,  4 ,  5 ,  6 ] >>>  [ x  para  x  en  a  si  x  %  2  ==  0 ] [ 2 ,  4 ,  6 ]

Doblar

Una función de plegado se ejecuta sobre todos los elementos de una estructura (en el caso de las listas, normalmente de izquierda a derecha, se denomina "plegado a la izquierda" reduceen Python) y acumula un valor a medida que avanza. Esto se puede utilizar para combinar todos los elementos de una estructura en un solo valor, por ejemplo:

>>>  desde  functools  importar  reduce >>>  a  =  [ 1 ,  2 ,  3 ,  4 ,  5 ] >>>  reduce ( lambda  x , y :  x * y ,  a ) 120

Esto funciona

La función anónima aquí es la multiplicación de los dos argumentos.

El resultado de un pliegue no tiene por qué ser un único valor. En cambio, tanto el mapa como el filtro se pueden crear utilizando el pliegue. En el mapa, el valor que se acumula es una nueva lista que contiene los resultados de aplicar una función a cada elemento de la lista original. En el filtro, el valor que se acumula es una nueva lista que contiene solo aquellos elementos que coinciden con la condición dada.

Lista de idiomas

La siguiente es una lista de lenguajes de programación que admiten funciones anónimas sin nombre en su totalidad, en parte como alguna variante, o no las admiten en absoluto.

Esta tabla muestra algunas tendencias generales. En primer lugar, los lenguajes que no admiten funciones anónimas ( C , Pascal , Object Pascal ) son todos lenguajes de tipado estático. Sin embargo, los lenguajes de tipado estático pueden admitir funciones anónimas. Por ejemplo, los lenguajes ML son de tipado estático e incluyen fundamentalmente funciones anónimas, y Delphi , un dialecto de Object Pascal , se ha ampliado para admitir funciones anónimas, al igual que C++ (por el estándar C++11 ). En segundo lugar, los lenguajes que tratan las funciones como funciones de primera clase ( Dylan , Haskell , JavaScript , Lisp , ML , Perl , Python , Ruby , Scheme ) generalmente tienen soporte para funciones anónimas, de modo que las funciones se pueden definir y pasar tan fácilmente como otros tipos de datos.

Ejemplos de funciones anónimas

Véase también

Referencias

  1. ^ "Funciones de orden superior". learnyouahaskell.com . Consultado el 3 de diciembre de 2014 .
  2. ^ Fernández, Maribel (2009), Modelos de computación: una introducción a la teoría de la computabilidad, Temas de pregrado en ciencias de la computación, Springer Science & Business Media, p. 33, ISBN 9781848824348El cálculo Lambda ... fue introducido por Alonzo Church en la década de 1930 como una notación precisa para una teoría de funciones anónimas.
  3. ^ "Expresiones de función de flecha - JavaScript". MDN . Consultado el 21 de agosto de 2019 .
  4. ^ "Tipos de acceso". www.adaic.org . Consultado el 27 de junio de 2024 .
  5. ^ "Bash lambda". GitHub . 8 de marzo de 2019.
  6. ^ BillWagner. "Expresiones Lambda - Referencia de C#". docs.microsoft.com . Consultado el 24 de noviembre de 2020 .
  7. ^ "Apoyo al cierre". Archivado desde el original el 6 de enero de 2014. Consultado el 5 de enero de 2014 .
  8. ^ "Novedades de ColdFusion 10". Archivado desde el original el 6 de enero de 2014. Consultado el 5 de enero de 2014 .
  9. ^ "Clojure - Funciones de orden superior". clojure.org . Consultado el 14 de enero de 2022 .
  10. ^ "Managed COBOL Reference". Documentación de Micro Focus . Micro Focus . Archivado desde el original el 25 de febrero de 2014 . Consultado el 25 de febrero de 2014 .
  11. ^ "Funciones - Lenguaje de programación D". dlang.org . Consultado el 14 de enero de 2022 .
  12. ^ "Un recorrido por el lenguaje Dart". dart.dev . Consultado el 24 de noviembre de 2020 .
  13. ^ "Métodos anónimos en Delphi - RAD Studio". docwiki.embarcadero.com . Consultado el 24 de noviembre de 2020 .
  14. ^ "Funciones: programación de Dylan". opendylan.org . Consultado el 14 de enero de 2022 .
  15. ^ "docs/syntax". elm-lang.org . Consultado el 14 de enero de 2022 .
  16. ^ "Sintaxis de Erlang/Elixir: un curso intensivo". elixir-lang.github.com . Consultado el 24 de noviembre de 2020 .
  17. ^ "Erlang -- Funs". erlang.org . Consultado el 24 de noviembre de 2020 .
  18. ^ cartermp. "Expresiones Lambda: La palabra clave divertida - F#". docs.microsoft.com . Consultado el 24 de noviembre de 2020 .
  19. ^ "LAMBDA: la función definitiva de hoja de cálculo de Excel". microsoft.com . 25 de enero de 2021 . Consultado el 30 de marzo de 2021 .
  20. ^ "Citas - Documentación de factores" . Consultado el 26 de diciembre de 2015 . Una cita es una función anónima (un valor que denota un fragmento de código) que se puede utilizar como valor y llamar mediante los combinadores fundamentales.
  21. ^ "Frink". frinklang.org . Consultado el 24 de noviembre de 2020 .
  22. ^ "Funciones anónimas en GoLang". GoLang Docs . 9 de enero de 2020 . Consultado el 24 de noviembre de 2020 .
  23. ^ "Documentación de Gosu" (PDF) . Consultado el 4 de marzo de 2013 .
  24. ^ "Documentación de Groovy". Archivado desde el original el 22 de mayo de 2012. Consultado el 29 de mayo de 2012 .
  25. ^ "Función anónima - HaskellWiki". wiki.haskell.org . Consultado el 14 de enero de 2022 .
  26. ^ "Lambda". Haxe: el kit de herramientas multiplataforma . Consultado el 14 de enero de 2022 .
  27. ^ "Funciones - JavaScript | MDN". developer.mozilla.org . Consultado el 14 de enero de 2022 .
  28. ^ "Funciones · El lenguaje Julia". docs.julialang.org . Consultado el 24 de noviembre de 2020 .
  29. ^ "Funciones de orden superior y lambdas: lenguaje de programación Kotlin". Kotlin . Consultado el 24 de noviembre de 2020 .
  30. ^ "Programación en Lua: 6". www.lua.org . Consultado el 24 de noviembre de 2020 .
  31. ^ "Programación en Maple: 1.6: Funciones y expresiones anónimas - Centro de aplicaciones". www.maplesoft.com . Consultado el 24 de noviembre de 2020 .
  32. ^ "Funciones anónimas - MATLAB y Simulink". www.mathworks.com . Consultado el 14 de enero de 2022 .
  33. ^ "Manual de Maxima 5.17.1: 39. Definición de función". maths.cnam.fr . Consultado el 24 de noviembre de 2020 .
  34. ^ "Manual de Nim". nim-lang.github.io .
  35. ^ "Ejemplos de código – OCaml". ocaml.org . Consultado el 24 de noviembre de 2020 .
  36. ^ "GNU Octave: Funciones anónimas". octave.org . Consultado el 24 de noviembre de 2020 .
  37. ^ "Literales de función". Manual de usuario de OpenSCAD . Wikilibros . Consultado el 22 de febrero de 2021 .
  38. ^ "perlsub - Subrutinas de Perl - Navegador Perldoc". perldoc.perl.org . Consultado el 24 de noviembre de 2020 .
  39. ^ "PHP: Funciones anónimas - Manual" www.php.net . Consultado el 24 de noviembre de 2020 .
  40. ^ "6. Expresiones — Documentación de Python 3.9.0". docs.python.org . Consultado el 24 de noviembre de 2020 .
  41. ^ "4.4 Funciones: lambda". docs.racket-lang.org . Consultado el 24 de noviembre de 2020 .
  42. ^ "Funciones". docs.raku.org . Consultado el 14 de enero de 2022 .
  43. ^ Sosinski, Robert (21 de diciembre de 2008). "Comprensión de los bloques, procedimientos y lambdas de Ruby". Reactive.IO. Archivado desde el original el 31 de mayo de 2014. Consultado el 30 de mayo de 2014 .
  44. ^ "Cierres: funciones anónimas que pueden capturar su entorno - El lenguaje de programación Rust". doc.rust-lang.org . Consultado el 14 de enero de 2022 .
  45. ^ "Funciones anónimas". Documentación de Scala . Consultado el 14 de enero de 2022 .
  46. ^ "Recitación 3: Funciones de orden superior". www.cs.cornell.edu . Consultado el 14 de enero de 2022 .
  47. ^ "Cierres: el lenguaje de programación Swift (Swift 5.5)". docs.swift.org .
  48. ^ "Documentación - Tipos cotidianos". www.typescriptlang.org . Consultado el 14 de enero de 2022 .
  49. ^ "Tipo de función - Documentación de Typst". typst.app . Consultado el 10 de septiembre de 2024 .
  50. ^ ab "Proyectos/Vala/Tutorial - Wiki de GNOME!". wiki.gnome.org . Consultado el 24 de noviembre de 2020 .
  51. ^ KathleenDollard (15 de septiembre de 2021). "Expresiones Lambda - Visual Basic". docs.microsoft.com . Consultado el 14 de enero de 2022 .
  52. ^ "Referencia del lenguaje/Términos/Predicados anónimos - wiki.visual-prolog.com". wiki.visual-prolog.com . Consultado el 14 de enero de 2022 .
  53. ^ "Función anónima pura: Introducción elemental al lenguaje Wolfram". www.wolfram.com . Consultado el 14 de enero de 2022 .
  54. ^ "Lambdas, cierres y todo lo demás · Número 1048 · ziglang/zig". GitHub . Consultado el 21 de agosto de 2023 .

Enlaces externos