- Деление в Python
- Оператор деления
- Деление без остатка
- Остаток
- Проблемы чисел с плавающей точкой
- Деление комплексных чисел
- Сокращенные операции деления
- Деление на ноль
- Числовые типы, арифметические операции
- Основные арифметические операции
- Приоритеты арифметических операций
- Дополнительные арифметические операторы
Деление в Python
Python — популярный высокоуровневый язык программирования. Он обладает большим набором инструментов, имеет динамическую типизацию и используется для решения любых видов задач.
Деление в Python разделяется на три вида: обычное, целочисленное и взятие остатка. Программисту не нужно заботиться о типах операндов, Python сам определяет их и приводит результат к нужному виду. Как это делается, разберемся в этой статье.
Оператор деления
Деление в Python обозначается косой чертой «/». Примечательно, что результат в консоле всегда приводится к типу «float», даже если оба операнда были целочисленного типа, об этом свидетельствует появление «.0» у полученного значения.
Это появилось в 3-ей версии Python, ранее результатом деления целых чисел было только целое число, чтобы получить дробный результат, программисты явно указывали одному из операндов тип «float», в противном случае дробная часть просто отбрасывалась.
Важно понимать, что деление в Python, как и другие операции, работает медленнее, чем в более низкоуровневых языках программирования. Это связано с высоким уровнем автоматизации и абстракции, из-за динамической типизации интерпретатор вынужден приводить числа к дробному типу «float», который требует большего количества памяти.
Деление в представлении человека отличается от его представления в компьютере. Компьютер устроен так, что все арифметические операции могут выполняться только через сложение. Это значит, что быстрее всего выполняется сложение, затем вычитание, где необходимо менять знак операндов, умножение, где число складывается много раз. Деление выполняется дольше всех, потому что помимо многократно повторяющейся операции сложения необходимо также менять знак операндов, что требует больше памяти и действий.
print(int(1) / int(2)) print(5 / 5) print(1 / 3) 0.5 1.0 0.3333333333333333
Из примера видно, что не смотря на то, что во всех случаях операция была между целыми числами, результатом деления в Python 3 является вещественное число. В первом случае мы даже специально использовали приведение к типу int.
Дополнительно хотелось бы отметить, что если точности типа данных float не достаточно, можно воспользоваться библиотекой decimal. В частности мы её использовали при написании программы «калькулятор» в отдельной статье.
Деление без остатка
Чтобы выполнить деление на цело в Python, можно воспользоваться целочисленным делением. В этом случае результатом будет целое число, без остатка. Целочисленное деление в Python обозначается двумя косыми чертами «//».
В отличие от других языков программирования Python позволяет результату целочисленного деления быть как целым (int), так и дробным (float) числом. В обоих случаях дробная часть отбрасывается и получается число с окончанием «.0».
Примеры нахождения целой части от деления:
print(5 // 2) print(0 // 2) print(1234 // 5.0) 2 0 246.0
В первых двух случаях деление осуществлялось между целыми числами. Поэтому в результате было получено целое число. В третьем примере одно из чисел вещественное. В этом случае в результате получаем так же вещественное число (типа float), после запятой у которого 0.
Остаток
Для получения остатка от деления в Python 3 используется операция, обозначающаяся символом процента «%». Остаток — это оставшаяся после целочисленного деления часть числа. Операция взятия остатка используется для решения различных видов задач.
print(10 % 3) print(5 % 10) print(5 % 0.25) 1 5 0.0
Определение остатка от деления очень часто используется в программах для нахождения, допустим, чётных чисел. Или, например, если обработка данных выполняется в цикле, и нужно выводить в консоль сообщение о ходе обработки не каждый раз, а на каждой 10-ой итерации.
Вот пример вывода чётных чисел из списка в консоль:
example_list = [3, 7, 2, 8, 1, 12] for value in example_list: if value % 2 == 0: print(value) 2 8 12
Проблемы чисел с плавающей точкой
Компьютер устроен так, что на аппаратном уровне понимает только две цифры: один и ноль. Из-за этого при делении и других операциях с дробями часто возникают проблемы. Например, 1/10 в двоичном представлении является неправильной бесконечной дробью. Её нельзя написать полностью, поэтому приходится округлять, а выбор значения при округлении ограничен нулем и единицей.
Что говорить о делении, если ошибки возникают и при операции сложения. Если сложить число «0.1» с самим собой четырнадцать раз, то получиться 1.400…01. Откуда взялась эта единица? Она появилась при переводе числа из двоичного вида в десятичный.
a = 0.1 for i in range(13): a += 0.1 print(a) 1.4000000000000001
Более технически сложное деление приводит к подобным неточностям гораздо чаще. Обычно Python округляет результат так, что пользователь не замечает этой проблемы, но если получается достаточно длинное число, то проблема проявляется.
Деление комплексных чисел
Комплексные числа — это числа вида «a + b·i». Они занимают наивысшую ступень в иерархии чисел, арифметические операции над ними существенно отличаются от операций над обычными числами.
Деление комплексного числа на обычное меняет лишь длину радиус вектора, но не его направление.
Сокращенные операции деления
Чтобы упростить жизнь программистов, разработчики Python включили в язык «сокращенные операции». Их используют если надо выполнить операцию над переменной и полученный результат записать в эту же переменную. То, что записывается в длинной форме, можно записать в более короткой по следующим правилам:
Полная форма | Краткая форма | |
Деление | a = a / b | a /= b |
Целая часть | a = a // b | a //=b |
Остаток | a = a % b | a %= b |
Деление на ноль
Если попробовать в Python выполнить деление на 0, то мы получим исключение ZeroDivisionError.
Исключение следует обрабатывать, это можно сделать так:
try: print(24 / 0) except Exception as e: print(e) division by zero
Но в этом случае мы обрабатываем все исключения. Зачастую так делать не совсем корректно. Мы знаем, что в нашем коде возможно деление на 0 и, чтобы отловить именно эту ошибку, следует заменить except Exception as e: на except ZeroDivisionError as e: .
Но можно и проверять перед выполнением операции, что делитель не равен 0. Например так:
a = 14 b = None if a == 0: print('делитель равен нулю!') else: b = 345/a print('Операция выполнена, результат = ' + str(b)) Операция выполнена, результат = 24.642857142857142
Числовые типы, арифметические операции
На этом занятии мы поподробнее поговорим о представлении чисел и арифметических операциях над ними.
- int – для целочисленных значений;
- float – для вещественных;
- complex – для комплексных.
Основные арифметические операции
Пока такого понимания чисел будет вполне достаточно. Следующим шагом, нам с вами нужно научиться делать арифметические операции над ними. Что это за операции? Базовыми из них являются, следующие:
Оператор | Описание | Приоритет |
+ | сложение | 2 |
— | вычитание | 2 |
* | умножение | 3 |
/, // | деление | 3 |
% | остаток деления | 3 |
** | возведение в степень | 4 |
Давайте, я поясню их работу на конкретных примерах. Перейдем в консоль языка Python, чтобы выполнять команды в интерактивном режиме. Так будет удобнее для демонстрации возможностей вычислений. В самом простом варианте мы можем просто сложить два целых числа:
Получим результат 5. Но этот результат у нас нигде не сохраняется. Чтобы иметь возможность делать какие-либо действия с пятеркой, ее следует сохранить через переменную, например, вот так:
Теперь a ссылается на объект с числом 5. Давайте разберемся, как работает эта строчка. Сначала в Python создаются два объекта со значениями 2 и 3. Оператор сложения берет эти значения, складывает их и формирует третий объект со значением 5. А, затем, через оператор присваивания, этот объект связывается с переменной a. В конце, если на объекты 2 и 3 не ссылаются никакие другие переменные, они автоматически удаляются из памяти сборщиком мусора. Возможно, вас удивило, что при такой простой операции сложения двух чисел выполняется столько шагов. Но в Python реализовано все именно так. И это справедливо для всех арифметических операций. Мало того, раз операция сложения возвращает объект с результатом, то можно сделать и такое сложение из трех чисел:
И так далее, можно записать сколько угодно операций сложения в цепочку. Давайте теперь сложим целое число с вещественным:
Очевидно, что результат получается тоже вещественным. Отсюда можно сделать вывод, что сложение целого числа с вещественным всегда дает вещественное значение. А вот при делении двух любых чисел, мы всегда будем получать вещественное число (даже если числа можно разделить нацело):
Если же нам нужно выполнить деление с округлением к наименьшему целому, то это делается через оператор:
На выходе получаем значение 3, так как оно является наименьшим целым по отношению к 3,5. Обратите внимание, что при делении отрицательных чисел:
получим уже значение -4, так как оно наименьшее по отношению к -3,5. Вот этот момент следует иметь в виду, применяя данный оператор деления. Следующий оператор умножения работает очевидным образом:
Обратите внимание, в последней операции получим вещественное значение 9.0, а не целое 9, так как при умножении целого на вещественное получается вещественное число. Давайте теперь предположим, что мы хотим вычислить целый остаток от деления. Что это вообще такое? Например, если делить 10 : 3 то остаток будет равен 1. Почему так? Все просто, число 3 трижды входит в число 10 и остается значение 10 — 3∙3 = 1. Для вычисления этого значения в Python используется оператор:
то получим 2. Я думаю, общий принцип понятен. Здесь есть только один нюанс, при использовании отрицательных чисел. Давайте рассмотрим четыре возможные ситуации:
9 % 5 # значение 4 -9 % 5 # значение 1 9 % -5 # значение -1 -9 % -5 # значение -4
Почему получаются такие значения? Первое, я думаю, понятно. Здесь 5 один раз входит в 9 и остается еще 4. При вычислении -9 % 5 по правилам математики следует взять наименьшее целое, делящееся на 5. Здесь – это значение -10. А, далее, как и прежде, вычисляем разность между наименьшим, кратным 5 и -9: -9 – (-10) = 1 При вычислении 9 % -5, когда делитель отрицательное число, следует выбирать наибольшее целое, кратное 5. Это значение 10. А, далее, также вычисляется разность: 9 – 10 = -1 В последнем варианте -9 % -5 следует снова выбирать наибольшее целое (так как делитель отрицателен), получаем -5, а затем, вычислить разность: -9 – (-5) = -4 Как видите, в целом, все просто, только нужно запомнить и знать эти правила. Кстати, они вам в дальнейшем пригодятся на курсе математики. Последняя арифметическая операция – это возведение в степень. Она работает просто:
2 ** 3 # возведение в куб 36 ** 0.5 # 36 в степени 1/2 (корень квадратный) 2 ** 3 ** 2 # 2^3^2 = 512
В последней строчке сначала 3 возводится в квадрат (получаем 9), а затем, 2 возводится в степень 9, получаем 512. То есть, оператор возведения в степень выполняется справа-налево. Тогда как все остальные арифметические операции – слева-направо.
Приоритеты арифметических операций
Получим значение 9. Почему так произошло? Ведь кубический корень из 27 – это 3, а не 9? Все дело в приоритете арифметических операций (проще говоря, в последовательности их выполнения). Приоритет у оператора возведения в степень ** — наибольший. Поэтому здесь сначала 27 возводится в степень 1, а затем, 27 делится на 3. Получаем искомое значение 9. Если нам нужно изменить порядок вычисления, то есть, приоритеты, то следует использовать круглые скобки:
Теперь видим значение 3. То есть, по правилам математики, сначала производятся вычисления в круглых скобках, а затем, все остальное в порядке приоритетов. Приведу еще один пример, чтобы все было понятно:
То есть, приоритеты работают так, как нас учили на школьных уроках математики. Я думаю, здесь все должно быть понятно. Также не забывайте, что все арифметические операторы выполняются слева-направо (кроме оператора возведения в степень), поэтому в строчке:
Дополнительные арифметические операторы
В заключение этого занятия рассмотрим некоторые дополнения к арифметическим операторам. Предположим, что у нас имеются переменные:
И, далее, мы хотим переменную i увеличить на 1, а j – уменьшить на 2. Используя существующие знания, это можно сделать, следующим образом:
Результат будет прежним, но запись короче. Часто, в таких ситуациях на практике используют именно такие сокращенные операторы. То же самое можно делать и с умножением, делением: