Table of Contents
Python operators or Chain comparison:
Unlike the other programming languages, in Python you can compare various items using various python operators with chain comparison. For example
x > y > z
Is just a short form of:
x > y and y > z
This will evaluate to true only if both comparisons are true.
The general form is
a OP b OP c OP d …
Where OP is the python operator represents one of the various comparison operations you can use, and the letters represent arbitrarily
“Note that 0 != 1 != 0 evaluates to True, even though 0 != 0 is False. Unlike the common mathematical
notation in which x != y != z means that x, y and z have contrasting values. Chaining == operations has
the natural meaning in most cases, since equality is generally transitive.”
There is no abstract limit on how many items and python operators you use as long you have proper syntax:
1 > -1 < 2 > 0.5 < 100 != 24
The above returns true if each relation returns true. However, using convoluted chaining is not a good style. A good chaining will be “directional”, not more complicated than
1 > x > -4 > y != 8
As soon as one comparison returns False, the expression evaluates immediately to False, skipping all remaining comparisons.
Note that the expression exp in a > exp > b will be calculated only once, whereas in the case of
a > exp and exp > b
exp will be computed over again if a > exp is true.
Amazon Purchase Links:
*Please Note: These are affiliate links. I may make a commission if you buy the components through these links. I would appreciate your support in this way!
Python Operators difference between “is” and “==”:
A common pitfall is confusing the equality python operators is and ==.
a == b compares the value of a and b.
a is b will compare the identities of a and b.
a = 'Python is fun!' b = 'Python is fun!' a == b # returns True a is b # returns False a = [1, 2, 3, 4, 5] b = a # b references a a == b # True a is b # True b = a[:] # b now references a copy of a a == b # True a is b # False [!!]
Basically, is can be thought of as shorthand for id(a) == id(b).
before this, there are quirks of the run-time environment that further complicate things. Short strings and small integers will return True when related with is, due to the Python machine attempting to use less memory for identical objects.
a = 'short' b = 'short' c = 5 d = 5 a is b # True c is d # True
But longer strings and larger integers will be stored separately.
a = 'not so short' b = 'not so short' c = 1000 d = 1000 a is b # False c is d # False
You should use is to test for None:
if myvar is not None:
if myvar is None:
The use of is is to test for a “sentinel” (i.e. a unique object).
sentinel = object()
if var is sentinel:
value wasn’t provided
value was provided
Python Operators Greater than or less than:
x > y
x < y
These python operators correlated two types of values, they’re the less than and greater than operators. For numbers this simply compares the numerical values to see which is larger:
12 > 4 # True 12 < 4 # False 1 < 4 # True
For strings, they will compare lexicographically, which is similar to alphabetical order but not truly the same.
"alpha" < "beta" # True "gamma" > "beta" # True "gamma" < "OMEGA" # False
In these connections, lowercase letters are considered ‘greater than’ uppercase, which is why “gamma” < “OMEGA” is false. If they were all uppercase it would return the normal alphabetical ordering result:
“GAMMA” < “OMEGA”
Each type defines it’s calculation with the < and > operators differently, so you should investigate what the operators means with a given type before using it.
Python Operators Not equal to != :
x != y
This python operator returns True if x and y are not equal and if equals its returns False.
12 != 1 # True 12 != '12' # True '12' != '12' # False
Python Operators Equal Equal to:
x == y
This python operators evaluates if x and y are the same value and returns the result as a boolean value. Generally both
the value and type must be matched, so the int 12 is not the same as the string ’12’.
12 == 12 # True 12 == 1 # False '12' == '12' # True 'spam' == 'spam' # True 'spam' == 'spam ' # False '12' == 12 # False
Note that each type has to define a function that will be used to calculate if two values are the same. For builtin types these functions behave as you’d hope, and just calculate things based on being the same value. However procedure types could define equality testing as whatever they’d like, including always returning True or always returning False.
python Comparing object operators:
In order to compare the equality of procedure classes, you can override == and != by defining eq and ne
methods. You can also override lt (<), le (<=), gt (>), and ge (>). Note that you only need to
override two comparison approach, and Python can handle the rest (== is the same as not < and not >, etc.)
def __init__(self, item): self.my_item = item def __eq__(self, other): return self.my_item == other.my_item a = Foo(5) b = Foo(5) a == b # True a != b # False a is b # False
Note that this simple comparison consider that other (the object being compared to) is the same object type.
Comparing to another type will throw an error:
def __init__(self, item): self.other_item = item def __eq__(self, other): return self.other_item == other.other_item def __ne__(self, other): return self.other_item != other.other_item c = Bar(5) a == c # throws AttributeError: 'Foo' object has no attribute 'other_item'
Checking isinstance() or similar will help prevent this (if desired).