Rodrigo Girão Serrão 🐍🚀
banner
mathspp.com
Rodrigo Girão Serrão 🐍🚀
@mathspp.com
I'll help you take your Python skills to the next level!

Get a daily drop of Python knowledge 🐍💧 -> https://mathspp.com/drops

Pydon'ts – free Python book 👉 https://mathspp.com/books/pydonts
When doing Advent of Code I always end up needing a stack.

When I do, I create it by inheriting from `list`.

This gives me almost everything I want for free!
November 14, 2025 at 1:27 PM
33 likes on BlueSky? Am I famous now?!
You know what's a pain to implement in Python?

A moving average function.

Manually keeping track of all the values being considered for the window is a pain!

Unless you use `collections.deque`.

Its param `maxlen` makes the window automatically evict the values you don't need.
November 14, 2025 at 11:57 AM
I published an article about “everything related to functions”.

It was supposed to be a reference article...

And I forgot to talk about docstrings! 🤦

What's worse is that no one event pointed that out to me!

I've fixed it now: mathspp.com/blog/pydont...
Functions: a complete reference | Pydon't 🐍
This article serves as a complete reference for all the non-trivial things you should know about Python functions.
mathspp.com
November 14, 2025 at 11:19 AM
You know what's a pain to implement in Python?

A moving average function.

Manually keeping track of all the values being considered for the window is a pain!

Unless you use `collections.deque`.

Its param `maxlen` makes the window automatically evict the values you don't need.
November 13, 2025 at 6:19 PM
I was going through the OVERWHELMINGLY POSITIVE reviews of my book “Pydon'ts” and I always giggle when I find this 1-star review.

I mean, after 200 ⭐️⭐️⭐️⭐️⭐️ reviews, this anonymous user could think for a second and realise that the issue wasn't mine/the book's...

🤡
November 12, 2025 at 2:17 PM
This GitHub Action dorny/path-filters just saved me hours of work 🥵

I have a folder in a repo with cloudflare workers:

workers/
workerA/**
workerB/**

I want to deploy workers that get changed but not the others!

That's when dorny/path-filters comes in handy! ✨
November 12, 2025 at 1:59 PM
Your future you will thank you for this:

The keyword `assert` takes an expression to its right.

If the expression evaluates to `True`, or Truthy, everything is fine.

But if it doesn’t, you get an `AssertionError`.

That's a pretty unhelpful/generic error...

Here's the fix:
November 11, 2025 at 2:19 PM
Quick!

How many string methods that change the case of a string can you name?

I'll give you a hint:

I thought there were only 5 but I was wrong.
November 10, 2025 at 2:42 PM
All Python objects have a Truthy/Falsy value.

This is the value of an object when used in a Boolean context.

For example, when used in the condition of an `if` statement.

Most objects are Truthy, with a few exceptions.

For most types, the “nothing” or “empty” value is Falsy.
November 10, 2025 at 10:54 AM
It just hit me that programming is like chess.

Everyone can play.

But not everyone plays beautifully…

It requires practice and calculated moves.

Moves that look like arbitrary choices…

But if you know, you’ll see how each decision builds towards a readable codebase.
November 9, 2025 at 5:48 PM
Just published a new article about the new Python 3.14 module `compression`.

This module offers a neat way to access the 5 compression modules we have in Python:

👉 bz2
👉 gzip
👉 lzma
👉 zlib
👉 zstd

The first four were already available as standalone modules...
November 8, 2025 at 12:02 AM
When building complex readable strings, consider building them out of smaller fragments.

The function `oxford_comma`, shown below, demonstrates this technique.

What's the point of the smaller fragments?
November 7, 2025 at 2:25 PM
Python has a very well-known naming convention:

Names that start with a leading underscore are “private”.

This means the outside world has no business using them.

E.g., attributes and methods starting with `_` in a class mean they're for that class only.
November 6, 2025 at 12:03 PM
I'm really enjoying this idea I stole from Simon Willison

I now have a `tools` subdomain where I host small HTML+JS tools built with LLMs that help me with whatever random things I need.

E.g., I have one that pre-fills my testimonial form and generates a URL I can share easily!
November 5, 2025 at 6:58 PM
The methods `strftime` and `strptime` can be used to convert dates/times into strings and vice-versa.

Here's a mnemonic to help you:

👉 `strptime` has a “P” for “Parse date/time”, so string -> date
👉 `strftime` has an “F” for “Format date/time”, so date -> string
November 5, 2025 at 12:01 PM
A generator, duck typing, and a branchless conditional walk into a bar...

You can read the rest of this Python joke here 👉 mathspp.com/blog/a-gene...
A generator, duck typing, and a branchless conditional walk into a bar
A generator, duck typing, and a branchless conditional walk into a bar.
mathspp.com
November 4, 2025 at 9:28 PM
The string method `str.split` has a parameter `maxsplit` that determines the maximum number of splits that will be performed.

The returned list with the splits (and possibly the remainder of the string) has a maximum length of `maxsplit + 1`.
November 4, 2025 at 11:58 AM
Yesterday's training culminated with creating a couple of projects (with uv).

We then uploaded them to (Test) PyPI and we got people to install each other's apps and run them on their own computers.

It was clearly a moment of *fun* for folks involved. 🤩
October 31, 2025 at 1:56 PM
This is your friendly reminder that str.split accepts a parameter to determine the maximum number of splits. You get up to n splits and the remainder of the string.
October 31, 2025 at 1:51 PM
Days 2 and 3 were a success, if I might say so myself.

The grounded, fundamental approach to OOP resonated well with the participants.

Even those who already knew OOP said they learned a lot by starting with the fundamentals!

What a surprise! (Not...)
October 29, 2025 at 11:42 PM
Live-coding during trainings + automatically syncing to git so everyone has access to what I'm typing =

Very informative git history.
October 28, 2025 at 1:00 PM
Yesterday went well.

Today I'm teaching OOP from the ground up.

But like, REALLY from the ground up.

Not just “you write class Something then __init__ and `self` is the first argument because reasons”.

Might turn this into a chapter for my book “Pydon'ts”, actually...
There's nothing quite like the excitement of being about to start a week-long Python training.

Being this excited about my job feels illegal 🤣
October 28, 2025 at 9:40 AM
Python is for everyone ❤️.

Become a PSF member if you can!
TLDR; The PSF has made the decision to put our community and our shared diversity, equity, and inclusion values ahead of seeking $1.5M in new revenue. Please read and share. pyfound.blogspot.com/2025/10/NSF-...
🧵
The official home of the Python Programming Language
www.python.org
October 27, 2025 at 5:01 PM
There's nothing quite like the excitement of being about to start a week-long Python training.

Being this excited about my job feels illegal 🤣
October 27, 2025 at 12:44 PM
Believe it or not, it took me 30+ min and nagging a core dev to get this TINY documentation issue fixed.

But at least I'll sleep well tonight, knowing all “See also” call outs are correctly formatted.
October 26, 2025 at 2:40 PM