47-Session Curriculum
Sessions must be completed in order. Each layer unlocks only after the previous layer's final quiz scores ≥ 80%. A session is not complete until the commit is made and reviewed. Every session builds the same running project: the Country Explorer.
A true starting point for anyone new to programming: running code, naming values, branching, and repeating. Every later session assumes these are second nature.
| # | Title | Core Concept | Project Milestone | Status |
|---|---|---|---|---|
| 01 | Hello, World & Variables | Running Code, Variables, and Types | A file called hello.py. | Available |
| 02 | Operators, Strings & Type Conversion | Operators, Strings, and Explicit Conversion | A file called operators.py. | Available |
| 03 | Conditionals | Branching with if / elif / else | A file called conditionals.py. | Available |
| 04 | Loops (Layer gate) | Repeating Actions with for and while | A file called loops.py. | Gate |
Before we build anything, we must be fluent in the core data structures and control flow that every later session relies on: dictionaries, lists, functions, and error handling.
| # | Title | Core Concept | Project Milestone | Status |
|---|---|---|---|---|
| 05 | Dictionaries | Python Dictionaries | A file called country.py that demonstrates every dictionary concept from this session. Nothing more. | Available |
| 06 | Lists and Iteration | Python Lists and Iteration | A file called countries.py that builds on Session 05's single dictionary. | Available |
| 07 | List Comprehensions | List Comprehensions | A file called filters.py operating on the country list from Session 06. | Available |
| 08 | Functions and Lambda | Functions and Lambda | A file called functions_lab.py. | Available |
| 09 | Unpacking and *args/**kwargs | Unpacking and *args / **kwargs | A file called unpacking_lab.py. | Available |
| 10 | Modules and Imports | Modules and Imports | Two files: country_data.py (the module) and explorer.py (imports and uses it). | Available |
| 11 | Errors and Exceptions (Layer gate) | Errors and Exceptions | A file called errors_lab.py. | Gate |
We start modelling real things as classes. Every concept here maps to something in Layer 1 — a class is just a structured way of grouping the dictionaries and functions you already know.
| # | Title | Core Concept | Project Milestone | Status |
|---|---|---|---|---|
| 12 | What Classes Are and Why | Why Classes Exist | A file called country_class.py. | Available |
| 13 | Class Anatomy — __init__ and Attributes | __init__ and Instance Attributes | A file called country_init.py. | Available |
| 14 | Instance Methods | Instance Methods | A file called country_methods.py. | Available |
| 15 | Passing Data via the Constructor | Constructor Arguments as an Explicit Contract | A file called construction_lab.py. | Available |
| 16 | Composition — Objects Containing Objects | Composition | A file called explorer_composed.py. | Available |
| 17 | Conditional Logic in Methods | Conditional Logic in Methods | A file called conditional_lab.py, building on Session 16's CountryExplorer. | Available |
| 18 | Building Lists of Objects | Building Object Lists from Raw Data | A file called build_list_lab.py. | Available |
| 19 | Object Identity and Equality (Layer gate) | Identity vs Equality | A file called identity_lab.py. | Gate |
State is data that changes over time. We learn to track it safely on objects, take input from a user, and compute values instead of duplicating them.
| # | Title | Core Concept | Project Milestone | Status |
|---|---|---|---|---|
| 20 | What Is State in a Program? | State | A file called state_concept.py — mostly comments and small demonstrations, not new functionality. | Available |
| 21 | Updating State via Methods | Controlled State Updates | A file called controlled_state.py. | Available |
| 22 | Handling User Input | Reading and Validating User Input | A file called input_lab.py. | Available |
| 23 | Tracing State Changes | Tracing State Changes | A file called tracing_lab.py. | Available |
| 24 | Validating Input | Thorough Input Validation | Two files: validators.py and an updated menu.py. | Available |
| 25 | Passing State Between Functions | State Ownership Between Functions | A file called state_passing_lab.py. | Available |
| 26 | Computed Properties (Layer gate) | Computed Properties | A file called computed_lab.py. | Gate |
Real teams build against fake data before a real data source exists. We design data contracts and a data-access layer independent of where the data actually comes from.
| # | Title | Core Concept | Project Milestone | Status |
|---|---|---|---|---|
| 27 | Why Mock Data Matters | Why Mock Data Matters | A file called mock_countries.py and a small script that uses it. | Available |
| 28 | Building a Data Access Layer | A Data Access Layer | A file called repository_lab.py. | Available |
| 29 | Working with JSON Files | Reading and Writing JSON | A file called json_lab.py, plus a generated countries.json. | Available |
| 30 | Designing Data Contracts (Layer gate) | Data Contracts with Type Hints and Dataclasses | A file called contracts_lab.py. | Gate |
Testing is introduced gradually alongside the code it tests, using pytest. We test behavior — what a function or class does — not implementation details.
| # | Title | Core Concept | Project Milestone | Status |
|---|---|---|---|---|
| 31 | Why We Test and What to Test | Why We Test | A file called manual_tests.py — using bare assert statements, the same tool pytest builds on. | Available |
| 32 | Setting Up pytest | pytest Fundamentals | A file called country.py (the real module) and tests/test_country.py. | Available |
| 33 | Testing Functions and Return Values | Testing Return Values Systematically | A file called tests/test_return_values.py, building on Session 32's country.py. | Available |
| 34 | Testing Classes and State Changes | Testing State Changes | Extends country.py and adds tests/test_state_changes.py. | Available |
| 35 | Testing the Data Layer with Mocks (Layer gate) | Testing the Data Layer in Isolation | A file called tests/test_repository.py, extending country.py with CountryRepository and validate_country_record if not already present. | Gate |
With the foundations in place, we learn to structure a Python project for long-term maintainability: package layout, reusable modules, and recognizing tight coupling.
| # | Title | Core Concept | Project Milestone | Status |
|---|---|---|---|---|
| 36 | Package and Folder Organization | Modules vs Packages | A new package directory country_explorer/ replacing the flat country.py. | Available |
| 37 | Reusable Functions and Modules | Extracting Reusable Logic | A new module country_explorer/formatting.py plus tests/test_formatting.py. | Available |
| 38 | Building Utility Modules | Utility Modules | A new module country_explorer/search.py plus tests/test_search.py. | Available |
| 39 | The Prop Drilling Problem | Experiencing the Prop Drilling Problem | A file called prop_drilling_lab.py. | Available |
| 40 | Architecture Review (Layer gate) | Conducting an Architecture Review | A file called ARCHITECTURE.md at the project root. | Gate |
Only now do we touch the filesystem and a real network API. By this point we have the vocabulary to understand exactly what changed and why it matters.
| # | Title | Core Concept | Project Milestone | Status |
|---|---|---|---|---|
| 41 | File I/O Deep Dive | Robust File Handling | A file called file_io_lab.py, extending the country_explorer package. | Available |
| 42 | Calling a Real API with requests | Calling a Real API | A file called real_api_lab.py. | Available |
| 43 | Handling Errors and Edge Cases Gracefully | Robust Network Error Handling | A file called robust_loading_lab.py. | Available |
| 44 | Capstone Review (Layer gate) | The Complete Country Explorer — End to End | A final update to ARCHITECTURE.md, plus a verification pass across the whole project. | Gate |
Optional, bonus sessions beyond the core curriculum: decorators, generators and context managers, and packaging/virtual environments — closing the remaining gaps to a genuinely intermediate level.
| # | Title | Core Concept | Project Milestone | Status |
|---|---|---|---|---|
| 45 | Decorators | Decorators — the General Mechanism | A file called decorators_lab.py. | Available |
| 46 | Generators, Iterators & Context Managers | Iterators, Generators, and Context Managers | A file called generators_lab.py. | Available |
| 47 | Packaging & Virtual Environments (Layer gate) | Isolating and Sharing a Python Project | A virtual environment and a requirements.txt file. | Gate |
Dependency Ordering
Each row depends on everything above it. Nothing skips a level.
Basics: print/vars → Operators/Strings → Conditionals → Loops
↓
Dictionaries → Lists → Comprehensions → Functions/Lambda → Unpacking/*args
→ Modules/Imports → Errors/Exceptions
↓
Classes → Attributes → Methods → Constructors → Composition
→ Conditionals → Object Lists → Identity/Equality
↓
State → Controlled Updates → User Input → Tracing
→ Validation → State Passing → Computed Properties
↓
Mock Data → Data Layer → JSON Files → Data Contracts
↓
Testing → pytest → Return Values → State Tests → Data Layer Tests
↓
Packages → Reusable Modules → Utilities → Prop Drilling → Architecture Review
↓
File I/O → Real API → Robust Errors → Capstone
↓
(optional) Decorators → Generators/Context
Managers → Packaging/venv