Skip to the content.

Author: Amin Boulouma, Software Engineer Github source code: https://github.com/aminblm/ai_systems_design_from_scratch Engineering Blog: https://aminblm.github.io/ai_systems_design_from_scratch/blog/

5 Reasons Your Lambda Functions Are Harming Your Codebase (And How to Fix Them)

In the pursuit of “Pythonic” code, developers often encounter scenarios where defining a full-blown function using def feels like overkill. When you need a simple, single-expression function—perhaps as an argument to a higher-order function like map() or filter()lambda functions are the standard tool.


The Core Concept

A lambda function is a small, anonymous function defined without a name. Unlike standard functions, they are restricted to a single expression. They are essential for writing concise, functional code, but they are frequently misused. Understanding when to use them versus when to revert to a standard named function is the hallmark of a Senior Engineer.

Glossary for Beginners


Why We Choose Lambda Functions Over Named Functions

We choose lambdas when the logic is ephemeral. If the function logic is used in exactly one place and is readable in one line, a lambda avoids the overhead of polluting the namespace with a name that is only used once.

Why X over Y? We choose lambda for localized transformations over defining def blocks to keep business logic tight. However, we explicitly avoid lambdas for complex logic to prevent “write-only” code that teammates cannot debug.


Implementation: The Lambda Pattern

Simple Example: Inline Filtering

# Filtering a list of numbers
data = [1, 5, 8, 12, 15]

# Using lambda for concise filtering
evens = list(filter(lambda x: x % 2 == 0, data))
print(evens)  # Output: [8, 12]

Complex Example: Sorting with Custom Key Logic

In production, we often sort complex objects. Lambdas provide an elegant way to define custom sorting keys dynamically.

from typing import List, Dict, Any

# A list of user dictionaries
users: List[Dict[str, Any]] = [
    {"name": "Alice", "score": 88},
    {"name": "Bob", "score": 95},
    {"name": "Charlie", "score": 70}
]

# Using lambda to sort by multiple criteria: 
# primary score descending (-x['score']), secondary name ascending
sorted_users = sorted(users, key=lambda x: (-x["score"], x["name"]))

print(sorted_users)
# Output: [{'name': 'Bob', 'score': 95}, {'name': 'Alice', 'score': 88}, {'name': 'Charlie', 'score': 70}]

Quick Reference: Lambda Usage Strategy

Scenario Recommendation Why?
Simple transformation Use Lambda Keeps code clean and localized.
Reused logic Use def Promotes DRY (Don’t Repeat Yourself) principle.
Complex expressions Use def Improves readability and debuggability.
Debugging requirement Use def Named functions appear in stack traces.

Developer Checklist

TL;DR Summary

Lambda functions are your go-to for one-off logic. Use them to keep your code expressive and functional, but never sacrifice maintainability for brevity. If you find yourself assigning a lambda to a variable (e.g., f = lambda x: x + 1), just use def f(x): return x + 1 instead.