Функция int с параметром base: перевод чисел из разных систем счисления

Раздел: Основы Python -> Целые числа

Функция 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))    # 35

Convert to int python (преобразование в int в python)

Особенности:

  • Строка может начинаться со знака '+' или '-'.
  • Пробелы в начале и конце игнорируются.
  • Строка не должна содержать префиксов вроде 0b, 0o, 0x (они воспринимаются как часть числа и вызовут ошибку).

Как преобразовать шестнадцатеричную строку без префикса?

Если строка содержит только цифры и буквы, достаточно указать основание 16:

text = '1A3F'
num = int(text, 16)
print(num)  # 6719

Python 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.

Функция int с параметром base - comments

En
Python int base (python)