Python Booleans
    Python booleans are used to represent the Boolean result of operations and functions. Python booleans are implemented as a subtype of integers. A Boolean result always return 0 or 
False for Boolean false, and 1 or 
True for Boolean true unless otherwise stated. For example, 
or and 
and operations always return one of their operands accordingly.
    
Unary Boolean Value
    Any Python object can be used as a Boolean value in an 
if or 
while condition or as an operand of the Boolean operations.
    By default, an object is considered as a 
True value unless the return value of an object is considered as 0 or 
False. For example, its class defines either a 
__bool__() method that returns a 
False value, or a 
__len__() method that returns zero. The typical built-objects that considered as 
False are:
    
- Python constants that defined as False:NoneandFasle
- Zero of any numeric type, for example: 0, 0.0, 0𝑗, 0+0𝑗, Decimal(0),Fraction(0,1)
- Empty sequences and collections, e.g.: '', (), [], {}, set(),range(0)
Boolean Operations
    The Python Boolean operators for Boolean operations between two objects are 
not, 
and, and 
or. Precedence of logical operators in descending order of their priorities are 
not, 
and, and 
or. However, 
not operator has a lower priority than non-Boolean operators.
    
    OperationPriorityDescriptionRemarks
    not 𝑥Highif x is false, then True, else Falsenot has a lower priority than non-Boolean operators
    𝑥 and 𝑦Mediumif 𝑥 is false, then 𝑥 else 𝑦A 'short-circuit' type operator. Only if the first operand is true, the second operand will then be evaluated.
    𝑥 or 𝑦Lowif 𝑥 is false, then 𝑦, else 𝑥.A 'short-circuit' type operator. Only if the first operand is false, the second operand will then be evaluate.
   Logical Comparison Operations
    The Python logical comparison operator for boolean comparisons are 
<, 
<=, 
>, 
>=, 
==,
!=, 
is, and 
is not. Besides, the 
in and 
not in operators are used to compare object types that are iterable or implement the 
__contains__() method. Unlike Boolean operations, all logical comparison operations have the same priority. And all logical comparison operations have higher priority than all Boolean operations.
    Precedence of logical operators in descending order of their priorities are 
not, 
and, and 
or. However, 
not operator has a lower priority than non-Boolean operators. Comparisons can be chained arbitrarily. The concept used to evaluate a chained comparison is similar to that used in evaluating a mathematical expression. For example, 𝑥
<𝑦
<𝑧 is equivalent to 𝑥
<𝑦 and 𝑦
<𝑧, except that 𝑦 is evaluated only one time in the chained logical comparison operation.
    
Logical Comparison Operators
 
    Types of Python comparison operators are
    
OperatorDescription
        <strictly less than
        <=less than or equal
        >strictly greater than
        >=greater than or equal
        ==equal
        !-not equal
        isobject identity
        is notnegated object identity
        inin container
        not innot in container
    
In general, objects of different types can never be compared except different numeric types. Operators 
<, 
<=, 
>, and 
>= are defined only when the operation makes sense. The 
== and 
!- operators are always defined. For some object types, the 
== operator is equivalent to 
is operator, e.g. class objects. However, non-identical instances of a class is normally considered as non-equal unless the class defines the 
__eq__() method. The behavior of the 
is and 
is not operators cannot be customized. Both operators can be applied to any two objects and never raise an exception. 
    
Instances of a class cannot be ordered with respect to other instances of the same class, or other types of object, unless the class defines enough of the methods __lt__(), __le__(), __gt__(), and __ge__() (in general, __lt__() and __eq__() are sufficient, if you want the conventional meanings of the comparison operators).
    Source and Reference