Два вида чисел и один вид истины
Числовые типы, которые ты будешь использовать каждый день, - 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: читается как «если в списке что-то есть».