In
computer programming
Computer programming is the process of performing a particular computation (or more generally, accomplishing a specific computing result), usually by designing and building an executable computer program. Programming involves tasks such as anal ...
, an anonymous function (function literal, lambda abstraction, lambda function, lambda expression or block) is a
function definition that is not
bound to an
identifier
An identifier is a name that identifies (that is, labels the identity of) either a unique object or a unique ''class'' of objects, where the "object" or class may be an idea, physical countable object (or class thereof), or physical noncountable ...
. Anonymous functions are often arguments being passed to
higher-order functions or used for constructing the result of a higher-order function that needs to return a function.
If the function is only used once, or a limited number of times, an anonymous function may be syntactically lighter than using a named function. Anonymous functions are ubiquitous in
functional programming languages and other languages with
first-class functions, where they fulfil the same role for the
function type as
literals do for other
data type
In computer science and computer programming, a data type (or simply type) is a set of possible values and a set of allowed operations on it. A data type tells the compiler or interpreter how the programmer intends to use the data. Most progra ...
s.
Anonymous functions originate in the work of
Alonzo Church
Alonzo Church (June 14, 1903 – August 11, 1995) was an American mathematician, computer scientist, logician, philosopher, professor and editor who made major contributions to mathematical logic and the foundations of theoretical computer scie ...
in his invention of the
lambda calculus, in which all functions are anonymous, in 1936, before electronic computers. In several programming languages, anonymous functions are introduced using the keyword ''lambda'', and anonymous functions are often referred to as lambdas or lambda abstractions. Anonymous functions have been a feature of
programming language
A programming language is a system of notation for writing computer programs. Most programming languages are text-based formal languages, but they may also be graphical. They are a kind of computer language.
The description of a programming l ...
s since
Lisp
A lisp is a speech impairment in which a person misarticulates sibilants (, , , , , , , ). These misarticulations often result in unclear speech.
Types
* A frontal lisp occurs when the tongue is placed anterior to the target. Interdental lispi ...
in 1958, and a growing number of modern programming languages support anonymous functions.
Names
The names "lambda abstraction", "lambda function", and "lambda expression" refer to the notation of function abstraction in lambda calculus, where the usual function would be written ( is an expression that uses ). Compare to the Python syntax of
lambda x: M.
The name "arrow function" refers to the mathematical "
maps to" symbol, . Compare to the JavaScript syntax of
x => M.
Uses
Anonymous functions can be used for containing functionality that need not be named and possibly for short-term use. Some notable examples include
closures and
currying.
The use of anonymous functions is a matter of style. Using them is never the only way to solve a problem; each anonymous function could instead be defined as a named function and called by name. Some programmers use anonymous functions to encapsulate specific, non-reusable code without littering the code with a lot of little one-line normal functions.
In some programming languages, anonymous functions are commonly implemented for very specific purposes such as binding events to callbacks or instantiating the function for particular values, which may be more efficient, more readable, and less error-prone than calling a more-generic named function.
The following examples are written in Python 3.
Sorting
When attempting to sort in a non-standard way, it may be easier to contain the sorting logic as an anonymous function instead of creating a named function.
Most languages provide a generic sort function that implements a
sort algorithm that will sort arbitrary objects.
This function usually accepts an arbitrary function that determines how to compare whether two elements are equal or if one is greater or less than the other.
Consider this Python code sorting a list of strings by length of the string:
>>> a = house', 'car', 'bike'>>> a.sort(key=lambda x: len(x))
>>> a
car', 'bike', 'house'
The anonymous function in this example is the lambda expression:
lambda x: len(x)
The anonymous function accepts one argument,
x
, and returns the length of its argument, which is then used by the
sort()
method as the criteria for sorting.
Basic syntax of a lambda function in Python is
lambda arg1, arg2, arg3, ...:
The expression returned by the lambda function can be assigned to a variable and used in the code at multiple places.
>>> add = lambda a: a + a
>>> add(20)
40
Another example would be sorting items in a list by the name of their class (in Python, everything has a class):
>>> a = 0, 'number', 11.2>>> a.sort(key=lambda x: x.__class__.__name__)
>>> a
1.2, 10, 'number' 1. is the ordinal form of the number one in a number of European languages.
1. may also refer to:
Association football Austria
* 1. FC Vöcklabruck, a defunct Austrian association football club
Czech Republic
* 1. FC Karlovy Vary, a Czech asso ...
Note that
11.2
has class name "
float
",
10
has class name "
int
", and
'number'
has class name "
str
". The sorted order is "
float
", "
int
", then "
str
".
Closures
Closures are functions evaluated in an environment containing
bound variables. The following example binds the variable "threshold" in an anonymous function that compares the input to the threshold.
def comp(threshold):
return lambda x: x < threshold
This can be used as a sort of generator of comparison functions:
>>> func_a = comp(10)
>>> func_b = comp(20)
>>> print(func_a(5), func_a(8), func_a(13), func_a(21))
True True False False
>>> print(func_b(5), func_b(8), func_b(13), func_b(21))
True True True False
It would be impractical to create a function for every possible comparison function and may be too inconvenient to keep the threshold around for further use. Regardless of the reason why a closure is used, the anonymous function is the entity that contains the functionality that does the comparing.
Currying
Currying is the process of changing a function so that rather than taking multiple inputs, it takes a single input and returns a function which accepts the second input, and so forth. In this example, a function that performs
division by any integer is transformed into one that performs division by a set integer.
>>> def divide(x, y):
... return x / y
>>> def divisor(d):
... return lambda x: divide(x, d)
>>> half = divisor(2)
>>> third = divisor(3)
>>> print(half(32), third(32))
16.0 10.666666666666666
>>> print(half(40), third(40))
20.0 13.333333333333334
While the use of anonymous functions is perhaps not common with currying, it still can be used. In the above example, the function divisor generates functions with a specified divisor. The functions half and third curry the divide function with a fixed divisor.
The divisor function also forms a closure by binding the variable
d
.
Higher-order functions
A
higher-order function is a function that takes a function as an argument. This is commonly used to customize the behavior of a generically defined function, often a looping construct or recursion scheme. Anonymous functions are a convenient way to specify such function arguments. The following examples are in Python 3.
Map
The map function performs a function call on each element of a list. The following example
square
In Euclidean geometry, a square is a regular quadrilateral, which means that it has four equal sides and four equal angles (90-degree angles, π/2 radian angles, or right angles). It can also be defined as a rectangle with two equal-length a ...
s every element in an array with an anonymous function.
>>> a = , 2, 3, 4, 5, 6
The comma is a punctuation mark that appears in several variants in different languages. It has the same shape as an apostrophe or single closing quotation mark () in many typefaces, but it differs from them in being placed on the baseline ...
>>> list(map(lambda x: x*x, a))
, 4, 9, 16, 25, 36
The comma is a punctuation mark that appears in several variants in different languages. It has the same shape as an apostrophe or single closing quotation mark () in many typefaces, but it differs from them in being placed on the baseline o ...
The anonymous function accepts an argument and multiplies it by itself (squares it). The above form is discouraged by the creators of the language, who maintain that the form presented below has the same meaning and is more aligned with the philosophy of the language:
>>> a = , 2, 3, 4, 5, 6
The comma is a punctuation mark that appears in several variants in different languages. It has the same shape as an apostrophe or single closing quotation mark () in many typefaces, but it differs from them in being placed on the baseline ...
>>> *x for x in a, 4, 9, 16, 25, 36
The comma is a punctuation mark that appears in several variants in different languages. It has the same shape as an apostrophe or single closing quotation mark () in many typefaces, but it differs from them in being placed on the baseline o ...
Filter
The filter function returns all elements from a list that evaluate True when passed to a certain function.
>>> a = , 2, 3, 4, 5, 6
The comma is a punctuation mark that appears in several variants in different languages. It has the same shape as an apostrophe or single closing quotation mark () in many typefaces, but it differs from them in being placed on the baseline ...
>>> list(filter(lambda x: x % 2 0, a))
, 4, 6
The anonymous function checks if the argument passed to it is even. The same as with map, the form below is considered more appropriate:
>>> a = , 2, 3, 4, 5, 6
The comma is a punctuation mark that appears in several variants in different languages. It has the same shape as an apostrophe or single closing quotation mark () in many typefaces, but it differs from them in being placed on the baseline ...
>>> 0"> for x in a if x % 2 0 , 4, 6
Fold
A fold function runs over all elements in a structure (for lists usually left-to-right, a "left fold", called
reduce
in Python), accumulating a value as it goes. This can be used to combine all elements of a structure into one value, for example:
>>> from functools import reduce
>>> a = , 2, 3, 4, 5
The comma is a punctuation mark that appears in several variants in different languages. It has the same shape as an apostrophe or single closing quotation mark () in many typefaces, but it differs from them in being placed on the baseline o ...
>>> reduce(lambda x,y: x*y, a)
120
This performs
:
The anonymous function here is the multiplication of the two arguments.
The result of a fold need not be one value. Instead, both map and filter can be created using fold. In map, the value that is accumulated is a new list, containing the results of applying a function to each element of the original list. In filter, the value that is accumulated is a new list containing only those elements that match the given condition.
List of languages
The following is a list of
programming language
A programming language is a system of notation for writing computer programs. Most programming languages are text-based formal languages, but they may also be graphical. They are a kind of computer language.
The description of a programming l ...
s that support unnamed anonymous functions fully, or partly as some variant, or not at all.
This table shows some general trends. First, the languages that do not support anonymous functions (
C,
Pascal,
Object Pascal) are all statically typed languages. However, statically typed languages can support anonymous functions. For example, the
ML languages are statically typed and fundamentally include anonymous functions, and
Delphi
Delphi (; ), in legend previously called Pytho (Πυθώ), in ancient times was a sacred precinct that served as the seat of Pythia, the major oracle who was consulted about important decisions throughout the ancient classical world. The oracl ...
, a dialect of
Object Pascal, has been extended to support anonymous functions, as has
C++ (by the
C++11
C++11 is a version of the ISO/ IEC 14882 standard for the C++ programming language. C++11 replaced the prior version of the C++ standard, called C++03, and was later replaced by C++14. The name foll