Real Python is a blog. zuzu.codes is a training program.
I've been reading Real Python articles for months. I sit down on weekends, work through a tutorial, understand it completely — then on Monday I try to write code and I can't. The knowledge doesn't stick.
When you're reading, are you typing the examples yourself, or mostly following along?
Mostly reading. Sometimes I copy the examples into a file to run them. But I'm following their code, not writing my own.
That's the core issue, and it's not your fault — it's the format. Reading code and writing code are completely different cognitive activities. When you follow a tutorial example, your brain does pattern matching: you recognise something correct in front of you. That recognition doesn't transfer to production. To build the skill that shows up on Monday morning, you need to generate code from a prompt, without a template. That's a different activity entirely.
Real Python articles are incredibly thorough. Some go unbelievably deep. Doesn't depth help?
For reference, yes — and Real Python is genuinely one of the best Python reference resources on the internet. "How does Python's garbage collector work?" "What's the difference between @staticmethod and @classmethod?" It's excellent for those questions. The problem is that reference reading and training are fundamentally different activities. You can deeply understand a tutorial and still not be able to produce the code.
So what's concretely different about a zuzu lesson versus a Real Python tutorial?
Real Python shows you correct code and explains it. zuzu ends every lesson with a blank function stub and a specification — you write the solution, click Run Tests, see what failed, debug, pass. No template. No hints. That act of producing the solution without a reference is what builds the mental model that survives closing the tab. The discomfort of staring at a blank function is the signal that real learning is happening.
I think I've been using reading as a substitute for practice because practice is harder and more uncomfortable.
That's a genuinely important insight, and most people never make it explicit. Reading feels productive — you're engaged, you understand what you're reading. It's pleasant. The discomfort of a blank file is where the actual skill builds. zuzu puts you there daily, in small doses, before you've had time to talk yourself out of it.
OK, I need the uncomfortable version of learning. I'll try the actual training program and see if it changes what I can do on Monday morning.
Keep Real Python bookmarked — it'll become significantly more useful as a reference once you have solid fundamentals. When a zuzu lesson sparks deeper curiosity, Real Python is where you go to go deeper. But for building hands-on skill and the daily habit, start with the lessons. The training program version is the one that works.
Real Python is one of the best Python resources on the internet. That needs to be said first and said plainly. The articles are thorough, accurate, well-written, and maintained. The team has built a genuine community resource. If you already know Python reasonably well and want deep reference material on specific topics — asyncio, metaclasses, descriptors, the import system, testing patterns — Real Python is the place to look.
zuzu.codes is a training program, not a reference resource. The comparison matters because many learners use Real Python as if it were a training program and wonder why their skills don't seem to be growing.
The most important thing to understand about tutorial-based learning — and this applies to Real Python, to YouTube coding videos, to most free content — is that it produces the feeling of understanding without necessarily building the skill.
When you read a Real Python tutorial on list comprehensions, you follow the examples, you nod at the explanation, you understand why the syntax works. That comprehension is real. But it's recognition, not production. The test of whether you've actually learned something is whether you can produce it — write it from scratch, starting from a blank file, with no reference to look at.
Most Real Python learners fail that test on the first try, even on concepts they just read about. That's not a character flaw. It's a predictable consequence of the format.
zuzu's challenges exist specifically to close that gap. Every lesson ends with a graded code challenge: a blank function stub, a specification, and automated tests. No hints, no template to copy from. You either produce the solution or you don't. That production practice is what transfers to the blank-file feeling on Monday morning.
| Use Case | Real Python | zuzu.codes |
|---|---|---|
| "How do I use asyncio?" | Excellent deep article | Not covered |
| "What's the difference between a class method and a static method?" | Excellent explanation | Covered in context during OOP track |
| "I want to build Python fluency over 30 days" | Not designed for this | Core purpose |
| "I need to practice writing code daily" | No challenges | Graded challenge every lesson |
| "I want accountability to stay consistent" | None | Streak, XP, module quizzes |
| "I want to look something up quickly" | Best-in-class | Not a reference resource |
These are genuinely different tools. The mistake is using a reference resource as a training program.
Real Python has no streak, no XP, no daily assignment, no signal that you "completed today." That's fine for a reference library — you don't need a streak to look something up. For daily training, those signals matter more than they might seem.
| Accountability Feature | Real Python | zuzu.codes |
|---|---|---|
| Daily lesson assignment | No — you choose | Yes — pre-assigned |
| Streak tracking | None | Daily streak with freeze protection |
| XP / progress | None | XP per lesson, module level |
| Quiz requirements | None | Module quiz required to unlock next |
| Did I complete today? | Unclear | Clear pass/fail per challenge |
The streak counter is not sophisticated gamification. But a 15-day streak turns out to be a surprisingly effective psychological lever. The small anxiety of potentially breaking it gets you to open the app on days when nothing else would. Real Python has no equivalent pull — it waits for you to arrive with motivation already assembled.
Being honest about this matters:
pathlib works, Real Python is the right resource. zuzu is not a reference.These platforms are genuinely complementary if you use them for their intended purpose:
Used in that combination, you get structured skill-building from zuzu and encyclopaedic depth from Real Python. Used as substitutes for each other, you either get daily structure with limited depth (zuzu-only) or theoretical depth without practical fluency (Real Python-only).
| Plan | Real Python | zuzu.codes |
|---|---|---|
| Free content | Large selection of articles | Complete 30-day Python Fundamentals track |
| Paid | $20/month (membership) | $14.99/month (Full Access) |
| What paid unlocks | Video courses, premium tutorials | All 12 tracks |
Real Python's free articles are genuinely high quality — you can read extensively without paying. The membership is worth it if you're actively using their video courses or want unrestricted access to all premium content.
zuzu's free tier is a complete 30-day track, not a preview. You can finish it entirely and evaluate whether the format works before paying anything.
Start with zuzu if:
Start with Real Python if:
The honest bottom line is that most Python learners need zuzu first and Real Python second. You get more out of Real Python's depth once you have the foundation to put it in context. Right now, if you can't write a function from scratch without a template, the advanced Real Python articles will feel interesting but won't make you more capable. The training program has to come before the reference library.
| Feature | zuzu.codes | Real Python |
|---|---|---|
| Format | Dialogue lessons + code challenges | Long-form tutorial articles + videos |
| Structure | 30-day sequential tracks | Topic-based articles (any order) |
| Practice | Graded code challenges every lesson | Read-along code examples |
| Price | Free starter + $14.99/mo | Some free + $20/mo membership |
| Accountability | XP, streaks, quizzes | None |
| Teaching Style | Student-teacher dialogue | Technical articles |
zuzu.codes is a structured training program — one lesson per day, building skills progressively. Real Python is a library of excellent reference articles. One builds habits, the other answers questions.
Every zuzu lesson ends with a graded code challenge. Real Python tutorials have code examples you read along with. Active practice beats passive reading for skill building.
zuzu tracks XP, streaks, and quiz scores. Real Python has no progress tracking or accountability features. If you need external motivation, zuzu provides it.
You want deep reference articles on specific Python topics
You prefer reading long-form technical tutorials
You're looking up how to do something specific
You want video courses on advanced Python topics
Not syntax — just thinking. How would you solve these?
1.You have a list of file names and want only the `.py` files, uppercase. You could write a loop. What's the list comprehension equivalent of: `result = []; for f in files: if f.endswith('.py'): result.append(f.upper())`?
2.Your `filter_long_words` function works. A colleague asks you to add an `exclude` parameter — a set of words to always leave out even if they're long enough. You want `exclude` to default to nothing. What's the right default value for a mutable container in a function signature?
3.You're reading a Real Python article on list comprehensions. You understand every example as you read it. That evening you try to write one from scratch and your hands freeze. What does this tell you about the kind of practice you need more of?
Build real Python step by step — runs right here in your browser.
Filter Long Words
Write a function called `filter_long_words` that takes a list of words and a minimum length `n`. Return a new list containing only words longer than `n` characters, each converted to uppercase. Use a list comprehension.
# filter_long_words(["hello","cat","python","go","code"], 4) [ "HELLO", "PYTHON", "CODE" ]
Start with the free Python track. No credit card required.