Проверка, что число целое: примеры и решения

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

В Python часто возникает необходимость определить, является ли переменная целым числом (int). Это может понадобиться при валидации данных, математических операциях или написании универсальных функций. Рассмотрим несколько способов проверки с примерами кода и описанием ситуаций, в которых каждый из них уместен.

Основной способ: isinstance(x, int)

Самый простой и производительный метод - использование встроенной функции isinstance(). Она проверяет, принадлежит ли объект указанному классу (или его подклассам).

x = 42
print(isinstance(x, int))  # True

строка является числом python (проверка, является ли строка числом (isdigit, try/except) в python)

True

является ли число целым python (проверка, является ли число целым (int) в python)

Однако стоит помнить, что bool является подклассом int в Python. Поэтому:

print(isinstance(True, int))  # True
True

Проблема: если нужно строго различать целые числа и булевы значения, следует использовать type(x) is int. Функция isinstance() часто применяется в коде, но не различает int и bool, что может быть нежелательно.

Как проверить, что переменная является int, но не bool?

Для строгого различения используется сравнение типов через type():

x = 10
y = False
print(type(x) is int)   # True
print(type(y) is int)   # False

Как проверить, является ли число с плавающей точкой целым?

Для объектов float существует метод is_integer(), возвращающий True, если дробная часть равна нулю.

a = 5.0
b = 5.5
print(a.is_integer())   # True
print(b.is_integer())   # False

Для универсальной проверки (и int, и float) можно написать условие:

def is_whole_number(n):
    return isinstance(n, int) or (isinstance(n, float) and n.is_integer())

Как проверить целочисленность через остаток от деления?

Математический подход: любое целое число при делении на 1 даёт остаток 0. Это работает и для int, и для float.

print(7.0 % 1 == 0)   # True
print(7.5 % 1 == 0)   # False
print(10 % 1 == 0)    # True

Как проверить, является ли строка целым числом?

Для строк часто применяется преобразование в int с обработкой исключения ValueError.

s = "123"
try:
    int(s)
    print("Строка представляет целое число")
except ValueError:
    print("Не является целым числом")

Обратите внимание: int() не принимает строки с десятичной точкой или пробелами. Для вещественных чисел нужно сначала преобразование в float и последующая проверка is_integer().

Как использовать абстрактные базовые классы для проверки целочисленности?

Модуль numbers предоставляет класс Integral. Проверка через isinstance() с этим классом охватывает все встроенные целые типы и пользовательские классы, реализующие протокол __index__.

from numbers import Integral
print(isinstance(42, Integral))      # True
print(isinstance(True, Integral))    # True (bool - подкласс int)
print(isinstance(4.0, Integral))     # False (float не реализует Integral)

Можно ли определить целое число с помощью операций округления?

Сравнение числа с результатом математических функций math.floor() или math.ceil() также даёт возможность проверить целочисленность.

import math
x = 5.0
print(math.floor(x) == x)  # True
x = 5.5
print(math.floor(x) == x)  # False
print(math.ceil(x) == x)   # False

Расширенные примеры проверки целого числа

В данном разделе приведены более сложные сценарии, которые могут встретиться на практике. Все примеры снабжены кодом и выводом.

Универсальная функция для проверки целочисленного значения

Функция is_integer_value обрабатывает int, float, Decimal, Fraction и строки.

Пример
from decimal import Decimal
from fractions import Fraction

def is_integer_value(value):
    if isinstance(value, int):
        return True
    if isinstance(value, float):
        return value.is_integer()
    if isinstance(value, (Decimal, Fraction)):
        return value % 1 == 0
    if isinstance(value, str):
        try:
            float(value)  # сначала пробуем float
            return float(value).is_integer()
        except ValueError:
            return False
    return False

print(is_integer_value(10))          # True
print(is_integer_value(3.0))         # True
print(is_integer_value(3.5))         # False
print(is_integer_value(Decimal('2.0')))   # True
print(is_integer_value(Fraction(8,4)))    # True
print(is_integer_value("7"))             # True
print(is_integer_value("7.2"))           # False
True
True
False
True
True
True
False

Проверка всех элементов списка на целочисленность

Пример
def all_integers(lst):
    return all(isinstance(x, int) for x in lst)

print(all_integers([1, 2, 3]))        # True
print(all_integers([1, 2.0, 3]))      # False (2.0 - float, не int)
True
False

Проверка целого числа с учётом погрешности вычислений с плавающей точкой

Из-за ошибок округления результат 0.1 + 0.2 не равен 0.3. При проверке на целочисленность таких чисел используйте допуск.

Пример
import math
def is_close_to_integer(x, tol=1e-9):
    return abs(x - round(x)) < tol

print(is_close_to_integer(0.1 + 0.2))   # False (0.30000000000000004)
print(is_close_to_integer(0.3))         # False (на самом деле 0.3 не точно)
print(is_close_to_integer(1.0000000001))# True (в пределах допуска)
False
False
True

Использование модуля numbers для проверки произвольного целого типа

Пример
from numbers import Integral
class MyInt:
    def __index__(self):
        return 100

obj = MyInt()
print(isinstance(obj, Integral))  # True, так как реализован __index__
print(isinstance("123", Integral)) # False
True
False

Проверка ввода пользователя с помощью регулярного выражения

Пример
import re
def is_integer_string(s):
    return bool(re.fullmatch(r'-?\d+', s))

print(is_integer_string("-42"))    # True
print(is_integer_string("+42"))    # False (знак + не допускается)
print(is_integer_string("042"))    # True (ведущие нули разрешены)
True
False
True

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

Проверка, является ли число целым (int) в Python - comments

En
является ли число целым python (python)