Open In Colab

Basic Python Semantics: Operators

In the previous section, we began to look at the semantics of Python variables and objects; here we'll dig into the semantics of the various operators included in the language. By the end of this section, you'll have the basic tools to begin comparing and operating on data in Python.

Arithmetic Operations

Python implements seven basic binary arithmetic operators, two of which can double as unary operators. They are summarized in the following table:

Operator Meaning Example
+ Add two operands or unary plus x + y
+2
- Subtract right operand from the left or unary minus x - y
-2
* Multiply two operands x * y
/ Divide left operand by the right one (always results into float) x / y
% Modulus - remainder of the division of left operand by the right x % y (remainder of x/y)
// Floor division - division that results into whole number adjusted to the left in the number line x // y
** Exponent - left operand raised to the power of right x**y (x to the power y)

These operators can be used and combined in intuitive ways, using standard parentheses to group operations. For example:

In [ ]:
# addition, subtraction, multiplication
(4 + 8) * (6.5 - 3)
Out[ ]:
42.0

Floor division is true division with fractional parts truncated:

In [ ]:
# True division
print(11 / 2)
5.5
In [ ]:
# Floor division
print(11 // 2)
5

The floor division operator was added in Python 3; you should be aware if working in Python 2 that the standard division operator (/) acts like floor division for integers and like true division for floating-point numbers.

For the sake of completeness, we'll mention an eighth arithmetic operator that was added in Python 3.5: the a @ b operator, which is meant to indicate the matrix product of a and b, for use in various linear algebra packages.

Assignment Operations

We've seen that variables can be assigned with the "=" operator, and the values stored for later use. For example:

In [ ]:
a = 24
print(a)
24

We can use these variables in expressions with any of the operators mentioned earlier. For example, to add 2 to a we write:

In [ ]:
a + 2
Out[ ]:
26

We might want to update the variable a with this new value; in this case, we could combine the addition and the assignment and write a = a + 2. Because this type of combined operation and assignment is so common, Python includes built-in update operators for all of the arithmetic operations:

In [ ]:
a += 2  # equivalent to a = a + 2
print(a)
26

There is an augmented assignment operator corresponding to each of the binary operators listed earlier; in brief, they are:

a += b a -= b a *= b a /= b
a //= b a %= b a **= b a &= b
a |= b a ^= b a <<= b a >>= b

Each one is equivalent to the corresponding operation followed by assignment: that is, for any operator "", the expression a ■= b is equivalent to a = a ■ b, with a slight catch. For mutable objects like lists, arrays, or DataFrames, these augmented assignment operations are actually subtly different than their more verbose counterparts: they modify the contents of the original object rather than creating a new object to store the result.

Comparison Operations

Another type of operation which can be very useful is comparison of different values. For this, Python implements standard comparison operators, which return Boolean values True and False. The comparison operations are listed in the following table:

Operation Description Operation Description
a == b a equal to b a != b a not equal to b
a < b a less than b a > b a greater than b
a <= b a less than or equal to b a >= b a greater than or equal to b

These comparison operators can be combined with the arithmetic operators to express a virtually limitless range of tests for the numbers. For example, we can check if a number is odd by checking that the modulus with 2 returns 1:

In [ ]:
# 25 is odd
25 % 2 == 1
Out[ ]:
True
In [ ]:
# 66 is odd
66 % 2 == 1
Out[ ]:
False

We can string-together multiple comparisons to check more complicated relationships:

In [ ]:
# check if a is between 15 and 30
a = 25
15 < a < 30
Out[ ]:
True

Boolean Operations

When working with Boolean values, Python provides operators to combine the values using the standard concepts of "and", "or", and "not". Predictably, these operators are expressed using the words and, or, and not:

In [ ]:
x = 4
(x < 6) and (x > 2)
Out[ ]:
True
In [ ]:
(x > 10) or (x % 2 == 0)
Out[ ]:
True
In [ ]:
not (x < 6)
Out[ ]:
False

Boolean algebra aficionados might notice that the XOR operator is not included; this can of course be constructed in several ways from a compound statement of the other operators. Otherwise, a clever trick you can use for XOR of Boolean values is the following:

In [ ]:
# (x > 1) xor (x < 10)
(x > 1) != (x < 10)
Out[ ]:
False

These sorts of Boolean operations will become extremely useful when we begin discussing conditionals and loops.

Identity and Membership Operators

Like and, or, and not, Python also contains prose-like operators to check for identity and membership. They are the following:

Operator Description
a is b True if a and b are identical objects
a is not b True if a and b are not identical objects
a in b True if a is a member of b
a not in b True if a is not a member of b

Identity Operators: "is" and "is not"

The identity operators, "is" and "is not" check for object identity. Object identity is different than equality, as we can see here:

In [ ]:
a = [1, 2, 3]
b = [1, 2, 3]
In [ ]:
a == b
Out[ ]:
True
In [ ]:
a is b
Out[ ]:
False
In [ ]:
a is not b
Out[ ]:
True

What do identical objects look like? Here is an example:

In [ ]:
a = [1, 2, 3]
b = a
a is b
Out[ ]:
True

The difference between the two cases here is that in the first, a and b point to different objects, while in the second they point to the same object. As we saw in the previous section, Python variables are pointers. The "is" operator checks whether the two variables are pointing to the same container (object), rather than referring to what the container contains. With this in mind, in most cases that a beginner is tempted to use "is" what they really mean is ==.

Membership operators

Membership operators check for membership within compound objects. So, for example, we can write:

In [ ]:
1 in [1, 2, 3]
Out[ ]:
True
In [ ]:
2 not in [1, 2, 3]
Out[ ]:
False

These membership operations are an example of what makes Python so easy to use compared to lower-level languages such as C. In C, membership would generally be determined by manually constructing a loop over the list and checking for equality of each value. In Python, you just type what you want to know, in a manner reminiscent of straightforward English prose.