Journeys

Python learning journeys

These paths compose individual examples into larger mental maps. They are inspired by the way Apprenticeship Patterns treats small patterns as material for longer learning journeys.

Journey

Runtime

This journey builds the smallest coherent model of Python at runtime: programs run statements, names refer to objects, objects have types, and operations ask those objects to do work.

  • Start with executable evidence.
  • Separate value, identity, and absence.
  • Read expressions as object operations.

Journey

Control Flow

This journey follows how a Python program chooses which path runs, names facts at decision points, and exits early when the remaining work no longer applies.

  • Choose between paths.
  • Name and shape decisions.
  • Stop as soon as the answer is known.

Journey

Iteration

This journey follows repeated work from ordinary loops to the iterator protocol: consume values, stop deliberately, and produce lazy streams only when they help.

  • Choose the right loop shape.
  • See the protocol behind `for`.
  • Compose lazy value streams.

Journey

Shapes

This journey teaches the core Python habit of choosing a data shape, transforming it directly, and making the result visible.

  • Pick the container that matches the question.
  • Move between shapes deliberately.
  • Cross text and data boundaries.

Journey

Interfaces

This journey shows how Python grows from simple functions to callable APIs, object interfaces, protocols, and metaclasses.

  • Start with functions as named behavior.
  • Use functions as values.
  • Bundle behavior with state.

Journey

Types

This journey maps Python's runtime object model to optional static annotations so learners know what types can and cannot promise.

  • Keep runtime and static analysis separate.
  • Describe realistic data shapes.
  • Scale annotations for reusable libraries.

Journey

Reliability

This journey follows the boundaries where programs fail, clean up, split into modules, communicate with the outside world, and run concurrent work.

  • Make failure explicit.
  • Control resource and module boundaries.
  • Handle operations that outlive one expression.