1.4 Числа и арифметика#
Числовые типы данных#
После того как мы узнали, как создать переменную и присвоить ей значение, пора начать знакомство с тем, а какие именно значения это могут быть. Начнем с чисел.
В стандартном Python’е для чисел мы будем использовать два типа данных:
int - целочисленный тип
float - тип для чисел с плавающей запятой (дробные числа)
Каждый раз, когда мы в коде будем писать какое-то число, на самом деле мы будем создавать новый объект с типом данных int или float. Если с int все очевидно и для создания объектов такого типа мы просто используем цифры, то для float важно отметить, что в качестве разделителя между целой и дробной частью всегда используется ..
Обратимся к примеру, который мы уже видели:
x = 2022 # Здесь мы создаем объект типа int и присваиваем его переменной x
x = 3.14 # А здесь мы уже создаем объект типа float и перезаписываем значение переменной x
Помимо такого классического задания чисел в Python есть еще несколько дополнительных удобных особенностей. Например, внутри целых чисел можно расставлять _, которое никак не будет влиять на само число, но улучшит читаемость:
million = 1_000_000
billion = 1_000_000_000
trillion = 1_000_000_000_000
А дробные числа можно записывать в экспоненциальной форме:
float_number = 1e-3 # = 0.001
Чтобы проверить тип используемого числа, можно использовать встроенную функцию type():
type(2022)
int
type(3.14)
float
Типы — тоже объекты
Каждый объект в Python имеет тип, а сам тип в свою очередь является объектом.
type(int) # type
type(float) # type
type(type) # type
type # type
На данном этапе не будем разбирать это подробно — просто имейте в виду, что в Python всё является объектом, включая сами типы. А значит к ним тоже можно будет обращаться и выполнять с ними разные операции. Именно тип определяет, какие операции можно выполнять с данным объектом.
Арифметические операции#
Над любыми числами (int, float), которые мы определяем, можно производить все арифметические операции, знакомые нам из математики:
2 + 2 # сложение
4
10 - 2 # вычитание
8
5 * 3 # умножение
15
32 / 2 # деление
16.0
70 // 3 # целочисленное деление
23
92 % 50 # остаток от деления
42
2 ** 3 # возведение в степень
8
Если нам понадобится выполнить извлечение корня, то для этого нет отдельной операции и следует использовать возведение в степень дроби. Например, так будет выглядеть извлечение корня:
4 ** 0.5
2.0
Вообще стоит отметить, что в одном выражении мы можем использовать числа разных типов (одновременно и целые, и дробные), это не будет являться ошибкой. Python сам выполнит необходимые преобразования между типами, чтобы получить верный ответ. Однако это справедливо только для чисел.
3 + 3.12 # складывая целое и дробное, получаем дробное
6.12
2.5 + 2.5 # если в выражении было дробное число, то результат всегда будет дробным
5.0
5 / 2 # также при делении чисел друг на друга всегда получаем дробное
2.5
Расширенные операторы присваивания#
В реальных задачах мы часто будем сталкиваться с тем, что нужно будет просуммировать какой-нибудь набор значений. Допустим, посчитать суммарную площадь полигонов в векторном слое. Для решения такой задачи, скорее всего, нам придется создать некоторую переменную total_area и постоянно прибавлять к ней последующие значения:
total_area = 0 # начальная площадь
total_area = total_area + 25 # добавили площадь одного полигона
total_area = total_area + 35 # добавили площадь второго полигона
... # и так далее
total_area
60
Чтобы упростить подобную запись, в Python есть расширенные операторы присваивания (Augmented Assignment Operators). Такие операторы совмещают в себе присваивание и арифметическую операцию:
total_area = 0
total_area += 25 # Аналогично записи: total_area = total_area + 25
total_area += 35 # Аналогично записи: total_area = total_area + 35
total_area
60
Подобным образом перед знаком = может использоваться любой арифметический оператор. Приведем ещё несколько примеров:
x = 0
x += 10 # x = x + 10
x -= 10 # x = x - 10
x *= 10 # x = x * 10
x /= 10 # x = x / 10
x //= 10 # x = x // 10
x %= 10 # x = x % 10
x **= 10 # x = x ** 10
Операторы сравнения#
Помимо различных арифметических операций с числами можно производить и операции сравнения аналогично тому, как они работают в математике. В результате таких операций будет получаться новый тип данных - логический (bool).
Логический тип данных может принимать только два значения: True и False (важно использовать значения в правильном регистре, первая буква обязательно заглавная). Дальше в материалах логический тип будет активно использоваться в инструкциях с условиями, а сами условия зачастую будут строиться на основе операций сравнения.
x = 10
y = 5
x > y # > - больше
True
x >= y # >= - больше или равно
True
x < y # < - меньше
False
x <= y # <= - меньше или равно
False
x == y # == - равно
False
x != y # != - не равно
True
Логические операторы#
Помимо операторов сравнения, в Python есть логические операторы, которые работают с логическим типом данных (bool). Они позволяют комбинировать несколько условий или проверять их отрицание.
Оператор not#
Оператор not выполняет отрицание: если значение было True, оно станет False, и наоборот:
not True
False
not False
True
На практике not удобно использовать для проверки обратного условия. Например, мы можем проверить, что точка не находится в определённой зоне:
zone = 10
not (zone == 10) # точка находится в зоне 10, поэтому отрицание даёт False
False
Оператор and#
Оператор and возвращает True только тогда, когда оба операнда истинны. Если хотя бы один из них False, результат будет False:
True and True
True
True and False
False
В реальных задачах and используется для проверки нескольких условий одновременно. Например, точка находится в пределах определённой области, если её координаты удовлетворяют обоим ограничениям:
lat = 55.75
lon = 37.62
lat > 50 and lon < 40 # оба условия выполнены
True
Оператор or#
Оператор or возвращает True, если хотя бы один из операндов истинен. Он возвращает False только тогда, когда оба операнда ложны:
True or False
True
False or False
False
or полезен, когда нас устраивает любой из нескольких вариантов. Например, координата считается допустимой, если она находится в пределах хотя бы одной из зон:
zone = 15
zone == 10 or zone == 15 # координата в зоне 15, поэтому результат True
True
Приоритет операторов#
При имеющемся множестве арифметических операторов и операторов сравнения важно знать их приоритеты, что в каком порядке будет выполняться. Во многом все будет работать так, как мы ожидаем: сначала действия в скобках, потом умножения, потом сложения и так далее. Но есть несколько особенностей, поэтому приведем все приоритеты полностью:
Выражения в скобках
Возведение в степень
Унарные операции (знаки + - перед числом)
Умножения и деления
Сложения и вычитания
Логические не - not
Логическое и - and
Логическое или - or
Обратим внимание на пункт 3. Здесь мы видим, что знак перед числом срабатывает после возведения в степень, поэтому нужно быть внимательным при возведении в четную степень отрицательных чисел:
-2 ** 2
-4
(-2) ** 2
4
Второй момент, который следует отметить, заключается в том, что операции, находящиеся на одном уровне, выполняются по порядку слева направо за исключением возведения в степень. Возведение в степень будет срабатывать справа налево:
2 ** 3 ** 2 # = 2 ** 9
512