Как определить целое число в 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))     # False
True
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  "))  # False
True
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"))      # False
True
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))  # False
True
False

Для проверки всего массива можно использовать np.issubdtype(arr.dtype, np.integer).

Эти примеры покрывают большинство ситуаций, с которыми может столкнуться разработчик при проверке целых чисел в Python.

Проверка на целое число в Python - comments

En
проверить int python (python)