Функция int с параметром base: перевод чисел из разных систем счисления
Функция int с параметром base: преобразование строк в числа с указанием основания
Основной способ: int(строка, основание)
Встроенная функция int() принимает второй аргумент base (основание системы счисления) и возвращает целое число, интерпретируя первый аргумент (строку) как число в указанной системе. Основание должно быть целым числом от 2 до 36. Цифры в строке могут включать символы 0-9 и буквы a-z или A-Z (для значений 10-35).
print(int('1010', 2)) # 10
print(int('FF', 16)) # 255
print(int('77', 8)) # 63
print(int('z', 36)) # 35Convert to int python (преобразование в int в python)
Особенности:
- Строка может начинаться со знака '+' или '-'.
- Пробелы в начале и конце игнорируются.
- Строка не должна содержать префиксов вроде
0b,0o,0x(они воспринимаются как часть числа и вызовут ошибку).
Как преобразовать шестнадцатеричную строку без префикса?
Если строка содержит только цифры и буквы, достаточно указать основание 16:
text = '1A3F'
num = int(text, 16)
print(num) # 6719Python int base (функция int с параметром base)
Цель:
Быстрое и надёжное преобразование, когда формат данных известен.
Что делать, если строка содержит префикс (0b, 0o, 0x)?
Прямой вызов int('0x1F', 16) вызовет ValueError, так как символ 'x' не является цифрой в 16-ричной системе. Необходимо удалить префикс перед преобразованием:
s = '0x1F'
clean = s[2:] if s.startswith(('0x', '0X')) else s
num = int(clean, 16)
print(num) # 31Для двоичных и восьмеричных префиксов аналогично:
s = '0b1010'
if s.startswith(('0b', '0B')):
s = s[2:]
print(int(s, 2)) # 10Цель:
Обработка данных, полученных из внешних источников или от пользователя, где префиксы могут присутствовать.
Как избежать ошибок при недопустимых символах в строке?
Если строка содержит символы, выходящие за пределы алфавита указанного основания, возникает ValueError. Решение - использовать try/except или предварительную проверку:
def safe_int(s, base):
try:
return int(s, base)
except ValueError:
return None
print(safe_int('123', 2)) # None
print(safe_int('101', 2)) # 5Проверка допустимости символов:
import string
def is_valid_for_base(s, base):
allowed = string.digits + string.ascii_lowercase[:base-10] if base > 10 else string.digits[:base]
return all(ch.lower() in allowed for ch in s.strip('+- '))
print(is_valid_for_base('1aB', 16)) # True
print(is_valid_for_base('1aG', 16)) # FalseЦель:
Повышение надёжности кода, работающего с пользовательским вводом или ненадёжными данными.
Что будет, если указать недопустимое основание?
Основание должно быть строго от 2 до 36. При base=1 или base=37 возникнет ValueError. Рекомендуется проверять основание перед вызовом:
def convert(s, base):
if base < 2 or base > 36:
raise ValueError("Основание должно быть от 2 до 36")
return int(s, base)
print(convert('10', 2)) # 2
print(convert('10', 37)) # ValueErrorЦель:
Гарантировать корректность аргументов и предотвратить неожиданные исключения.
Типичные проблемы и их решения
- ValueError: invalid literal for int() with base - возникает, если строка содержит символы, недопустимые для данного основания (например, '2' в двоичной системе). Решение: проверить строку на соответствие алфавиту или использовать
try/except. - ValueError: int() base must be >= 2 and <= 36, or 0 - происходит при
baseвне диапазона (включая 0, если не указан base). Решение: явно задавать base от 2 до 36. - Ошибка при наличии пробелов внутри строки - пробелы в середине строки недопустимы, только в начале/конце. Решение: удалить все пробелы:
s.replace(' ', ''). - Префиксы (0b, 0x) вызывают ошибку - Решение: отсекать префикс перед вызовом
int(). - Регистр букв - буквы в строке могут быть как заглавными, так и строчными. Решение: функция
int()принимает оба регистра, дополнительная нормализация не требуется.
Расширенные примеры использования int с параметром base
Преобразование числа из 36-ричной системы (максимальное основание)
Строка 'python' интерпретируется как число в 36-ричной системе: буква 'p' = 25, 'y' = 34, 't' = 29, 'h' = 17, 'o' = 24, 'n' = 23. Вычисление по формуле: 25*35^5 + 34*35^4 + 29*35^3 + 17*35^2 + 24*35 + 23.
num = int('python', 36)
print(num) # 1588111701Результат: 1588111701. Это может быть использовано для компактного кодирования данных.
Обработка отрицательных чисел
Знак минус перед строкой корректно обрабатывается:
print(int('-1010', 2)) # -10
print(int('-FF', 16)) # -255При этом строка не должна содержать пробелов между знаком и цифрами.
Преобразование строки с плюсом и пробелами
print(int(' + 10 ', 2)) # ValueError (пробел между + и 10)
# Правильно: убрать все пробелы
clean = ' +10 '.replace(' ', '')
print(int(clean, 2)) # 2Встроенный int() допускает только ведущие/замыкающие пробелы, не внутри строки.
Создание универсального конвертера с обработкой префиксов и основания
def flex_convert(s, default_base=10):
s = s.strip()
if s.startswith(('0b', '0B')):
base = 2
s = s[2:]
elif s.startswith(('0o', '0O')):
base = 8
s = s[2:]
elif s.startswith(('0x', '0X')):
base = 16
s = s[2:]
else:
base = default_base
return int(s, base)
print(flex_convert('0x1F')) # 31
print(flex_convert('0b1101')) # 13
print(flex_convert('77', 8)) # 63
print(flex_convert('python', 36)) # 1588111701Эта функция автоматически определяет основание по префиксу, а если его нет, использует указанное по умолчанию.
Преобразование числа в строку с основанием (обратное действие)
Хотя тема статьи - int(base), полезно показать обратную операцию. Для перевода числа в строку с произвольным основанием можно использовать встроенные функции bin(), oct(), hex() или написать свою:
def to_base(num, base):
digits = '0123456789abcdefghijklmnopqrstuvwxyz'
if num == 0:
return '0'
result = []
while num > 0:
result.append(digits[num % base])
num //= base
return ''.join(reversed(result))
print(to_base(10, 2)) # '1010'
print(to_base(255, 16)) # 'ff'
print(to_base(1588111701, 36)) # 'python'1010 ff python
Этот пример демонстрирует полный цикл преобразований.
Обработка ошибок при вводе с клавиатуры
user_input = input("Введите число в двоичной системе: ")
try:
value = int(user_input, 2)
print("Десятичное значение:", value)
except ValueError:
print("Ошибка: строка не является двоичным числом.")Программа предлагает пользователю ввести двоичное число, проверяет корректность и выводит результат. Без try/except ошибочный ввод прервёт выполнение.
Использование int(base) для парсинга логов
Предположим, лог содержит временные метки в 8-ричной системе. Извлечение и преобразование:
log_line = "time=0754 msg=start"
import re
match = re.search(r'time=(\d+)', log_line)
if match:
octal_time = match.group(1)
decimal_time = int(octal_time, 8)
print(decimal_time) # 492Результат 492 - десятичное значение восьмеричного числа 754.