Работа с функцией int() для получения целых чисел

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

Преобразование данных в целое число (тип int) – базовая операция в Python. Встроенная функция int() позволяет конвертировать различные типы данных, включая строки, числа с плавающей точкой, логические значения, а также объекты, поддерживающие протокол целых чисел. В этом разделе рассмотрены основные и альтернативные способы, их особенности, типичные ошибки и способы их предотвращения.

Основные способы преобразования в int

Как преобразовать строку или число в целое число с помощью функции int() без дополнительных параметров?

Наиболее простой и распространенный способ – вызов int(x), где x может быть строкой, содержащей десятичное число, целым числом, числом с плавающей точкой, логическим значением или объектом, реализующим __int__(). Если x – строка, она должна состоять только из цифр (с возможным ведущим знаком + или -) и не содержать посторонних символов, кроме пробелов в начале и конце.

int('42')      # строка
int(42)        # целое число
int(3.99)      # число с плавающей точкой
int(True)      # логическое значение

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

42
42
3
1

Python int base (функция int с параметром base)

Типичная ошибка: ValueError при попытке преобразовать строку, содержащую нецифровые символы, например int('42a'). Другая ошибка – TypeError, если аргумент не поддерживает преобразование (например, список).

Решение: предварительная проверка с помощью str.isdigit() (но не учитывает знак) или использование блока try-except.

Как преобразовать строку с указанием системы счисления (двоичной, восьмеричной, шестнадцатеричной)?

Функция int(x, base) принимает второй необязательный аргумент base – основание системы счисления от 2 до 36. Если base указан, строка x должна содержать допустимые символы для данной системы (например, '0' и '1' для двоичной, '0'-'9','a'-'f' для шестнадцатеричной).

int('1010', 2)      # двоичная -> 10
int('777', 8)       # восьмеричная -> 511
int('FF', 16)       # шестнадцатеричная -> 255
int('z', 36)        # основание 36 -> 35
10
511
255
35

Ошибка: ValueError если строка содержит символы, недопустимые для данного основания, или если основание выходит за пределы 2..36. Также строка не должна содержать префиксов, таких как '0x' или '0b' – они не распознаются автоматически; их нужно удалять.

Решение: для строк с префиксами можно использовать int(x, 0) – в этом случае Python определяет основание по префиксу (0x, 0o, 0b).

Как преобразовать число с плавающей точкой, отбросив дробную часть?

Вызов int(3.14) возвращает целое число, отбрасывая дробную часть (усечение в сторону нуля). Для положительных чисел это эквивалентно math.floor(), для отрицательных – math.ceil().

int(3.14)
int(-3.14)
int(3.99)
3
-3
3

Если требуется округление по математическим правилам, необходимо использовать round() или math.floor()/math.ceil() перед преобразованием.

Как преобразовать логическое значение True/False в целое число?

Тип bool является подклассом int, поэтому int(True) возвращает 1, int(False) – 0. Это часто используется для подсчёта истинных утверждений.

int(True)
int(False)
sum([True, False, True])
1
0
2

Ошибок не возникает, но стоит помнить, что bool наследует от int, поэтому операции с bool и int смешиваются.

Как преобразовать объект bytes или bytearray в целое число?

Для bytes и bytearray функция int() работает только если объект содержит строковое представление числа (например b'42') и при условии, что base не указан. Если нужно интерпретировать байты как число в двоичном представлении, используется int.from_bytes().

int(b'42')          # строка байтов
int(b'1010', 2)     # ошибка? на самом деле int(b'1010', 2) тоже работает
# Для больших данных:
data = b'\x00\x10'
int.from_bytes(data, byteorder='big')
42
10
16

Ошибка: если байты содержат не ASCII цифры, возникнет ValueError. Также int.from_bytes требует указания порядка байтов.

Как преобразовать строку с ведущими или завершающими пробелами?

Функция int() автоматически игнорирует пробелы в начале и конце строки. Пробелы внутри строки (например, '42 42') вызывают ошибку.

int('  42  ')
int('+42')
42
42

Пробелы между знаком и цифрами не допускаются: int('+ 42') вызовет ValueError.

Как преобразовать пользовательский объект, реализующий метод __int__?

Если класс определяет метод __int__(self), то экземпляр этого класса может быть передан в int(). Метод должен возвращать целое число.

class MyNumber:
    def __init__(self, val):
        self.val = val
    def __int__(self):
        return int(self.val)

obj = MyNumber('123')
int(obj)
123

Если метод __int__ не определён, возникает TypeError. Исключение также будет, если __int__ возвращает не целое число.

Расширенные примеры

Преобразование списка строк в целые числа с обработкой ошибок

Пример
data = ['42', '3.14', 'abc', '101', '0xFF']
integers = []
for item in data:
    try:
        # для шестнадцатеричной строки с префиксом используем base=0
        if item.startswith('0x') or item.startswith('0X'):
            integers.append(int(item, 0))
        else:
            integers.append(int(item))
    except ValueError:
        integers.append(None)  # или пропустить
print(integers)
[42, None, None, 101, 255]

Использование int() с функцией map для массового преобразования

Пример
str_nums = ['1', '2', '3']
int_nums = list(map(int, str_nums))
print(int_nums)
# map с lambda для обработки разных систем
mixed = ['12', '0x1F', '0b1101']
converted = list(map(lambda x: int(x, 0) if x.startswith('0') else int(x), mixed))
print(converted)
[1, 2, 3]
[12, 31, 13]

Преобразование строки с разделителями тысяч

Пример
price = '1,234,567'
# int() не принимает запятые, нужно удалить
clean = price.replace(',', '')
value = int(clean)
print(value)
# или с использованием re
import re
price2 = '1,234,567.00'  # с дробной частью
clean2 = re.sub(r'[^\d]', '', price2.split('.')[0])
value2 = int(clean2)
print(value2)
1234567
1234567

Преобразование больших чисел из двоичной строки

Пример
binary_str = '1010101010101010101010101010101010101010'
big_int = int(binary_str, 2)
print(big_int)
# обратно в двоичную строку: bin(big_int)
18325193796285370

Использование int.from_bytes для декодирования бинарных данных

Пример
# Интерпретация 4 байт как 32-битное целое со знаком (big-endian)
import struct
data = b'\x00\x00\x00\x2A'
value = int.from_bytes(data, byteorder='big', signed=False)
print(value)
# то же самое через struct.unpack
value2 = struct.unpack('>I', data)[0]
print(value2)
42
42

Преобразование дробной части строки (например, '0.5') в целое через округление

Пример
s = '12.7'
# сначала преобразовать в float, затем int с округлением
rounded = int(round(float(s)))
print(rounded)
# или использовать Decimal для точности
from decimal import Decimal
d = Decimal('12.7')
rounded_dec = int(d.to_integral_value(rounding='ROUND_HALF_UP'))
print(rounded_dec)
13
13

Проверка возможности преобразования с помощью try-except

Пример
def safe_int(value, default=None):
    try:
        return int(value)
    except (ValueError, TypeError):
        return default

print(safe_int('42'))
print(safe_int('abc', 0))
print(safe_int([1,2], -1))
42
0
-1

Преобразование в int в Python - comments

En
Convert to int python (python)