Lesson 9 · Generalization

One Tool, Infinite Uses: The Swiss Army Knife of Code

What You'll Learn

How to build functions that adapt to different situations — so one tool can handle many jobs, just like a Swiss Army knife.

Specific vs. General

In Lesson 8, we built functions like enthusiastic_reply() and sarcastic_reply(). Each one did one specific thing. That's useful — but what if you could build one function that handles all response styles?

Think about a real Swiss Army knife. Instead of carrying a separate knife, screwdriver, bottle opener, and scissors, you carry one tool that adapts based on what you need. That's generalization — creating solutions that work across many situations.

You already do this in life. When someone asks "how do I get to the store?" you don't have a memorized script for every possible store. You have a general skill — giving directions — that works for any destination. You adapt the details (left on Queens Boulevard, right on Austin Street) but the process is always the same.

Today, we're going to make our functions general-purpose — one tool, infinite uses.

Parameters With Backup Plans

Sometimes you want a function to work even if the user doesn't provide every detail. That's what default parameters do — they give a parameter a backup value:

Python · Default Parameters

How Default Parameters Work

def make_bar(value, max_value, width=20): — the =20 means "if nobody provides a width, use 20."

make_bar(7, 10) — we didn't give a width, so Python uses the default: 20.

make_bar(7, 10, 30) — we gave a width, so Python uses 30 instead of the default.

Default parameters must come after required parameters. You can't have def f(a=1, b): — Python wouldn't know which argument is which.

One Function, Many Behaviors

In Lesson 8, we had separate functions for each response style. Let's generalize — one function that takes the style as a parameter:

Python

Why This Is Better

In Lesson 8, we had five separate functions. Now we have one function that handles all five styles.

Adding a new style? Just add another elif. No new function needed.

The default style="friendly" means you don't even have to specify a style if you just want the basic version. The function adapts to what you give it.

Adding Levels of Intensity

Let's take generalization further. What if a function could adjust how intense its output is? Think about how you adjust your communication based on the situation — you roast your best friend harder than someone you just met.

Python · Intensity Levels

Same function, same friend, but the intensity dial changes the output dramatically. This is generalization — one tool that adapts.

The Friendly Roast Generator

Now let's build the fun part — a roast generator that adjusts based on the target's name, their quirk, and how hard you want to go:

Python · Roast Generator

Try changing the name and quirk. "Sam" who "eats cereal for dinner." "Zoe" who "takes 200 selfies before posting one." The same function handles any combination.

Generalize Even Further: Mode Switch

What if the same function could do both roasts AND compliments? We just add another parameter — a mode:

Python · Roast + Compliment

The Power of Parameters

We now have one function that handles: 2 modes × 3 levels = 6 different behaviors, each with multiple random options.

The function signature tells us everything: generate(name, trait, mode, level) — give it a person, a trait, whether to roast or compliment, and how intense.

This is the heart of generalization: what changes? Those things become parameters. What stays the same? That's the function body.

Building a Toolkit

Good programmers build a toolkit of general-purpose functions they can reuse in any project. Let's build some:

Python · General Toolkit

New Thing · Docstrings

The text in triple quotes """...""" right after def is called a docstring. It describes what the function does. Python ignores it when running the code, but it helps anyone reading your code understand the function's purpose.

Notice how bar() and header() have default parameters for everything except the essential values. You can customize them, but you don't have to. That's the Swiss Army knife principle — works out of the box, but adapts when you need it.

The Complete Roast & Compliment Generator

Python · The Complete Generator

Try mode "3" (both) and intensity "4" (all levels) to see the full range. Same friend, same trait — six completely different outputs, all from one function.

What You Just Did

You learned to build functions that aren't locked into one specific behavior. By adding parameters — mode, intensity level, style — a single function can handle many different situations.

That's generalization.

This is one of the most important ideas in all of thinking: instead of creating a separate solution for every situation, ask "What changes between situations?" Make those things the inputs, and keep everything else the same.

It's how one recipe becomes infinite meals (change the protein, change the spice, change the sauce). It's how one formula in math works for any number. It's how one app serves millions of different users.

The Big Idea

When you build a solution, ask: "What if the inputs were different? Would this still work?" If not, figure out what would need to change and make those things parameters. The most powerful tools are the ones that adapt to any situation.

Thinking Questions

  1. What's the difference between a specific solution ("make Lena a birthday card") and a general solution ("make anyone a birthday card given their name and age")?
  2. When is it better to have a specific function versus a general one? (Hint: sometimes simpler is better.)
  3. Can you think of a real-world tool that's "general purpose"? What makes it adaptable?

Level Up

Challenge 1 · Universal Greeting

Create a greet(name, language="english", formality="casual") function that generates greetings in different languages (English, Spanish, French) at different formality levels (casual, polite, formal). One function, many combinations.

Challenge 2 · Story Generator

Build a tell_story(hero, villain, setting, genre="adventure") function that creates a short 3-sentence story. Different genres (adventure, mystery, comedy, sci-fi) should produce different styles. Use default parameters so it works even with just a hero name.

Challenge 3 · Smart Display

Create a display(data, style="simple") function that takes a list of items and displays them in different formats: "simple" (numbered list), "fancy" (with borders and decorations), "compact" (all on one line separated by |). One function, three visual styles.

What You Learned

Thinking Skill

Generalization — building solutions that work across many situations by identifying what changes (make it a parameter) and what stays the same (keep it in the function body). Ask: "How can this work for any input?"

Python Concepts

Default parametersdef f(x, y=10): — backup values when no argument is given

Multiple parameters for behavior — using parameters like mode and level to change what a function does

Docstrings"""Description""" right after def

General-purpose toolkit — building reusable functions with sensible defaults

.get() on dictionaries — d.get(key, fallback) returns the fallback if the key doesn't exist

Lessons 1–9

Decomposition — break big problems into small steps

Abstraction — decide what details matter

Deductive Reasoning — rules + facts = conclusions

Categorization — organize items into groups

Pattern Recognition — spot what repeats and changes

Automation — templates for repetitive tasks

Inductive Reasoning — observations → conclusions

Encapsulation — package complexity into functions

Generalization — build solutions that adapt to any input