Как написать не делится в python
Python поддерживает все распространенные арифметические операции:
-
+ Сложение двух чисел:
print(6 + 2) # 8
print(6 - 2) # 4
print(6 * 2) # 12
print(6 / 2) # 3.0
print(7 / 2) # 3.5 print(7 // 2) # 3
print(6 ** 2) # Возводим число 6 в степень 2. Результат - 36
print(7 % 2) # Получение остатка от деления числа 7 на 2. Результат - 1
При последовательном использовании нескольких арифметических операций их выполнение производится в соответствии с их приоритетом. В начале выполняются операции с большим приоритетом. Приоритеты операций в порядке убывания приведены в следующей таблице.
Пусть у нас выполняется следующее выражение:
number = 3 + 4 * 5 ** 2 + 7 print(number) # 110
Здесь начале выполняется возведение в степень (5 ** 2) как операция с большим приоритетом, далее результат умножается на 4 (25 * 4), затем происходит сложение (3 + 100) и далее опять идет сложение (103 + 7).
Чтобы переопределить порядок операций, можно использовать скобки:
number = (3 + 4) * (5 ** 2 + 7) print(number) # 224
Следует отметить, что в арифметических операциях могут принимать участие как целые, так и дробные числа. Если в одной операции участвует целое число (int) и число с плавающей точкой (float), то целое число приводится к типу float.
Арифметические операции с присвоением
Ряд специальных операций позволяют использовать присвоить результат операции первому операнду:
- += Присвоение результата сложения
- -= Присвоение результата вычитания
- *= Присвоение результата умножения
- /= Присвоение результата от деления
- //= Присвоение результата целочисленного деления
- **= Присвоение степени числа
- %= Присвоение остатка от деления
number = 10 number += 5 print(number) # 15 number -= 3 print(number) # 12 number *= 4 print(number) # 48
Округление и функция round
При операциях с числами типа float надо учитывать, что результат операций с ними может быть не совсем точным. Например:
first_number = 2.0001 second_number = 5 third_number = first_number / second_number print(third_number) # 0.40002000000000004
В данном случае мы ожидаем получить число 0.40002, однако в конце через ряд нулей появляется еще какая-то четверка. Или еще одно выражение:
print(2.0001 + 0.1) # 2.1001000000000003
В случае выше для округления результата мы можем использовать встроенную функцию round() :
first_number = 2.0001 second_number = 0.1 third_number = first_number + second_number print(round(third_number)) # 2
В функцию round() передается число, которое надо округлить. Если в функцию передается одно число, как в примере выше, то оно округляется до целого.
Функция round() также может принимать второе число, которое указывает, сколько знаков после запятой должно содержать получаемое число:
first_number = 2.0001 second_number = 0.1 third_number = first_number + second_number print(round(third_number, 4)) # 2.1001
В данном случае число third_number округляется до 4 знаков после запятой.
Если в функцию передается только одно значение — только округляемое число, оно округляется то ближайшего целого
# округление до целого числа print(round(2.49)) # 2 - округление до ближайшего целого 2 print(round(2.51)) # 3
Однако если округляемая часть равна одинаково удалена от двух целых чисел, то округление идет к ближайшему четному:
print(round(2.5)) # 2 - ближайшее четное print(round(3.5)) # 4 - ближайшее четное
Округление производится до ближайшего кратного 10 в степени минус округляемая часть:
# округление до двух знаков после запятой print(round(2.554, 2)) # 2.55 print(round(2.5551, 2)) # 2.56 print(round(2.554999, 2)) # 2.55 print(round(2.499, 2)) # 2.5
Однако следует учитывать, что функция round() не идеальный инструмент. Например, выше при округление до целых чисел применяется правило, согласно которому, если округляемая часть одинаково удалена от двух значений, то округление производится до ближайшего четного значения. В Python в связи с тем, что десятичная часть числа не может быть точно представлена в виде числа float, то это может приводить к некоторым не совсем ожидаемым результатам. Например:
# округление до двух знаков после запятой print(round(2.545, 2)) # 2.54 print(round(2.555, 2)) # 2.56 - округление до четного print(round(2.565, 2)) # 2.56 print(round(2.575, 2)) # 2.58 print(round(2.655, 2)) # 2.65 - округление не до четного print(round(2.665, 2)) # 2.67 print(round(2.675, 2)) # 2.67
Подобно о проблеме можно почитать к документации.
- Вопросы для самопроверки
- Упражнения для самопроверки
Операторы и выражения¶
Большинство предложений (логических строк) в программах содержат выражения. Простой пример выражения: 2 + 3 . Выражение можно разделить на операторы и операнды.
Операторы – это некий функционал, производящий какие-либо действия, который может быть представлен в виде символов, как например + , или специальных зарезервированных слов. Операторы могут производить некоторые действия над данными, и эти данные называются операндами. В нашем случае 2 и 3 – это операнды.
Операторы¶
Кратко рассмотрим операторы и их применение:
Обратите внимание, вычислить значения выражений, данных в примерах, можно также используя интерпретатор интерактивно. Например, для проверки выражения 2 + 3 воспользуйтесь интерактивной командной строкой интерпретатора Python:
>>> 2 + 3 5 >>> 3 * 5 15
Операторы и их применение
Можно составлять произвольные цепочки сравнений: 3 < 5 < 7 даёт True .
Краткая запись мат. операций и присваивания¶
Зачастую результат проведения некой математической операции необходимо присвоить переменной, над которой эта операция производилась. Для этого существуют краткие формы записи выражений:
Вы можете записать:
a = 2; a = a * 3
a = 2; a *= 3
Обратите внимание, что выражения вида “ переменная = переменная операция выражение ” принимает вид “ переменная операция = выражение ”.
Порядок вычисления¶
Если имеется выражение вида 2 + 3 * 4 , что производится раньше: сложение или умножение? Школьный курс математики говорит нам, что умножение должно производиться в первую очередь. Это означает, что оператор умножения имеет более высокий приоритет, чем оператор сложения.
Следующая таблица показывает приоритет операторов в Python, начиная с самого низкого (самое слабое связывание) и до самого высокого (самое сильное связывание). Это означает, что в любом выражении Python сперва вычисляет операторы и выражения, расположенные внизу таблицы, а затем операторы выше по таблице.
Эта таблица взята из Справочника по языку Python (англ.) и приводится здесь для полноты описания. На практике лучше использовать скобки для группировки операторов и операндов, чтобы в явном виде указать порядок вычисления выражений. Заодно это облегчит чтение программы. Более подробно см. в разделе Изменение порядка вычисления ниже.
Приоритет операторов
| Оператор | Описание |
| lambda | лямбда-выражение |
| or | Логическое “ИЛИ” |
| and | Логическое “И” |
| not x | Логическое “НЕ” |
| in , not in | Проверка принадлежности |
| is , is not | Проверка тождественности |
| < , , >= , != , == | Сравнения |
| | | Побитовое “ИЛИ” |
| ^ | Побитовое “ИСКЛЮЧИТЕЛЬНО ИЛИ” |
| & | Побитовое “И” |
| > | Сдвиги |
| + , — | Сложение и вычитание |
| * , / , // , % | Умножение, деление, целочисленное деление и остаток от деления |
| +x , -x | Положительное, отрицательное |
| ~x | Побитовое НЕ |
| ** | Возведение в степень |
| x.attribute | Ссылка на атрибут |
| x[индекс] | Обращение по индексу |
| x[индекс1:индекс2] | Вырезка |
| f(аргументы . ) | Вызов функции |
| (выражения, . ) | Связка или кортеж [2] |
| [выражения, . ] | Список |
| Словарь |
Операторы, о которых мы не упомянули, будут объяснены в дальнейших главах.
В этой таблице операторы с равным приоритетом расположены в одной строке. Например, + и — имеют равный приоритет.
Изменение порядка вычисления¶
Для облегчения чтения выражений можно использовать скобки. Например, 2 + (3 * 4) определённо легче понять, чем 2 + 3 * 4 , которое требует знания приоритета операторов. Как и всё остальное, скобки нужно использовать разумно (не перестарайтесь) и избегать излишних, как в (2 + (3 * 4)) .
Есть ещё одно преимущество в использовании скобок – они дают возможность изменить порядок вычисления выражений. Например, если сложение необходимо произвести прежде умножения, можно записать нечто вроде (2 + 3) * 4 .
Ассоциативность¶
Операторы обычно обрабатываются слева направо. Это означает, что операторы с равным приоритетом будут обработаны по порядку от левого до правого. Например, 2 + 3 + 4 обрабатывается как (2 + 3) + 4 .
Выражения¶
Пример (сохраните как expression.py ):
length = 5 breadth = 2 area = length * breadth print('Площадь равна', area) print('Периметр равен', 2 * (length + breadth))
Вывод:
$ python expression.py Площадь равна 10 Периметр равен 14
Как это работает:
Длина и ширина прямоугольника хранятся в переменных length и breadth соответственно. Мы используем их для вычисления периметра и площади прямоугольника при помощи выражений. Результат выражения length * breadth сохраняется в переменной area , после чего выводится на экран функцией print . Во втором случае мы напрямую подставляем значение выражения 2 * (length + breadth) в функцию print .
Также обратите внимание, как Python “красиво печатает” результат. Несмотря на то, что мы не указали пробела между ‘Площадь равна’ и переменной area , Python подставляет его за нас, чтобы получить красивый и понятный вывод. Программа же остаётся при этом легкочитаемой (поскольку нам не нужно заботиться о пробелах между строками, которые мы выводим). Это пример того, как Python облегчает жизнь программисту.
Резюме¶
Мы увидели, как пользоваться операторами, операндами и выражениями. Это основные строительные блоки любой программы. Далее мы увидим, как это применить на практике.
Примечания¶
| [1] | “True” — англ. “Верно (Правда)”; “False” — англ. “Ошибочно (Ложь)”. (прим. перев.) |
| [2] | “tuple” — англ. “кортеж” (прим. перев.) |
Деление в 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». Они занимают наивысшую ступень в иерархии чисел, арифметические операции над ними существенно отличаются от операций над обычными числами.
Деление комплексного числа на обычное меняет лишь длину радиус вектора, но не его направление.
print((5 + 8j) / 2) (2.5+4j)
Сокращенные операции деления
Чтобы упростить жизнь программистов, разработчики Python включили в язык «сокращенные операции». Их используют если надо выполнить операцию над переменной и полученный результат записать в эту же переменную. То, что записывается в длинной форме, можно записать в более короткой по следующим правилам:
| Полная форма | Краткая форма | |
| Деление | a = a / b | a /= b |
| Целая часть | a = a // b | a //=b |
| Остаток | a = a % b | a %= b |
a = 245 a %= 17 print(a) 7
Деление на ноль
Если попробовать в 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
Программа по выводу всех целых чисел, которые не делятся на 2 и 3, в диапазоне от 1 до 50
Данная программа должна вывести все целые числа в диапазоне от 1 до 50, которые не делятся на 2 и на 3.
Решение задачи
- Используем цикл for от 1 до 51.
- В теле цикла используем оператор if для проверки делится ли каждое число из диапазона на 2 и на 3.
- Если число не делится ни на 2 ни на 3, то есть удовлетворяет нашим условиям, то выводим его на экран.
- Конец.
Исходный код
Ниже дан исходный код для вывода всех целых чисел из диапазона от 1 до 50, которые не делятся на 2 и 3. Результаты работы программы также даны ниже.
for i in range(1, 51): if(i % 2 != 0 & i % 3 != 0): print(i)
Объяснение работы программы
- Цикл задается в диапазоне (1, 51), так как 51 не входит.
- Выражение в теле оператора if определяет, делится ли число на 2 либо на 3, при помощи оператора деления по модулю, который вычисляет остаток от деления.
- Если остатки от деления на 2 и 3 не равен 0, то число не делится соответственно на 2 и на 3.
- В этом случае мы выводим число на экран.
Результаты работы программы
Пример 1: 1 5 7 11 13 17 19 23 25 29 31 35 37 41 43 47 49