In some cases, not always, functions return something and if an error happens or there was no match, they return None explicit or implicit.
Explicit
If you get from a function some type back and you have to check for None, just recognize that
First you check, if the return type is a
If this check passes, you check if the list is not empty.
A better approach is this:
If the list is empty,
So in general the boolean of sequences and containers is False, if the container or sequence is empty.
Otherwise it's
This expression is True:
This expression is True:
Other funny stuff:
Counting True in a list, where only True and False are inside.
Explicit
None
def foo(): return NoneImplicit
None
def foo(): passThe implicit
None
returns always, if no other return
-statement was executed.If you get from a function some type back and you have to check for None, just recognize that
True
, False
, None
are singletons and they're unique. If a bad function, not your code, returns sometimes a list with strings, sometimes None and sometimes an empty list, then you have to do two checks.First you check, if the return type is a
None
.If this check passes, you check if the list is not empty.
import random def silly_function(): return_vals = (None, [], ['Hello', 'World']) return random.choice(return_vals) # now the tests are more complex, if you # want to handle the None explicit return_value = silly_function() if return_value is None: print('None') elif return_value: print('The list is not empty') else: # no None, but a empty list print('The list is empty')Sometimes we have to handle this.
A better approach is this:
def find(pattern): words = ('foo', 'bar', 'baz', 'fizz', 'fuzz') results = [] for word in words: if word.startswith(pattern): results.append(word) # MATCH return results # the return type of results is always a list # which is good, because lesser cases to check return_value = find('f') if return_value: print(return_value) else: print('Sorry, I did not find any matches. The list is empty')The line
if return_value:
does an implicit bool(return_value).If the list is empty,
bool(your_list)
returns False
.So in general the boolean of sequences and containers is False, if the container or sequence is empty.
Otherwise it's
True
.True
and False
are subtypes of int
.This expression is True:
(0.0 == 0 == False)
This expression is True:
(1.0 == 1 == True)
Other funny stuff:
(True + True == 2)
Counting True in a list, where only True and False are inside.
true_false_list = [True, False, True, True, False, True] # sum True trues = sum(true_false_list) print('True is', trues, 'times in the list') # of course you can use also # true_false_list.count(True)All values of integers and floats are evaluated as boolean to True, if the value is not zero.
values = (True, False, None, 0, -1, 1, 10, 0.0, 5.5, -5.5, [], (1,2,3), [1]) # a tuple with some values for value in values: print(f'The boolean of the value {value!s:<10} is {bool(value)}')
Output:The boolean of the value True is True
The boolean of the value False is False
The boolean of the value None is False
The boolean of the value 0 is False
The boolean of the value -1 is True
The boolean of the value 1 is True
The boolean of the value 10 is True
The boolean of the value 0.0 is False
The boolean of the value 5.5 is True
The boolean of the value -5.5 is True
The boolean of the value [] is False
The boolean of the value (1, 2, 3) is True
The boolean of the value [1] is True
With this knowledge you can simplify your code and write it more pythonic.
Almost dead, but too lazy to die: https://sourceserver.info
All humans together. We don't need politicians!
All humans together. We don't need politicians!