Как определить целое число в Python: варианты проверки
Проверка на целое число в Python: основные подходы
Как надёжно проверить, является ли значение целым числом, не пропуская логические типы?
Наиболее безопасный и прямой способ - использовать встроенную функцию isinstance() с классом int, но с дополнительной проверкой на bool, потому что bool является подклассом int в Python. Пример:
def is_strict_int(value):
return isinstance(value, int) and not isinstance(value, bool)
print(is_strict_int(42)) # True
print(is_strict_int(True)) # False
print(is_strict_int(3.14)) # Falseопределить целое число python (определить, является ли число целым в python)
Если требуется только убедиться, что объект является int (включая bool), можно убрать второе условие. Однако чаще всего логические переменные не должны считаться числами.
Типичная ошибка: использование type(value) is int - это тоже работает, но не наследуется. Если есть класс-наследник от int, проверка не пройдёт. Для большинства случаев это приемлемо.
Как проверить, может ли строка быть преобразована в целое число?
Когда значение приходит из пользовательского ввода или файла, часто нужно проверить, можно ли строку интерпретировать как целое число. Самый гибкий способ - попробовать преобразование через int() внутри блока try/except:
def can_be_int(s):
try:
int(s)
return True
except (ValueError, TypeError):
return False
print(can_be_int("123")) # True
print(can_be_int("-5")) # True
print(can_be_int("12.3")) # False
print(can_be_int("abc")) # Falseчисло ли python (проверка, является ли значение числом в python)
Этот метод автоматически обрабатывает знаки, пробелы (в Python 3.10+ ведущие/замыкающие пробелы допускаются) и разные системы счисления (если передать base).
Проблемы: если строка содержит незначащие пробелы или символы, кроме цифр и знака, будет ошибка. Также учтите, что пустая строка или только знак вызовут ValueError.
Как проверить строку на целое число без исключений, только для неотрицательных?
Метод str.isdigit() возвращает True, если строка состоит только из цифр. Не работает для отрицательных чисел и чисел с плавающей точкой:
s = "123"
print(s.isdigit()) # True
s2 = "-123"
print(s2.isdigit()) # False
проверить int python (проверка на целое число в python)
Для проверки целого неотрицательного числа можно использовать isdigit() в комбинации с lstrip('-') для отрицательных, но тогда теряется различие с десятичными разделителями.
Ошибка: isdigit() возвращает True для строк с цифрами из других письменностей (например, арабские цифры восточные), которые int() не всегда может распарсить.
Как проверить число с плавающей точкой на целое значение?
Иногда требуется узнать, является ли число типа float целым (например, 5.0). Для этого используется метод float.is_integer():
value = 7.0
print(value.is_integer()) # True
value2 = 7.5
print(value2.is_integer()) # FalseКомбинируя с isinstance, можно написать универсальную проверку:
def is_integral_number(x):
if isinstance(x, int) and not isinstance(x, bool):
return True
if isinstance(x, float):
return x.is_integer()
return False
print(is_integral_number(5)) # True
print(is_integral_number(5.0)) # True
print(is_integral_number(5.5)) # FalseВажно: из-за погрешностей вычислений с плавающей точкой большие целые числа (например, 2**53+1) могут быть представлены неточно, и is_integer() может дать неожиданный результат.
Как использовать регулярные выражения для проверки строки на целое число?
Регулярное выражение ^[+-]?\d+$ соответствует строкам, состоящим из необязательного знака и одной или более цифр. Пример:
import re
pattern = re.compile(r'^[+-]?\d+$')
def is_int_str(s):
return bool(pattern.match(s))
print(is_int_str("42")) # True
print(is_int_str("-7")) # True
print(is_int_str("+0")) # True
print(is_int_str("007")) # True (восьмеричный стиль, но int допускает)
print(is_int_str("12.3")) # FalseЭтот метод не пытается преобразовать строку, поэтому он быстрее, чем try/except, если нужно проверить много строк. Однако он не обрабатывает пробелы и не учитывает контекст системы счисления.
Ошибка: если строка начинается с '+' или имеет ведущие нули, регулярное выражение пропустит их, тогда как int() может их интерпретировать по-разному в зависимости от Python (ведущие нули не разрешены в Python 3, кроме 0 и 0o, 0x и т.д.).
Дополнительные примеры проверки целого числа в Python
Рассмотрим более сложные и редко используемые случаи, а также работу с различными типами данных.
Проверка с учётом систем счисления (base)
Функция int() может принимать основание от 2 до 36. Можно проверить, является ли строка корректным целым числом в заданной системе счисления:
def can_be_int_base(s, base=10):
try:
int(s, base)
return True
except (ValueError, TypeError):
return False
print(can_be_int_base("1F", 16)) # True
print(can_be_int_base("1F")) # False (по умолчанию 10)
print(can_be_int_base("123", 2)) # False (цифры 2,3 недопустимы в двоичной системе)True False False
Проверка с использованием абстрактного базового класса numbers.Integral
Модуль numbers предоставляет абстрактные классы для числовых типов. Проверка через isinstance(x, numbers.Integral) вернёт True для всех целочисленных типов (int, bool, а также для пользовательских классов, реализующих интерфейс Integral).
import numbers
def is_integral_abc(x):
return isinstance(x, numbers.Integral)
print(is_integral_abc(5)) # True
print(is_integral_abc(True)) # True (bool подкласс Integral)
print(is_integral_abc(5.0)) # FalseTrue True False
Этот способ удобен, если нужно поддерживать пользовательские целочисленные классы. Однако он не исключает bool, если это необходимо.
Проверка больших целых чисел (отсутствие потери точности)
Целые числа в Python могут быть сколь угодно большими. Проверка на целое число для строки с очень большим числом работает корректно.
big_str = "1234567890123456789012345678901234567890"
# Проверка через int()
try:
val = int(big_str)
print(f"Успех: {val}")
except ValueError:
print("Не удалось преобразовать")Успех: 1234567890123456789012345678901234567890
Метод isdigit() тоже работает, но не гарантирует корректности для отрицательных чисел или чисел с пробелами.
Проверка целого числа в контексте пользовательского ввода (с учётом лидирующих/замыкающих пробелов)
Пользователь может случайно добавить пробелы. Функция int() в Python 3.10+ автоматически удаляет пробелы. Для более старых версий или дополнительной надёжности можно предварительно очистить строку:
def can_be_int_strip(s):
# Удаляем пробелы в начале и конце
s = s.strip()
if not s:
return False
# Проверка через try/except
try:
int(s)
return True
except ValueError:
return False
print(can_be_int_strip(" 42 ")) # True
print(can_be_int_strip(" -7 ")) # True
print(can_be_int_strip(" 12.3 ")) # FalseTrue True False
Такой подход предотвращает ложные срабатывания из-за невидимых символов.
Проверка с использованием pathlib для имён файлов (целые числа в названиях)
Иногда нужно проверить, является ли имя файла (без расширения) целым числом. Можно скомбинировать извлечение stem и проверку:
from pathlib import Path
def filename_is_int(filepath):
stem = Path(filepath).stem
return stem.isdigit() if stem else False
print(filename_is_int("42.txt")) # True
print(filename_is_int("-5.txt")) # False (isdigit не видит минус)
print(filename_is_int("abc.pdf")) # FalseTrue False False
Для отрицательных чисел в именах файлов нужно использовать более сложную логику (например, проверять наличие '-' в начале).
Проверка на целое число в массивах numpy
При работе с numpy массивами элементы могут быть типа numpy.int64 и т.п. Проверка через isinstance с int не сработает, так как это другой класс. Используйте numpy.issubdtype или проверку на отношение к целочисленным типам:
import numpy as np
def is_numpy_int(val):
# Проверка: является ли скалярным типом, являющимся целым
return isinstance(val, np.integer) or (np.isscalar(val) and isinstance(val, (int, np.integer)))
val1 = np.int32(10)
val2 = np.float32(5.0)
print(is_numpy_int(val1)) # True
print(is_numpy_int(val2)) # FalseTrue False
Для проверки всего массива можно использовать np.issubdtype(arr.dtype, np.integer).
Эти примеры покрывают большинство ситуаций, с которыми может столкнуться разработчик при проверке целых чисел в Python.