**python operators or Chain comparison: **

**python operators-**You can compare various items with various python operators with chain comparison. For example

1 |
x > y > z |

is just a short form of:

1 |
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 python operators represents one of the various comparison operations you can use, and the letters represent arbitrarily valid expressions.

*“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 **a natural meaning in most cases since equality is generally transitive.”*

**Style**

There is no abstract limit on how many items and python operators you use as long you have the proper syntax:

1 |
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. Good chaining will be “directional”, not more complicated than

1 |
1 > x > -4 > y != 8 |

**Side effects**

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

1 |
a > exp and exp > b |

exp will be computed over again if a > exp is true.

**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.To illustrate:

1 2 3 4 5 6 7 8 9 10 11 |
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.

1 2 3 4 5 6 |
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.

1 2 3 4 5 6 |
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:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
if myvar is not None: # not None pass if myvar is None: # None pass The use of is is to test for a “sentinel” (i.e. a unique object). sentinel = object() def myfunc(var=sentinel): if var is sentinel: value wasn’t provided pass else: # value was provided Pass |

**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:

1 2 3 4 5 6 |
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.

1 2 3 4 5 6 |
"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”

True

Each type defines it’s a calculation with the < and > operators differently, so you should investigate what the

operators mean 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.

1 2 3 4 5 6 |
12 != 1 # True 12 != '12' # True '12' != '12' # False |

**Python Operators** **Equal to ****:**

x == y

This python operators evaluates if x and y are the same value and return 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’.

1 2 3 4 5 6 7 8 9 10 11 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 built-in 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.)

1 2 3 4 5 6 7 8 9 10 |
class Foo(object): 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 considers that other (the object being compared to) is the same object type.

Comparing to another type will throw an error:

1 2 3 4 5 6 7 8 9 |
class Bar(object): 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 is an instance() or similar will help prevent this (if desired).

## Related Project of Python Operators:

python if statement elif else statement & security system using raspberry pi