Lambdas vs. closures
Anonymous functions are functions that are not bound to a name. In Python, they are called lambdas. In Rust, they are called closures. Both are useful for short,one-off functions that are not used anywhere else.
Python
Recall from the first example that we defined a
Person class with a name and an age attribute.
In the following example, we use the sorted function to sort a list of Person objects by their
age.
def run5() -> None:
persons = [Person("Aiko", 41), Person("Rohan", 18)]
sorted_by_age = sorted(persons, key=lambda person: person.age)
youngest_person = sorted_by_age[0]
print(f"{youngest_person.name} is the youngest person at {youngest_person.age} years old")
The sorted function takes an optional key argument, which is a function that is called on each
item in the list to determine the value to sort by. In this case, we use a lambda to return the
age attribute of each Person object.
Rohan is the youngest person at 18 years old
Rust
Recall from the first example that we defined a Person
struct with a name and an age attribute, in a similar way to the Python example.
In the following example, we use the sort_by_key method to sort a vector of Person objects by
their age.
fn run5() {
let mut persons = vec![Person::new("Aiko", 41), Person::new("Rohan", 18)];
// Sort by age
persons.sort_by_key(|p| p.age);
let youngest_person = persons.first().unwrap();
println!(
"{} is the youngest person at {} years old",
youngest_person.name, youngest_person.age
);
The sort_by_key method takes a closure that is called on each item in the vector to determine the
value to sort by. In this case, we use a closure operator || to return the age attribute of each
Person object.
Rohan is the youngest person at 18 years old
Takeaways
- Lambdas and closures are anonymous functions that are not bound to a name, or are passed as arguments to other functions.
- Lambdas and closures are useful for short, one-off functions that are not used anywhere else.
- Closures are more powerful than lambdas because they define higher-order functions that can capture their environment - this is out of scope for this book, but you can read more about it here.