Watch Now This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: How to Use Python Lambda Functions
Python and other languages like Java, C#, and even C++ have had lambda functions added to their syntax, whereas languages like LISP or the ML family of languages, Haskell, OCaml, and F#, use lambdas as a core concept.
Python lambdas are little, anonymous functions, subject to a more restrictive but more concise syntax than regular Python functions.
By the end of this article, you’ll know:
- How Python lambdas came to be
- How lambdas compare with regular function objects
- How to write lambda functions
- Which functions in the Python standard library leverage lambdas
- When to use or avoid Python lambda functions
Notes: You’ll see some code examples using lambda that seem to blatantly ignore Python style best practices. This is only intended to illustrate lambda calculus concepts or to highlight the capabilities of Python lambda.
Those questionable examples will be contrasted with better approaches or alternatives as you progress through the article.
This tutorial is mainly for intermediate to experienced Python programmers, but it is accessible to any curious minds with interest in programming and lambda calculus.
All the examples included in this tutorial have been tested with Python 3.7.
Take the Quiz: Test your knowledge with our interactive “Python Lambda Functions” quiz. Upon completion you will receive a score so you can track your learning progress over time:
Free Download: Get a sample chapter from Python Tricks: The Book that shows you Python’s best practices with simple examples you can apply instantly to write more beautiful + Pythonic code.
Lambda Calculus
Lambda expressions in Python and other programming languages have their roots in lambda calculus, a model of computation invented by Alonzo Church. You’ll uncover when lambda calculus was introduced and why it’s a fundamental concept that ended up in the Python ecosystem.
History
Alonzo Church formalized lambda calculus, a language based on pure abstraction, in the 1930s. Lambda functions are also referred to as lambda abstractions, a direct reference to the abstraction model of Alonzo Church’s original creation.
Lambda calculus can encode any computation. It is Turing complete, but contrary to the concept of a Turing machine, it is pure and does not keep any state.
Functional languages get their origin in mathematical logic and lambda calculus, while imperative programming languages embrace the state-based model of computation invented by Alan Turing. The two models of computation, lambda calculus and Turing machines, can be translated into each another. This equivalence is known as the Church-Turing hypothesis.
Functional languages directly inherit the lambda calculus philosophy, adopting a declarative approach of programming that emphasizes abstraction, data transformation, composition, and purity (no state and no side effects). Examples of functional languages include Haskell, Lisp, or Erlang.
By contrast, the Turing Machine led to imperative programming found in languages like Fortran, C, or Python.
The imperative style consists of programming with statements, driving the flow of the program step by step with detailed instructions. This approach promotes mutation and requires managing state.
The separation in both families presents some nuances, as some functional languages incorporate imperative features, like OCaml, while functional features have been permeating the imperative family of languages in particular with the introduction of lambda functions in Java, or Python.
Python is not inherently a functional language, but it adopted some functional concepts early on. In January 1994, map(), filter(), reduce(), and the lambda operator were added to the language.
First Example
Here are a few examples to give you an appetite for some Python code, functional style.
The identity function, a function that returns its argument, is expressed with a standard Python function definition using the keyword def as follows:
>>> def identity(x):
... return x
identity() takes an argument x and returns it upon invocation.
In contrast, if you use a Python lambda construction, you get the following:
>>> lambda x: x
In the example above, the expression is composed of:
- The keyword:
lambda - A bound variable:
x - A body:
x
Note: In the context of this article, a bound variable is an argument to a lambda function.
In contrast, a free variable is not bound and may be referenced in the body of the expression. A free variable can be a constant or a variable defined in the enclosing scope of the function.
You can write a slightly more elaborated example, a function that adds 1 to an argument, as follows:
>>> lambda x: x + 1