Python supplies the usual numeric operations, as we’ve just seen in Table 4-2. Numbers are immutable objects: when you perform numeric operations on number objects, you always produce a new number object and never modify existing ones. You can access the parts of a complex object z
as read-only attributes z.real
and z.imag
. Trying to rebind these attributes on a complex object raises an exception.
A number’s optional +
or -
sign, and the +
that joins a floating-point literal to an imaginary one to make a complex number, are not part of the literals’ syntax. They are ordinary operators, subject to normal operator precedence rules (see Table 4-2). For example, -2**2
evaluates to -4
: exponentiation has higher precedence than unary minus, so the whole expression parses as -(2**2)
, not as (-2)**2
.
You can perform arithmetic operations and comparisons between any two numbers of Python built-in types. If the operands’ types differ, coercion applies: Python converts the operand with the “smaller” type to the “larger” type. The types, in order from smallest to largest, are integers, long integers, floating-point numbers, and complex numbers.
You can request an explicit conversion by passing a noncomplex numeric argument to any of the built-in number types: int
, long
, float
, and complex
. int
and long
drop their argument’s fractional part, if any (e.g., int(9.8)
is 9
). You can also call complex
with two numeric arguments, giving real and imaginary parts. You cannot convert a complex
to another numeric type in this way, because there is no single unambiguous way to convert a complex number into, e.g., a float
.
Each built-in numeric type can also take a string argument with the syntax of an appropriate numeric literal, with small extensions: the argument string may have leading and/or trailing whitespace, may start with a sign, and, for complex numbers, may sum or subtract a real part and an imaginary one. int
and long
can also be called with two arguments: the first one a string to convert, and the second the radix, an integer between 2 and 36 to use as the base for the conversion (e.g., int('101', 2)
returns 5
, the value of '101'
in base 2
).
Python arithmetic operations behave in rather obvious ways, with the possible exception of division and exponentiation.
If the right operand of /
, //
, or %
is 0
, Python raises a runtime exception. The //
operator performs truncating division, which means it returns an integer result (converted to the same type as the wider operand) and ignores the remainder, if any. When both operands are integers (plain or long), the /
operator behaves like //
if the switch -Qold was used on the Python command line (-Qold is the default in Python 2.3, 2.4, and 2.5). Otherwise, /
performs true division, returning a floating-point result (or a complex result if either operand is a complex number). To have /
perform true division on integer operands in Python 2.3, 2.4, or 2.5, use the switch -Qnew on the Python command line, or begin your source file with the statement:
from _ _future_ _ import division
This statement ensures that operator /
(within the module that starts with this statement only) works without truncation on operands of any type.
To ensure that the behavior of division does not depend on the -Q switch, and on the exact version of Python you’re using, always use //
when you want truncating division. When you do not want truncation, use /
, but also ensure that at least one operand is not an integer. For example, instead of using just a/b
, code 1.*a/b
to avoid making any assumption on the types of a
and b
. To check whether your program has version dependencies in its use of division, use the switch -Qwarn on the Python command line to get runtime warnings about all uses of /
on integer operands.
The built-in divmod
function takes two numeric arguments and returns a pair whose items are the quotient and remainder, so you don’t have to use both //
for the quotient and %
for the remainder.
The exponentiation (“raise to power”) operation, a
**
b
, raises an exception if a
is less than zero and b
is a floating-point value with a nonzero fractional part. The built-in pow(
a
,
b
)
function returns the same result as a
**
b
. With three arguments, pow(
a
,
b
,
c
)
returns the same result as (
a
**
b
)%
c
but faster.
All objects, including numbers, can be compared for equality (==
) and inequality (!=
). Comparisons requiring order (<
, <=
, >
, >=
) may be used between any two numbers, unless either operand is complex, in which case they raise runtime exceptions. All these operators return Boolean values (True
or False
).
Integers and long integers can be taken as strings of bits and used with the bitwise operations shown in Table 4-2. Bitwise operators have lower priority than arithmetic operators. Positive integers are conceptually extended by an infinite string of 0
bits on the left. Negative integers are represented in two’s complement notation, and therefore are conceptually extended by an infinite string of 1
bits on the left.
Get Python in a Nutshell, 2nd Edition now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.