Проверка, что число целое: примеры и решения
В 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.