Menu
Русский

Числа и булевы в Python: int, float, bool и арифметика

Как Python обращается с целыми, числами с плавающей точкой и булевыми — арифметика, преобразования и краевые случаи, на которых спотыкаются.

Два вида чисел и один вид истины

Числовые типы, которые ты будешь использовать каждый день, — int и float, плюс bool для истина/ложь. Этого достаточно почти для всей арифметики и логики, нужной обычной Python-программе.

main.py
Output
Click Run to see the output here.

Python иногда называет булевы подтипом целых — True буквально равен 1, а False0, — что открывает пару полезных трюков дальше.

Целочисленная арифметика

Целые в Python никогда не переполняются. Звучит неважно, пока ты не напишешь первую функцию факториала и не поймёшь, что в большинстве других языков результат тихо уехал бы в отрицательные.

main.py
Output
Click Run to see the output here.

Оба выражения дают точные ответы, как бы велики они ни были. Единственный потолок — память.

Арифметические операторы — те, что ожидаешь, плюс пара бонусных:

main.py
Output
Click Run to see the output here.

Три вещи из этого списка стоит запомнить:

  • / всегда возвращает float в Python 3, даже когда обе стороны — целые. 10 / 2 даст тебе 5.0, а не 5. Нужно целое — используй //.
  • // округляет в сторону минус бесконечности, так что -7 // 2 — это -4, а не -3. Необычно, но последовательно.
  • % даёт остаток, и он удобен для «чётно ли это число?» (n % 2 == 0) и для обвёртывания в фиксированный диапазон.

Float и его знаменитая ловушка

Float-ы несовершенны по задумке. Они хранятся в двоичной форме, которая не может точно представить большинство десятичных дробей. Учебниковый пример:

main.py
Output
Click Run to see the output here.

Первая строка печатает 0.30000000000000004. Вторая — False. В любом языке, следующем стандарту IEEE 754 — Python, JavaScript, Java, C — поведение такое же. Это не баг Python.

На практике это означает две вещи:

  1. Не сравнивай float через ==. Если нужно «достаточно близко» — используй math.isclose(a, b) или проверь abs(a - b) < some_tolerance.
  2. Для денег используй decimal.Decimal. Модуль decimal из стандартной библиотеки даёт точную десятичную арифметику — никаких сюрпризов вроде 0.1 + 0.2. Он медленнее float, поэтому и не используется по умолчанию, но для валюты — правильный выбор.
main.py
Output
Click Run to see the output here.

Преобразования между числовыми типами

Python не будет молча превращать целое в строку или строку в число. Ты просишь об этом явно:

main.py
Output
Click Run to see the output here.

Недопустимые преобразования поднимают ValueError:

>>> int("hello")
ValueError: invalid literal for int() with base 10: 'hello'

Сообщение об ошибке прямолинейно и его легко отработать. Почисти ввод или перехвати исключение.

Булевы чуть подробнее

True и False — два булевых значения, написанные ровно так, с заглавной буквы в начале. Большинство сравнений дают одно из них:

main.py
Output
Click Run to see the output here.

Булевы операторы — and, or и not, записанные английскими словами, а не символами:

main.py
Output
Click Run to see the output here.

Одна полезная тонкость: and и or не обязательно возвращают True или False — они возвращают значение, которое решило выражение. 0 or "fallback" даёт "fallback"; 5 and 10 даёт 10. Это позволяет писать короткие дефолты вроде name = user_input or "anonymous", но этот факт полезно помнить и тогда, когда булева проверка неожиданно возвращает не тот тип.

Truthy и falsy

Python считает многие значения «истинными» или «ложными», когда ты используешь их в булевом контексте вроде if или while. Falsy-значения такие:

  • False
  • 0, 0.0
  • None
  • Пустые контейнеры: "", [], {}, set(), ()

Всё остальное — truthy. Это позволяет писать более естественно выглядящие проверки:

main.py
Output
Click Run to see the output here.

Читай if name: как «если в name что-то есть». Гораздо чище, чем if name != "":. Только с числами осторожнее — if count: воспримет 0 как «пропустить», и это обычно, но не всегда, то, чего ты хочешь. Если ноль — легитимное значение, лучше if count is not None:.

Булева арифметика

Поскольку булевы и есть целые, над ними можно делать арифметику:

main.py
Output
Click Run to see the output here.

Этот трюк всплывает достаточно часто, чтобы отложить в копилку. Если хочешь посчитать, сколько элементов списка проходят некоторый тест — суммируй генератор булевых:

main.py
Output
Click Run to see the output here.

Практические выводы

  • Целые не переполняются. Пользуйся свободно.
  • / возвращает float; для целочисленного деления — //.
  • Не сравнивай float через ==; сравнивай с допуском или используй Decimal для денег.
  • Truthy-проверки делают условия читабельнее — но помни, что 0 и пустые строки — falsy.

Дальше — input и print, два инструмента, превращающие твои скрипты из молчаливых программ в разговор.

Часто задаваемые вопросы

В чём разница между int и float в Python?

int — это целое число без десятичной точки; float — число с десятичной точкой. Целые в Python могут быть любого размера — переполнения нет. Float следует стандарту IEEE 754, что означает небольшие потери точности в десятичной арифметике.

Почему 0.1 + 0.2 не равно 0.3 в Python?

Потому что двоичные числа с плавающей точкой не могут точно представить большинство десятичных дробей. 0.1 + 0.2 даёт 0.30000000000000004. Это не баг Python — такое поведение у любого языка с IEEE 754. Для точной десятичной арифметики используй модуль decimal.

Что такое truthy и falsy значения в Python?

В булевом контексте Python многие значения считает истинными или ложными, даже если буквально это не True или False. Ноль, пустая строка, пустой список, пустой словарь и None — falsy; большинство остальных — truthy. if my_list: читается как «если в списке что-то есть».

Учитесь программировать с Coddy

НАЧАТЬ