About Christopher Trudeau
Christopher Trudeau - Author, Course Creator, Podcast Co-host
Fractional CTO · contributor to Real Python since 2020
Christopher has a passion for the Python language and writes, records, and podcasts for Real Python. He is a consultant with an M.Sc in Computer Engineering and the author of Django In Action. He helps advise organizations on how to improve their technical teams. Christopher is a strong advocate for automation throughout the delivery process and the power of small teams with well defined goals.
Tutorials by Christopher:
Courses by Christopher:
- Thread Safety in Python: Locks and Other Techniques
- What Can You Do With Python?
- Working With Python Polars
- NumPy Techniques and Practical Examples
- Building Dictionary Comprehensions in Python
- Building HTTP APIs With Django REST Framework
- Programming Sockets in Python
- Documenting Python Projects With Sphinx and Read the Docs
- Understanding Python's Global Interpreter Lock (GIL)
- What's New in Python 3.13
- Advanced Python import Techniques
- When to Use .__repr__() vs .__str__() in Python
- Using Astropy for Astronomy With Python
- Exploring Astrophysics in Python With pandas and Matplotlib
- pandas GroupBy: Grouping Real World Data in Python
- Rounding Numbers in Python
- Efficient Iterations With Python Iterators and Iterables
- Flattening a List of Lists in Python
- Using raise for Effective Exceptions
- SQLite and SQLAlchemy in Python: Move Your Data Beyond Flat Files
- Create Conway's Game of Life With Python
- What's New in Python 3.12
- Design and Guidance: Object-Oriented Programming in Python
- Inheritance and Internals: Object-Oriented Programming in Python
- Class Concepts: Object-Oriented Programming in Python
- Jinja Templating
- Recursion in Python
- Metaclasses in Python
- Publishing Python Packages to PyPI
- YAML: Python's Missing Battery
- Writing Clean, Pythonic Code With namedtuple
- Context Managers and Using Python's with Statement
- Cool New Features in Python 3.11
- Sneaky REST APIs With Django Ninja
- Building Command Line Interfaces With argparse
- Caching in Python With lru_cache
- Python mmap: Doing File I/O With Memory Mapping
- Testing Your Code With pytest
- Using Python's datetime Module
- Counting With Python's Counter
- Python's len() Function
- Working With Pipenv
- Binary, Bytes, and Bitwise Operators in Python
- Using Pygame to Build an Asteroids Game in Python
- Cool New Features in Python 3.10
- Rock, Paper, Scissors With Python: A Command Line Game
- The Square Root Function in Python
- Python Inner Functions
- Python vs JavaScript for Python Developers
- Stacks and Queues: Selecting the Ideal Data Structure
- Records and Sets: Selecting the Ideal Data Structure
- Dictionaries and Arrays: Selecting the Ideal Data Structure
- Python Modulo: Using the % Operator
- Evaluate Expressions Dynamically With Python eval()
- Speed Up Python With Concurrency
- Regular Expressions and Building Regexes in Python
- Cool New Features in Python 3.9
- Exploring HTTPS and Cryptography in Python
- Django Redirects
- Unicode in Python: Working With Character Encodings
- The Python print() Function: Go Beyond the Basics
- Structuring a Python Application
- Supercharge Your Classes With Python super()
Tutorials Contributed to by Christopher:
Courses Contributed to by Christopher:
Podcast Episodes Featuring Christopher:
- The Real Python Podcast – Episode #253: Starting With Marimo Notebooks & Python App Config Management
- The Real Python Podcast – Episode #251: Python Thread Safety & Managing Projects With uv
- The Real Python Podcast – Episode #250: DjangoCon Europe 2025: Live Recording From Dublin
- The Real Python Podcast – Episode #247: Exploring DuckDB & Comparing Python Expressions vs Statements
- The Real Python Podcast – Episode #245: GUIs & TUIs: Choosing a User Interface for Your Python Project
- The Real Python Podcast – Episode #243: Manage Projects With pyproject.toml & Explore Polars LazyFrames
- The Real Python Podcast – Episode #241: Deciphering Python Jargon & Compiling Python 1.0
- The Real Python Podcast – Episode #239: Behavior-Driven vs Test-Driven Development & Using Regex in Python
- The Real Python Podcast – Episode #237: Testing Your Python Code Base: Unit vs. Integration
- The Real Python Podcast – Episode #235: Principles for Considering Your Python Tooling
- The Real Python Podcast – Episode #233: PyCoder's Weekly 2024 Top Articles & Missing Gems
- The Real Python Podcast – Episode #231: Good Python Programming Practices When New to the Language
- The Real Python Podcast – Episode #229: The Joy of Tinkering & Python Free-Threading Performance
- The Real Python Podcast – Episode #227: New PEPs: Template Strings & External Wheel Hosting
- The Real Python Podcast – Episode #225: Python Getting Faster and Leaner & Ideas for Django Projects
- The Real Python Podcast – Episode #223: Exploring the New Features of Python 3.13
- The Real Python Podcast – Episode #222: Using Virtual Environments in Docker & Comparing Python Dev Tools
- The Real Python Podcast – Episode #220: Configuring Git Pre-Commit Hooks & Estimating Software Projects
- The Real Python Podcast – Episode #219: Astrophysics and Astronomy With Python & PyCon Africa 2024
- The Real Python Podcast – Episode #217: Packaging Data Analyses & Using pandas GroupBy
- The Real Python Podcast – Episode #215: Using GraphQL in Django With Strawberry & Prototype Purgatory
- The Real Python Podcast – Episode #213: Constraint Programming & Exploring Python's Built-in Functions
- The Real Python Podcast – Episode #211: Python Doesn't Round Numbers the Way You Might Think
- The Real Python Podcast – Episode #209: Python's Command-Line Utilities & Music Information Retrieval Tools
- The Real Python Podcast – Episode #207: Decomposing Software Problems & Avoiding the Trap of Clever Code
- The Real Python Podcast – Episode #206: Building Python Unit Tests & Exploring a Data Visualization Gallery
- The Real Python Podcast – Episode #204: Querying OpenStreetMaps via API & Lazy Evaluation in Python
- The Real Python Podcast – Episode #202: Pydantic Data Validation & Python Web Security Practices
- The Real Python Podcast – Episode #200: Avoiding Error Culture and Getting Help Inside Python
- The Real Python Podcast – Episode #198: Build a Video Game With Python Turtle & Visualize Data in Seaborn
- The Real Python Podcast – Episode #196: Exploring Duck Typing in Python & Dynamics of Monkey Patching
- The Real Python Podcast – Episode #194: Automate Tasks With Python & Building a Small Search Engine
- The Real Python Podcast – Episode #192: Practical Python Decorator Uses & Avoiding datetime Pitfalls
- The Real Python Podcast – Episode #189: Building a Python Debugger & Preparing for NumPy 2.0
- The Real Python Podcast – Episode #187: Serializing Data With Python & Underscore Naming Conventions
- The Real Python Podcast – Episode #184: PyCoder's Weekly 2023 Wrap Up
- The Real Python Podcast – Episode #182: Building a Python JSON Parser & Discussing Ideas for PEPs
- The Real Python Podcast – Episode #180: Studying Python Software Architecture & Creating Lambda Expressions
- The Real Python Podcast – Episode #178: Guiding Scientific Python Library Development
- The Real Python Podcast – Episode #176: Building Python Best Practices and Fundamental Skills
- The Real Python Podcast – Episode #175: Exploring the New Features of Python 3.12
- The Real Python Podcast – Episode #173: Getting Involved in Open Source & Generating QR Codes With Python
- The Real Python Podcast – Episode #171: Making Each Line of Code Efficient & Python In Excel
- The Real Python Podcast – Episode #168: Common Python Stumbling Blocks & Quirky Behaviors
- The Real Python Podcast – Episode #166: Differentiating the Versions of Python & Unlocking IPython's Magic
- The Real Python Podcast – Episode #164: Constructing Python Library APIs & Tackling Jinja Templating
- The Real Python Podcast – Episode #162: Exploring the Zen of Python & pandas Features for Finance
- The Real Python Podcast – Episode #160: Inheriting a Large Python Code Base & Building a GUI With Kivy
- The Real Python Podcast – Episode #158: Building Python CI With Docker & Applying for a Hacker Initiative Grant
- The Real Python Podcast – Episode #157: Discussing Mojo & Improving Python Object-Oriented Programming
- The Real Python Podcast – Episode #155: Checking Project Dependencies & Python Dev Resource Collections
- The Real Python Podcast – Episode #153: Seeking Faster Text Processing & Python's .__repr__() vs .__str__()
- The Real Python Podcast – Episode #151: Evaluating Python Packages & Celebrating 20 Years of PyCon US
- The Real Python Podcast – Episode #149: Coding With namedtuple & Python's Dynamic Superpowers
- The Real Python Podcast – Episode #147: Django Deployment Strategies & Preparing for PyCascades 2023
- The Real Python Podcast – Episode #145: Creating a Python Wordle Clone & Testing Environments With Nox
- The Real Python Podcast – Episode #143: Create Interactive Maps & Geospatial Data Visualizations With Python
- The Real Python Podcast – Episode #141: Exploring Python With bpython & Formalizing f-String Grammar
- The Real Python Podcast – Episode #139: Surveying Comprehension Constructs & Python Parallelism Infighting
- The Real Python Podcast – Episode #136: Package Python Code With pyproject.toml & Listing Files With pathlib
- The Real Python Podcast – Episode #134: Building Python REST APIs With Flask & Structuring Pull Requests
- The Real Python Podcast – Episode #132: Creating Tic-Tac-Toe With an AI Player & Shortcuts for Python Decorators
- The Real Python Podcast – Episode #131: Exploring the New Features of Python 3.11
- The Real Python Podcast – Episode #129: Using an Ellipsis in Python & Goals for CPython 3.12
- The Real Python Podcast – Episode #127: Explaining Access Control Using Python & Cautiously Handling Pickles
- The Real Python Podcast – Episode #125: Improve Matplotlib With Style Sheets & Python Async for the Web
- The Real Python Podcast – Episode #122: Configuring a Coding Environment on Windows & Using TOML With Python
- The Real Python Podcast – Episode #118: Creating Documentation With MkDocs & When to Use a Python dict
- The Real Python Podcast – Episode #115: Digging Into PyScript & Preventing or Handling Python Errors
- The Real Python Podcast – Episode #113: Build Streamlit Data Science Dashboards & Verbose Regex f-Strings
- The Real Python Podcast – Episode #111: Questions for New Dependencies & Comparing Python Game Libraries
- The Real Python Podcast – Episode #109: Start Testing Your Python with doctest & Pagination in Django
- The Real Python Podcast – Episode #108: Run Python in a Browser With Pyodide & The Power of f-Strings
- The Real Python Podcast – Episode #106: Class Constructors & Pythonic Image Processing
- The Real Python Podcast – Episode #104: Building a Hash Table in Python and Thoughtful REST API Design
- The Real Python Podcast – Episode #102: Making Your Notebook Interactive and Using Python's Assert
- The Real Python Podcast – Episode #100: Defining Optional Arguments and Moving Beyond "Beginner" Python
- The Real Python Podcast – Episode #98: Drawing Fractals With Python and Working With a Weather API
- The Real Python Podcast – Episode #85: Exploring Django Templates, Tags, and Filters
- The Real Python Podcast – Episode #81: Exploring the New Features of Python 3.10
- The Real Python Podcast – Episode #30: Exploring the New Features of Python 3.9