What is Truthy and Falsy? How is it different from True and False?
Solution 1:
All values are considered "truthy" except for the following, which are "falsy":
None
False
0
0.0
0j
decimal.Decimal(0)
fraction.Fraction(0, 1)
-
[]
- an emptylist
-
{}
- an emptydict
-
()
- an emptytuple
-
''
- an emptystr
-
b''
- an emptybytes
-
set()
- an emptyset
- an empty
range
, likerange(0)
- objects for which
-
obj.__bool__()
returnsFalse
-
obj.__len__()
returns0
-
A "truthy" value will satisfy the check performed by if
or while
statements. We use "truthy" and "falsy" to differentiate from the bool
values True
and False
.
Truth Value Testing
Solution 2:
As the comments described, it just refers to values which are evaluated to True or False.
For instance, to see if a list is not empty, instead of checking like this:
if len(my_list) != 0:
print("Not empty!")
You can simply do this:
if my_list:
print("Not empty!")
This is because some values, such as empty lists, are considered False when evaluated for a boolean value. Non-empty lists are True.
Similarly for the integer 0, the empty string "", and so on, for False, and non-zero integers, non-empty strings, and so on, for True.
The idea of terms like "truthy" and "falsy" simply refer to those values which are considered True in cases like those described above, and those which are considered False.
For example, an empty list ([]
) is considered "falsy", and a non-empty list (for example, [1]
) is considered "truthy".
See also this section of the documentation.
Solution 3:
Python determines the truthiness by applying bool()
to the type, which returns True
or False
which is used in an expression like if
or while
.
Here is an example for a custom class Vector2d
and it's instance returning False
when the magnitude (lenght of a vector) is 0, otherwise True
.
import math
class Vector2d(object):
def __init__(self, x, y):
self.x = float(x)
self.y = float(y)
def __abs__(self):
return math.hypot(self.x, self.y)
def __bool__(self):
return bool(abs(self))
a = Vector2d(0,0)
print(bool(a)) #False
b = Vector2d(10,0)
print(bool(b)) #True
Note: If we wouldn't have defined __bool__
it would always return True, as instances of a user-defined class are considered truthy by default.
Example from the book: "Fluent in Python, clear, concise and effective programming"
Solution 4:
Truthy values refer to the objects used in a boolean context and not so much the boolean value that returns true or false.Take these as an example:
>>> bool([])
False
>>> bool([1])
True
>>> bool('')
False
>>> bool('hello')
True
Solution 5:
Where should you use Truthy or Falsy values ? These are syntactic sugar, so you can always avoid them, but using them can make your code more readable and make you more efficient. Moreover, you will find them in many code examples, whether in python or not, because it is considered good practice.
As mentioned in the other answers, you can use them in if tests and while loops. Here are two other examples in python 3 with default values combined with or
, s
being a string variable. You will extend to similar situations as well.
Without truthy
if len(s) > 0:
print(s)
else:
print('Default value')
with truthy it is more concise:
print(s or 'Default value')
In python 3.8, we can take advantage of the assignment expression :=
without truthy
if len(s) == 0:
s = 'Default value'
do_something(s)
with truthy it is shorter too
s or (s := 'Default value')
do_something(s)
or even shorter,
do_something(s or (s := 'Default value'))
Without the assignment expression, one can do
s = s or 'Default value'
do_something(s)
but not shorter. Some people find the s =...
line unsatisfactory because it corresponds to
if len(s)>0:
s = s # HERE is an extra useless assignment
else:
s = "Default value"
nevertheless you can adhere to this coding style if you feel comfortable with it.