На этом занятии
рассмотрим виды и работу арифметических операторов в Python. И как уже
говорили, в этом языке имеется три базовых типа для представления чисел:
-
int
– для
целочисленных значений;
-
float
– для
вещественных;
-
complex
– для
комплексных.
С этими числами
можно выполнять следующие арифметические операции:
Оператор
|
Описание
|
Приоритет
|
+
|
сложение
|
2
|
-
|
вычитание
|
2
|
*
|
умножение
|
3
|
/, //
|
деление
|
3
|
%
|
остаток
деления
|
3
|
**
|
возведение
в степень
|
4
|
И введем несколько определений:
Операнд – то, к чему
применяется оператор. Например, в умножении 5 * 2 есть два операнда: левый
операнд равен 5, а правый операнд равен 2. Иногда их называют «аргументами»
вместо «операндов».
Унарным называется
оператор, который применяется к одному операнду.
Например, оператор унарный
минус "-" меняет знак числа на противоположный:
#унарный минус
a=1; a=-a
print(a)
Обратите внимание как записаны два
оператора в одну строчку: они разделены точкой с запятой. Так тоже можно
делать. Если каждый оператор начинается с новой строки, то точку с запятой
ставить не обязательно, если пишем несколько операторов в одну строчку, то они
разделяются точкой с запятой.
Бинарным называется
оператор, который применяется к двум операндам.
Тот же минус существует и в
бинарной форме:
a = 1; b = 2
c = b-a #бинарный минус
print(c)
Раз мы начали
говорить об операциях + и -, то продолжим и отметим, что, в общем случае, можно
использовать унарный плюс и минус, например:
Конечно, +a это то же самое,
что и a, поэтому, в
основном, используется унарный минус. По приоритету унарные операции выше
бинарных операций. Например, вот такая запись:
означает, что число –a
возводится в степень 2, то есть, унарный минус имеет больший приоритет, чем
бинарная операция ** возведения в степень.
Если же
используются бинарные сложение и вычитание:
a=2; b=-10
print(a+b)
print(a-b)
то их приоритет
становится наименьшим среди всех арифметических операций (они выполняются в
последнюю очередь).
Следующая
бинарная операция умножение работает так, как мы привыкли ее использовать в
математике:
a=2; b=-5.8; c=2.3
print( a+b*c )
Здесь сначала
выполнится умножение, а затем – сложение. Если необходимо изменить приоритет
выполнения операций, то используются круглые скобки:
Далее, деление
двух чисел (или переменных) можно выполнить двумя способами. Первый –
традиционный, делает деление, привычное в математике, например:
получим
ожидаемый результат 1,5. Однако те из вас, кто имеет опыт программирования на
таких языках как С++ или Java, знают, что при делении двух
целочисленных значений, результат также получался целочисленным. Но в Python это не так! Его
арифметические операции работают в соответствии с классическими правилами
математики и деление здесь – это всегда полноценное деление двух значений,
какими бы они ни были.
Однако, если все
же требуется выполнить целочисленное деление (то есть, с отбрасыванием дробной
части), то используется такой оператор:
И, как видите,
теперь результат 1, а не 1,5. Причем, это целочисленное деление будет
выполняться и с вещественными числами:
Вот такие два
оператора деления существуют в Python.
Если же хотим
вычислить остаток от целочисленного деления, то используется оператор:
С положительными
целыми числами он работает также как и во многих других языках
программирования. Например,
и так далее, мы будем получать числа от
0 до 4. Но с отрицательными числами вычисления будут отличаться от того же
языка С++. Например,
-9 % 5 # (в С++ это -4, а в Python – это 1)
Почему так? Дело в том, что когда то
давно инженеры фирмы Intell неверно математически
реализовали данную операцию. И язык С++ как наследник этой интеловской
архитектуры реализует данную операцию путем вынесения знака «-» за скобки и
вычисления обычного остатка от деления. Язык же Python делает это так,
как принято в математике. Сначала находится ближайшее наименьшее число кратное
5. Это число -10 (для числа -9) и остаток берется как разность между этими
числами:
то есть, остатки
всегда будут положительными в диапазоне от 0 до 4, как это и должно быть по
математике.
Все
рассмотренные операторы (*, /, //, %) имеют одинаковый приоритет и выполняются
слева-направо. То есть, если записать
то это следует
интерпретировать как формулу
Следующая
операция – возведение в степень. В самом простом варианте она записывается так:
здесь x, y могут быть и
дробными числами. Например:
Это будет
соответствовать извлечению квадратного корня из 1,96. Если запишем такую
конструкцию:
то получим
кубический корень из 27. Причем, обратите внимание, круглые скобки у степени
здесь обязательны, т.к. приоритет операции ** выше, чем у деления. Если
записать вот так:
то это будет
эквивалентно такому выражению:
Вот на это
следует обращать внимание. И еще один нюанс. Операция возведения в степень
выполняется справа-налево. То есть, если записать вот такую строчку:
Это будет
эквивалентно степени:
Сначала (справа)
вычисляется 3**2 = 9, а затем, 2**9 = 512. Все остальные арифметические
операции работают слева-направо.
Используя
оператор присваивания совместно с арифметическими операторами, можно выполнять
некоторые полезные арифметические преобразования переменных. Например, очень
часто требуется увеличить или уменьшить некую переменную на определенное число.
Это можно сделать вот так:
i = 5; j = 3
i = i+1
j = j-2
print(i, j)
Но, можно и
короче, вот так:
i = 5; j = 3
i += 1
j -= 2
print(i, j)
Они довольно
часто используются в программировании. Также, помимо сложения и вычитания,
можно записывать и такие выражения:
i *= 3
j /= 4
print(i, j)
a = 5; b = 10
a **= 2
b //= 3
print(a, b)
То есть, здесь
до оператора присваивания можно записывать любую арифметическую операцию.
Все
рассмотренные арифметические операции можно выполнять и с комплексными числами:
a = 1 + 2j
b = 2 - 3j
print(a+b)
print(a-b)
print(a*b)
print(a/b)
print(a**b)
Кроме операции
целочисленного деления // и вычисления остатка от деления %. Дополнительно у
объектов комплексных чисел есть свойства:
a = 1 + 2j
b = 2 - 3j
print(a.real)
print(b.imag)
для взятия
действительной и мнимой части. И полезный метод:
sa = a.conjugate();
print(sa)
для получения
комплексно-сопряженного числа.
В языке Python имеются
встроенные функции для работы с числами. Наиболее полезные, следующие:
Название
|
Описание
|
abs(x)
|
вычисляет
модуль числа x
|
round(x)
|
округляет
x до ближайшего
целого
|
min(x1, x2,…,x_n)
|
находит
минимальное, среди указанных чисел
|
max(x1, x2,…,x_n)
|
находит
максимальное, среди указанных чисел
|
pow(x, y)
|
возводит
x в степень y
|
Также в языке Python имеется
стандартная библиотека math, которая содержит большое количество стандартных
математических функций. Чтобы ей воспользоваться, необходимо вначале программы
подключить эту библиотеку. Делается это с помощью ключевого слова import, за которым
указывается имя библиотеки:
После этого
становятся доступными следующие полезные функции:
Название
|
Описание
|
math.ceil(x)
|
возвращает
ближайшее наибольшее целое для x
|
math.floor(x)
|
возвращает
ближайшее наименьшее целое для x
|
math.fabs(x)
|
возвращает
модуль числа x
|
math.factorial(x)
|
вычисляет
факториал x!
|
math.exp(x)
|
вычисляет
e**x
|
math.log2(x)
|
вычисляет
логарифм по основанию 2
|
math.log10(x)
|
вычисляет
логарифм по основанию 10
|
math.log(x, [base])
|
вычисляет
логарифм по указанному основанию base (по умолчанию
base = e – натуральный
логарифм)
|
math.pow(x, y)
|
возводит
число x в степень y
|
math.sqrt(x)
|
вычисляет
квадратный корень из x
|
Тригонометрические функции
|
math.cos(x)
|
вычисляет
косинус x
|
math.sin(x)
|
вычисляет
синус x
|
math.tan(x)
|
вычисляет
тангенс x
|
math.acos(x)
|
вычисляет
арккосинус x
|
math.asin(x)
|
вычисляет
арксинус x
|
math.atan(x)
|
вычисляет
арктангенс x
|
Математические константы
|
math.pi
|
число
пи
|
math.e
|
число
e
|
Помимо этих есть
и другие математические функции. При необходимости, о них можно почитать в
официальной документации языка Python.
Применение этих
функций вполне очевидно, например, их можно вызвать вот так:
import math
a = 2.4
b = math.cos(a)
print(b)
print( math.floor(1.7) )
print( math.ceil(1.7) )
print( math.sqrt(2.56) )
И так далее. Вот так работают
арифметические операции в Python и вот такие математические
функции имеются в стандартной библиотеке math.