Rodrigo πŸπŸš€ Profile picture
Nov 1, 2021 β€’ 14 tweets β€’ 5 min read β€’ Read on X
Here is a Python 🐍 function that tells you if the input number is even or odd...

But how does it work? πŸ‘‡

It looks a bit weird, doesn't it?

Someone DM'd me this function from a @realpython article, and now this ⚑🧡 will break it down for you.

Here we go πŸš€
If you have heard of Boolean short-circuiting, that's the short answer:

Boolean short-circuiting is what's responsible for the behaviour of `f`.

Let me explain...

First, we need to understand the precedence of the `and` and `or`.

Let me add parentheses πŸ‘‡
`and` has higher precedence than `or`.

In other words, `and` β€œbinds tighter” to its operands than `or`.

Now, usually we use `and` and `or` with Boolean operands, to return a Boolean value.

However, `and`/`or` work with arbitrary objects as operands.

We call it,
the Truthy and Falsy value of objects in Python.

This means any object can be used in the place of a Boolean.

In order to figure out the Boolean value that corresponds to an object, we can use the `bool` built-in πŸ‘‡
Interesting how 1 maps to True, 0 to False, but both strings map to True.

In fact, ALL strings map to True.
Well, all of them except the empty string.
The empty string maps to False.

So, what does this have to do with the way `f` works?
Remember when I mentioned Boolean short-circuiting?

This means that Python only looks at the right operand of a Boolean operator IF it needs it.

For example, if the left-hand side of an `and` is False, Python does not look at the right operand πŸ‘‡
Why doesn't Python thrown an error?

Because `False and x` is going to be `False`, regardless of whether `x` is `True` or `False`....

So, Python doesn't even bother evaluating `x`!

A similar thing can happen with `or`, if the left operand is `True` πŸ‘‡
Another really important thing that you need to know about this is that...

`and` and `or` β€œreturn” the actual value of the last operand it evaluated.

In other words, `and`/`or` don't necessarily return `True`/`False` πŸ‘‡
This is the gist of Boolean short-circuiting.

I have a whole article on it, if you want more examples and a more thorough explanation πŸ‘‡

mathspp.com/blog/pydonts/b…
So, now that we know how Boolean short-circuiting works, we can explain how `f` works.

Let's break the explanation down into two cases:

πŸ‘‰ x % 2 == 1
πŸ‘‰ x % 2 == 0
πŸ‘‰ x % 2 == 1

If x % 2 is 1, then the function body simplifies to

(1 and "odd") or "even"

πŸ‘‡

"odd" or "even"

At this point, because of short-circuiting, `or` sees a Truthy value on the left, and simply returns `"odd"`.
πŸ‘‰ x % 2 == 0

If x % 2 is 0, then the function body simplifies to

(0 and "odd") or "even"

πŸ‘‡

0 or "even"

At this point, the left of `or` is Falsy, so it evaluates the right operand, which is `"even"`, and returns it!
That's it, that's how the function `f` works to determine if numbers are odd or even!

Did you learn from this 🧡?

This is what I love to do: break down Python 🐍 and explain it to you in a simple manner!

Follow @mathsppblog for more content like this πŸ˜‰

See you around πŸ‘‹
TL;DR:

πŸ‘‰ `and` has higher precedence than `or`;
πŸ‘‰ Boolean short-circuiting means Python will only evaluate the operands it needs;
πŸ‘‰ we also use the truthy/falsy values of 1, 0, "odd", and "even".

Found a weird piece of Python code?
DM it to me! I'll explain it in a ⚑🧡

βš“

β€’ β€’ β€’

Missing some Tweet in this thread? You can try to force a refresh
γ€€

Keep Current with Rodrigo πŸπŸš€

Rodrigo πŸπŸš€ Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

More from @mathsppblog

May 9
Hide private information in your Python code.

Suppose you want to print an email...

But you want to create that cool ro*****@mathspp.com effect.

This is pretty easy to achieve in Python!

All you need to do is use an f-string and use the appropriate format specifiers. Diagram showing how you can use f-strings and their format specification to redact private or sensitive information, like email addresses.  The code from the diagram:  def redact_email(email):     user, _, domain = email.partition("@")     return f"{user[:2]:*<{len(user)}}@{domain}"  print(redact_email("rodrigo@mathspp.com")) # ro*****@mathspp.com
πŸ‘‰ the first thing you do is use `str.partition` to grab the email β€œuser” and the domain.

We will redact only the user (but you could also redact the domain with the same process).

The `user[:2]` shows the first two characters.

That's the β€œro”.

But how do you get β€œro*****”?
πŸ‘‰ use an f-string and the width specifier.

You want to create a field as wide as β€œrodrigo”:

r o _ _ _ _ _

The length of this field is `len(user)`, so you use `{len(user)}` INSIDE the format spec.

This creates a field with the correct width.
Read 6 tweets
May 18, 2023
I know `print` is the first Python 🐍 function you learned! πŸš€

And yet, you don't know this about `print` πŸ‘‡ Image
What you know for sure is that `print` will take an object and it will print it on the screen.

That's the basic functionality it provides: Image
Maybe you don't know that `print` can actually print multiple things!

If you pass multiple arguments, they all get printed: Image
Read 11 tweets
May 17, 2023
I'll tell you the story of a person that had the wrong name…

And how to prevent that in Python 🐍 with properties πŸš€.

πŸ‘‡ Image
John Doe was a regular guy and when he was born, he was inserted into the government's database of people.

They created a new `Person` and added John's details: Image
John never liked his name Doe, though.

So Joe decided to change his name to Smith.

And so he did.

He updated his last name, but the government `Person` STILL had the wrong name! Image
Read 10 tweets
May 14, 2023
Opening a file to read/write is a common task in Python 🐍.

Here is how to do it right! πŸš€

πŸ‘‡ Image
Python has a built-in `open` that takes a file path and opens that file.

Then, you have to specify whether you want to open the file to read, write, or append.

But this isn't half of the story! Image
The default behaviour is to open the file to read/write text.

This works well with TXT or CSV files, for instance.

If you need to open a file to read its binary contents, you can add a `"b"` to the mode: Image
Read 6 tweets
May 13, 2023
The Python 🐍 built-in `round` is great. πŸš€

Here are some tips on it. πŸ‘‡ Image
The purpose of `round` is to… round numbers!

It rounds numbers to the closest integer.

These are some simple examples: Image
However, if the number ends in `.5`, what is the closest integer?

In that case, `round` will choose the even number.

This means it may round up or down πŸ€ͺ

(In school, I was taught to round `.5` up… 🀷) Image
Read 6 tweets
May 12, 2023
Error handling in Python 🐍 made simple. πŸš€

πŸ‘‡ Image
The keyword `try` is used before code that might fail.

So, if you know something can raise an error, you can write it inside a `try` statement: Image
Now that the code is inside a `try` statement, you need to tell Python what error you want to handle, and how.

That's when the keyword `except` comes in! Image
Read 7 tweets

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Don't want to be a Premium member but still want to support us?

Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal

Or Donate anonymously using crypto!

Ethereum

0xfe58350B80634f60Fa6Dc149a72b4DFbc17D341E copy

Bitcoin

3ATGMxNzCUFzxpMCHL5sWSt4DVtS8UqXpi copy

Thank you for your support!

Follow Us!

:(