Операторы Python: арифметика, деление // и %, сравнение, and/or/not и python round
Оператор / в Python всегда даёт float, // — целую часть с округлением вниз, % — остаток, ** — степень. Функция round(x, n) округляет до n знаков по-банковски: round(2.5) равно 2, а round(3.5) — 4; вверх и вниз до целого округляют math.ceil и math.floor, модуль числа даёт abs.
Операторы Python — это знаки, которые превращают значения в новые значения: + складывает, // делит нацело, and объединяет условия. Ниже — полный список операторов с примерами, разница между / и //, логика and, or, not, а также функции округления: python round, math.ceil, math.floor и abs. Все примеры можно вставить в REPL и проверить.
Список операторов Python
Операторы делятся на группы по назначению. Запоминать таблицу целиком не нужно: в живом коде чаще всего встречаются арифметика, сравнение и логические связки.
| Группа | Операторы | Пример |
|---|---|---|
| Арифметические | + - * / // % ** | 7 // 2 → 3 |
| Сравнения | == != < > <= >= | 3 < 5 → True |
| Логические | and or not | not True → False |
| Тождества | is, is not | x is None |
| Принадлежности | in, not in | "ф" in "кофе" → True |
| Присваивания | = += -= *= /= //= %= **= | total += 250 |
| Моржовый | := | if (n := len(s)) > 10: |
| Побитовые | & | ^ ~ << >> | 5 & 3 → 1 |
Арифметические операторы
Сложение, вычитание и умножение работают как в школе. Если в выражении участвует хотя бы один float, результат тоже будет float: 2 + 1.0 даёт 3.0. Целые числа в Python не переполняются — 2 ** 100 посчитается точно, сколько бы цифр ни получилось.
>>> 250 + 120
370
>>> 12.5 * 3
37.5
>>> 2 ** 10
1024
>>> 2 ** 0.5
1.4142135623730951
Степень в Python: оператор **
Возведение в степень — две звёздочки, а не ^: знак ^ в Python означает побитовое «исключающее ИЛИ», и 2 ^ 3 вернёт 1, а не 8. Дробная степень даёт корень: 9 ** 0.5 равно 3.0. Есть и функция pow(x, y) — то же самое, плюс третий аргумент для остатка: pow(2, 10, 1000) вернёт 24.
Учтите приоритет: ** выполняется раньше унарного минуса, поэтому -2 ** 2 равно -4. Если нужен квадрат отрицательного числа, пишите скобки: (-2) ** 2.
Деление в Python: /, // и %
В Python два вида деления, и это главный источник сюрпризов у новичков. Обычное деление / всегда возвращает float, даже если делится нацело. Целочисленное деление // отбрасывает дробную часть, а % возвращает остаток.
>>> 7 / 2
3.5
>>> 8 / 2
4.0
>>> 7 // 2
3
>>> 7 % 2
1
Целочисленное деление // и остаток %: практика
Пара // и % решает задачи «сколько целых и сколько осталось». В курсе трекер расходов хранит деньги в копейках, чтобы не терять точность, и раскладывает сумму на рубли и копейки:
kopecks = 125050 # храним деньги в копейках
rub = kopecks // 100 # 1250 — целые рубли
kop = kopecks % 100 # 50 — остаток
print(rub, kop) # 1250 50
print(40 // 7, "недель и", 40 % 7, "дней") # 5 недель и 5 дней
Обе операции сразу возвращает встроенная функция divmod: divmod(125050, 100) даёт кортеж (1250, 50). Остаток удобен и для проверки чётности: n % 2 == 0 истинно для чётных чисел.
Отрицательные числа: // округляет вниз
Оператор // не просто отбрасывает дробь, а округляет вниз, к минус бесконечности. Для положительных чисел разницы нет, для отрицательных — есть. Знак остатка % в Python совпадает со знаком делителя, так что всегда выполняется равенство a == (a // b) * b + a % b.
>>> -7 // 2
-4
>>> -7 % 2
1
>>> int(-7 / 2) # отбросить дробь, а не округлить вниз
-3
Деление на ноль: какая ошибка
Деление на ноль любым из трёх операторов вызывает исключение ZeroDivisionError. Это касается и целых, и дробных чисел. Его можно перехватить через try/except или заранее проверить делитель.
>>> 10 / 0
Traceback (most recent call last):
...
ZeroDivisionError: division by zero
>>> count = 0
>>> avg = 1500 / count if count else 0
>>> avg
0
Операторы сравнения
Сравнения возвращают True или False. Равенство проверяется двумя знаками ==, одиночный = — это присваивание. Строки сравниваются посимвольно по кодам символов, поэтому "Б" < "а" истинно: заглавные буквы идут раньше строчных.
>>> 250 == 250.0
True
>>> 3 != 4
True
>>> 1 < 5 <= 10 # цепочка: 1 < 5 and 5 <= 10
True
>>> 0.1 + 0.2 == 0.3
False
Цепочки сравнений вроде 0 <= x < 100 — удобная особенность Python: не нужно писать and. А последняя строка напоминает о погрешности дробных чисел: 0.1 + 0.2 даёт 0.30000000000000004. Дробные числа сравнивайте через math.isclose(a, b), а деньги храните в копейках или в Decimal.
Логические операторы and, or, not
Логические операторы в Python пишутся словами, а не символами && и ||, как в других языках. and истинно, когда истинны обе части, or — когда истинна хотя бы одна, not переворачивает значение.
| a | b | a and b | a or b | not a |
|---|---|---|---|---|
| True | True | True | True | False |
| True | False | False | True | False |
| False | True | False | True | True |
| False | False | False | False | True |
Приоритет: сначала not, затем and, затем or. Выражение True or False and False равно True, потому что and считается первым. В сложных условиях ставьте скобки — так понятнее и вам, и коллегам.
Что на самом деле возвращают and и or
and и or возвращают не обязательно True или False, а один из операндов. or отдаёт первое истинное значение (или последнее, если истинных нет), and — первое ложное (или последнее). Ложными считаются 0, 0.0, пустая строка, пустые коллекции, None и False.
>>> name = ""
>>> name or "Гость"
'Гость'
>>> 5 and 0
0
>>> not ""
True
Вычисление ленивое: если результат ясен по левой части, правая не вычисляется. Поэтому count and total / count не упадёт с делением на ноль при count == 0. Оператор not, в отличие от двух других, всегда возвращает bool.
Операторы is и in
== сравнивает значения, а is проверяет, что два имени указывают на один и тот же объект. Две разные пустые корзины равны, но это не один объект. Единственное место, где is нужен постоянно, — проверка на None: if x is None.
>>> a = [250, 120]
>>> b = [250, 120]
>>> a == b, a is b
(True, False)
>>> c = a
>>> c is a
True
Не сравнивайте через is числа и строки: иногда это «работает» из-за внутреннего кэширования объектов, но результат зависит от реализации, и Python выдаёт SyntaxWarning на конструкции вроде x is 5.
Оператор in проверяет вхождение: подстроку в строке, элемент в списке, ключ в словаре. not in — обратная проверка.
>>> "кофе" in "кофе с собой"
True
>>> "еда" in {"еда": 450, "такси": 300}
True
>>> 5 not in [1, 2, 3]
True
Операторы присваивания и моржовый оператор :=
Составные операторы +=, -=, *=, //= и другие — сокращение: total += 250 означает total = total + 250. Операторов ++ и -- в Python нет: x++ вызовет синтаксическую ошибку.
Моржовый оператор := (назван так за сходство с глазами и бивнями моржа) присваивает значение прямо внутри выражения. Он полезен, когда значение нужно и проверить, и использовать дальше:
items = ["кофе", "такси", "обед", "кино"]
if (n := len(items)) > 3:
print(f"Слишком много трат: {n}")
while (line := input("Сумма: ")) != "":
print(int(line) * 2)
Без моржа пришлось бы вызывать len дважды или выносить присваивание отдельной строкой. Злоупотреблять им не стоит: если строка стала нечитаемой, обычное присваивание лучше.
Округление в Python: round, ceil, floor
Для округления в Python есть встроенная функция round и функции модуля math. Они решают разные задачи, и путать их — частая ошибка.
| Функция | Что делает | 2.5 | -2.5 | 2.7 |
|---|---|---|---|---|
round(x) | к ближайшему, половина — к чётному | 2 | -2 | 3 |
math.floor(x) | вниз, к минус бесконечности | 2 | -3 | 2 |
math.ceil(x) | вверх, к плюс бесконечности | 3 | -2 | 3 |
math.trunc(x), int(x) | отбросить дробь, к нулю | 2 | -2 | 2 |
Функция round в Python и банковское округление
Функция round(x, n) округляет до n знаков после запятой; без второго аргумента возвращает целое int. Главные грабли: python round округляет «по-банковски» — половину к ближайшему чётному. Поэтому round(2.5) даёт 2, а round(3.5) — 4. Так ошибки округления не накапливаются в одну сторону при больших расчётах.
>>> round(2.5), round(3.5)
(2, 4)
>>> round(3.14159, 2)
3.14
>>> round(1250, -2) # до сотен
1200
>>> round(2.675, 2) # не 2.68: в двоичном виде это 2.67499...
2.67
Если нужно привычное школьное округление «половина вверх», например в чеке, используйте Decimal с режимом ROUND_HALF_UP. Число передавайте строкой, чтобы не унаследовать погрешность float:
>>> from decimal import Decimal, ROUND_HALF_UP
>>> Decimal("2.5").quantize(Decimal("1"), ROUND_HALF_UP)
Decimal('3')
>>> Decimal("2.675").quantize(Decimal("0.01"), ROUND_HALF_UP)
Decimal('2.68')
И ещё одно правило из курса: округляйте только при выводе. Для красивой печати не нужен round — достаточно f-строки: f"{amount:.2f}" покажет два знака, а само число останется точным.
math.ceil и math.floor: округление вверх и вниз
math.ceil нужен, когда «не хватает» недопустимо: сколько автобусов заказать, сколько страниц в выдаче. math.floor — когда считаются только полные единицы. Обе функции возвращают int.
import math
guests = 47
seats = 20
print(math.ceil(guests / seats)) # 3 автобуса
print(math.floor(9.99)) # 9
print(-(-guests // seats)) # 3 — ceil без math, приём через //
В модуле math есть и другие полезные функции: math.sqrt (корень), math.isclose (сравнение дробей), math.pi, math.gcd. В Python 3.15 появился подмодуль math.integer (PEP 791) для целочисленной математики: в нём comb, factorial, gcd, isqrt, lcm, perm, а старые math.gcd и другие продолжают работать.
Функция abs: модуль числа
abs(x) возвращает модуль — расстояние от нуля без знака. Импорт не нужен, функция встроенная. Работает с целыми, дробными и даже комплексными числами: для 3+4j вернёт длину вектора, 5.0.
>>> abs(-250)
250
>>> abs(-12.5)
12.5
>>> budget, spent = 5000, 5320
>>> abs(budget - spent) # на сколько отклонились
320
Типичное применение — разница без учёта направления и сравнение с допуском: abs(a - b) < 0.001. Для дробей надёжнее math.isclose, потому что он учитывает масштаб чисел.
Приоритет операторов
Когда в выражении несколько операторов, Python выполняет их по приоритету — от высокого к низкому:
**- унарные
-x,+x,~x * / // %+ -- побитовые сдвиги и операции
- сравнения,
in,is notandor:=
Так, 2 + 3 * 4 равно 14, а (2 + 3) * 4 — 20. Если сомневаетесь, ставьте скобки: лишние скобки ничего не стоят, а ошибка приоритета находится долго.
Частые ошибки с операторами
| Ошибка | Что происходит | Как правильно |
|---|---|---|
if x = 5: | SyntaxError: это присваивание | if x == 5: |
2 ^ 3 вместо степени | побитовое XOR, результат 1 | 2 ** 3 |
ждут целое от 8 / 2 | получают 4.0 | 8 // 2 |
x == 1 or 2 | всегда истинно: or 2 | x in (1, 2) |
ждут 3 от round(2.5) | банковское округление даёт 2 | Decimal с ROUND_HALF_UP |
"5" + 5 | TypeError | int("5") + 5 |
Итог
Запомните главное: / всегда даёт float, // округляет вниз, % возвращает остаток со знаком делителя, а степень — это **. Логические and, or, not пишутся словами и вычисляются лениво, is нужен для проверки на None. Функция python round округляет к чётному, для округления вверх и вниз есть math.ceil и math.floor, модуль числа даёт abs. В курсе эти операторы разбираются на практике — в трекере расходов, где деньги хранятся в копейках.
Частые вопросы
Как в Python округлить число до двух знаков после запятой?
Используйте round(x, 2), а если нужно только красиво вывести число — f-строку f"{x:.2f}", которая не меняет само значение.
Почему round(0.5) в Python возвращает 0?
Потому что round округляет половину к ближайшему чётному числу, а 0 — чётное; так же round(1.5) и round(2.5) дают 2.
Как получить целую часть от деления в Python?
Оператором //: 17 // 5 вернёт 3. Для отрицательных чисел он округляет вниз, поэтому -17 // 5 даст -4; если нужно отбросить дробь к нулю, используйте int(-17 / 5).
Есть ли в Python тернарный оператор?
Да, это условное выражение: значение_если_да if условие else значение_если_нет, например "чётное" if n % 2 == 0 else "нечётное".
Чем отличаются & и and в Python?
and — логический оператор с ленивым вычислением, а & — побитовое И для чисел и пересечение для множеств; в условиях if используйте and.
Эта тема подробно разобрана с практикой в курсе «Python 3.15: от новичка до профи».
Перейти к курсу