Два вида чисел и один вид истины
Числовые типы, которые ты будешь использовать каждый день, — int и float, плюс bool для истина/ложь. Этого достаточно почти для всей арифметики и логики, нужной обычной Python-программе.
Python иногда называет булевы подтипом целых — True буквально равен 1, а False — 0, — что открывает пару полезных трюков дальше.
Целочисленная арифметика
Целые в Python никогда не переполняются. Звучит неважно, пока ты не напишешь первую функцию факториала и не поймёшь, что в большинстве других языков результат тихо уехал бы в отрицательные.
Оба выражения дают точные ответы, как бы велики они ни были. Единственный потолок — память.
Арифметические операторы — те, что ожидаешь, плюс пара бонусных:
Три вещи из этого списка стоит запомнить:
/всегда возвращает float в Python 3, даже когда обе стороны — целые.10 / 2даст тебе5.0, а не5. Нужно целое — используй//.//округляет в сторону минус бесконечности, так что-7 // 2— это-4, а не-3. Необычно, но последовательно.%даёт остаток, и он удобен для «чётно ли это число?» (n % 2 == 0) и для обвёртывания в фиксированный диапазон.
Float и его знаменитая ловушка
Float-ы несовершенны по задумке. Они хранятся в двоичной форме, которая не может точно представить большинство десятичных дробей. Учебниковый пример:
Первая строка печатает 0.30000000000000004. Вторая — False. В любом языке, следующем стандарту IEEE 754 — Python, JavaScript, Java, C — поведение такое же. Это не баг Python.
На практике это означает две вещи:
- Не сравнивай float через
==. Если нужно «достаточно близко» — используйmath.isclose(a, b)или проверьabs(a - b) < some_tolerance. - Для денег используй
decimal.Decimal. Модульdecimalиз стандартной библиотеки даёт точную десятичную арифметику — никаких сюрпризов вроде0.1 + 0.2. Он медленнее float, поэтому и не используется по умолчанию, но для валюты — правильный выбор.
Преобразования между числовыми типами
Python не будет молча превращать целое в строку или строку в число. Ты просишь об этом явно:
Недопустимые преобразования поднимают ValueError:
>>> int("hello")
ValueError: invalid literal for int() with base 10: 'hello'
Сообщение об ошибке прямолинейно и его легко отработать. Почисти ввод или перехвати исключение.
Булевы чуть подробнее
True и False — два булевых значения, написанные ровно так, с заглавной буквы в начале. Большинство сравнений дают одно из них:
Булевы операторы — and, or и not, записанные английскими словами, а не символами:
Одна полезная тонкость: and и or не обязательно возвращают True или False — они возвращают значение, которое решило выражение. 0 or "fallback" даёт "fallback"; 5 and 10 даёт 10. Это позволяет писать короткие дефолты вроде name = user_input or "anonymous", но этот факт полезно помнить и тогда, когда булева проверка неожиданно возвращает не тот тип.
Truthy и falsy
Python считает многие значения «истинными» или «ложными», когда ты используешь их в булевом контексте вроде if или while. Falsy-значения такие:
False0,0.0None- Пустые контейнеры:
"",[],{},set(),()
Всё остальное — truthy. Это позволяет писать более естественно выглядящие проверки:
Читай if name: как «если в name что-то есть». Гораздо чище, чем if name != "":. Только с числами осторожнее — if count: воспримет 0 как «пропустить», и это обычно, но не всегда, то, чего ты хочешь. Если ноль — легитимное значение, лучше if count is not None:.
Булева арифметика
Поскольку булевы и есть целые, над ними можно делать арифметику:
Этот трюк всплывает достаточно часто, чтобы отложить в копилку. Если хочешь посчитать, сколько элементов списка проходят некоторый тест — суммируй генератор булевых:
Практические выводы
- Целые не переполняются. Пользуйся свободно.
/возвращает 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: читается как «если в списке что-то есть».