intermediate

Functions & Scope

7 min readLast updated: 2026-07-12

Overview

Functions let you bundle blocks of reusable code under a descriptive name, keeping your code organized.

Learning Objectives

  • Create functions using def, parameters, and return statements.
  • Understand the scope rules that determine where variables can be accessed.
  • Use arguments like *args and **kwargs to accept dynamic values.

Concept Explanation

Create functions using def. Variables created inside a function are local to it; they cannot be accessed outside. Python uses the LEGB (Local, Enclosing, Global, Built-in) rule to search for variables. Avoid using mutable default values (like lists) as they share state across calls.

Code Examples

Example 1 — Basics

This example introduces the fundamental syntax and concepts.

python
def greet(name):
    return f'Hello, {name}!'

print(greet('Alice'))

Example 2 — Everyday Usage

This example demonstrates a realistic scenario handling business parameters.

python
# Calculate tax with safe default parameters
def calculate_total(price, tax_rate=0.05):
    return price * (1 + tax_rate)

print(calculate_total(100))

Example 3 — Advanced Example

This example shows clean, production-grade code structure following senior development standards.

python
# Create user configs profile dictionary dynamically
def build_profile(username, *hobbies, **details):
    profile = {'username': username, 'hobbies': list(hobbies)}
    profile.update(details)
    return profile

print(build_profile('alex', 'reading', 'cycling', email='alex@corp.com'))

Visual Flow

The following execution flow represents the step-by-step evaluation inside the interpreter:

text
Call function name → Bind inputs parameters → Run function body statements → Return result value

Common Mistakes

Review these common pitfalls when working with this topic:

  • Using mutable values (like default empty lists lst=[]) as default arguments.
  • Modifying global variables inside functions without declaring them global.
  • Forgetting to write return statements, which causes the function to implicitly return None.
  • Confusing parameter order when invoking functions.

Best Practices

Enforce these Pythonic best practices in your codebase:

❌ Don't
python
def append_item(val, lst=[]):
    lst.append(val)
    return lst # Shared state default list
✅ Do
python
def append_item(val, lst=None):
    if lst is None:
        lst = []
    lst.append(val)
    return lst # Safe initialization

Quick Revision

Use these key summaries for last-minute revision:

  • def declares reusable functions.
  • return sends values back to callers.
  • Local variables are only visible inside their function.
  • LEGB rule determines variable lookups.
  • Never use mutable default arguments.
  • *args captures extra positional arguments.