Работа с функцией int() для получения целых чисел
Преобразование данных в целое число (тип 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