str ↔ int и ведущие нули
1 2 3 4 5
Одна и та же запись + делает совершенно разные вещи. Поэтому первый вопрос при любой ошибке — «а что у меня сейчас: строка или число?». Проверяется мгновенно: print(type(x)).
Зачем переключаться туда-сюда
| Что нужно сделать | Через что удобнее |
|---|---|
| посмотреть цифры по одной | строка: for c in str(n) |
| приписать разряды справа | строка: s + "11" |
| посчитать количество цифр | строка: len(str(n)) |
| сравнить по величине | число: int(a) > int(b) |
| посчитать сумму, произведение | число: int(c) для каждой цифры |
Ведущие нули теряются
1 2
Число не хранит ведущие нули: 007 и 7 — это одно и то же значение. Если по условию нужна запись фиксированной длины, нули придётся дописать вручную.
Как вернуть ведущие нул
1 2 3 4
zfill(k) дополняет строку нулями слева до длины k. Формат f"{n:03d}" делает то же, но умеет сразу переводить в двоичную (b), восьмеричную (o) и шестнадцатеричную (x) запись.
Пример с ЕГЭ: задание 5 — запись фиксированной длины
Формулировка вроде: «Двоичная запись числа дополняется слева нулями до восьми разрядов…». Здесь без выравнивания не обойтись — и обычный bin не подойдёт, потому что нулей слева он не ставит
1 2 3 4 5
Главное здесь — то, что запись остаётся строкой, пока идут манипуляции с разрядами, и превращается в число только на финальном int(s, 2).
Подводный камень: строки сравниваются по алфавиту
1 2 3 4
Числа, прочитанные из файла, — это строки. Пока не сделан int, любая сортировка и любой max работают по алфавиту, а не по величине.
Что int умеет и чего не умеет
| Вызов | Результат |
|---|---|
| int("42") | 42 |
| int(" 42 ") | 42 — пробелы по краям отбрасываются |
| int("-42") | -42 |
| int("42.0") | ValueError — точку не понимает |
| int("4 2") | ValueError — пробел внутри |
| int(42.9) | 42 — дробная часть отбрасывается |
Для строки с точкой сначала нужен float: int(float("42.0")).
