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
Арифметические операции#
Над любыми числами, которые мы определяем, можно производить все арифметические операции, знакомые нам из математики:
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 сам выполнит необходимые преобразования между типами, чтобы получить верный ответ. Однако это справедливо только для чисел.
5 / 2 # если целые числа не делятся друг на друга нацело, получаем дробное
2.5
3 + 3.12 # складывая целое и дробное, получаем дробное
6.12
2.5 + 2.5 # в выражениях только с дробными числами, результат тоже всегда будет дробным
5.0
Расширенные операторы присваивания#
В реальных задачах мы часто будем сталкиваться с тем, что нужно будет просуммировать какой-нибудь набор значений. Допустим, посчитать суммарную площадь полигонов в векторном слое. Для решения такой задачи, скорее всего, нам придется создать некоторую переменную 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 * 2
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
Приоритет операторов#
При имеющемся множестве арифметических операторов и операторов сравнения важно знать их приоритеты, что в каком порядке будет выполняться. Во многом все будет работать так, как мы ожидаем: сначала действия в скобках, потом умножения, потом сложения и так далее. Но есть несколько особенностей, поэтому приведем все приоритеты полностью:
Выражения в скобках
Возведение в степень
Унарные операции (знаки + - перед числом)
Умножения и деления
Сложения и вычитания
Логические не - not
Логическое и - and
Логическое или - or
Обратим внимание на пункт 3. Здесь мы видим, что знак перед числом срабатывает после возведения в степень, поэтому нужно быть внимательным при возведении в четную степень отрицательных чисел:
-2 ** 2
-4
(-2) ** 2
4
Второй момент, который следует отметить, заключается в том, что операции, находящиеся на одном уровне, выполняются по порядку слева направо за исключением возведения в степень. Возведение в степень будет срабатывать справа налево:
2 ** 3 ** 2 # = 2 ** 9
512