Эффективная проверка на целое число в Python с примерами

Раздел: Основы Python -> Алгоритмы проверки

Проверка на целое число в Python: основные методы и их применение

Проверка, является ли значение целым числом, часто требуется при обработке пользовательского ввода, валидации данных или написании математических алгоритмов. Python предоставляет несколько подходов, каждый из которых подходит для разных ситуаций. Рассмотрим наиболее эффективное решение, а затем альтернативные варианты.

Основной способ проверки, что переменная x является целым числом (тип int) и не является логическим значением (bool), - использование isinstance(x, int) с дополнительной проверкой на bool:

def is_integer(x):
    return isinstance(x, int) and not isinstance(x, bool)

# Примеры
print(is_integer(5))        # True
print(is_integer(-10))      # True
print(is_integer(True))     # False (так как True - это bool)
print(is_integer(3.0))      # False

Python проверка на целое (проверка на целое число в python)

Почему это эффективно? isinstance поддерживает наследование, но bool является подклассом int, поэтому без дополнительной проверки True и False ошибочно считались бы целыми числами. Данный метод работает быстро и не вызывает исключений.

Типичная ошибка: использование type(x) is int - оно не учитывает подклассы, но может быть предпочтительно, если нужно строгое совпадение типа. Однако type(x) is int вернёт False для объектов, наследующих от int, что в большинстве случаев является правильным поведением. Выбор между isinstance и type зависит от контекста.

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

При получении данных от пользователя или из файла часто нужно проверить, можно ли преобразовать строку в целое число. Надёжный способ - попробовать преобразовать с помощью int() и обработать исключение:

def is_int_string(s):
    try:
        int(s)
        return True
    except ValueError:
        return False

print(is_int_string("123"))       # True
print(is_int_string("-45"))       # True
print(is_int_string("12.3"))      # False
print(is_int_string("abc"))       # False

Проблемы: метод str.isdigit() не подходит, так как не обрабатывает знак минуса и пробелы. Например, "-5".isdigit() вернёт False. Использование int() корректно обрабатывает знак и игнорирует пробелы (при использовании strip()).

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

Иногда нужно определить, представляет ли вещественное число (тип float) целое значение без дробной части. Для этого используется метод is_integer():

def is_float_whole(x):
    if isinstance(x, float):
        return x.is_integer()
    return False

print(is_float_whole(3.0))    # True
print(is_float_whole(3.5))    # False
print(is_float_whole(3))      # False (так как это int, а не float)

Метод is_integer() работает только для float, поэтому предварительно проверяется тип. Для больших чисел могут возникнуть проблемы с точностью (например, 1e100 всегда считается целым).

Как проверить, что число является целым и удовлетворяет дополнительным условиям (например, положительное)?

Часто требуется не просто проверить тип, но и наложить ограничения на значение. Можно комбинировать проверку типа и диапазона:

def is_positive_integer(x):
    return isinstance(x, int) and not isinstance(x, bool) and x > 0

def is_integer_in_range(x, low, high):
    return isinstance(x, int) and not isinstance(x, bool) and low <= x <= high

print(is_positive_integer(7))       # True
print(is_positive_integer(-3))      # False
print(is_integer_in_range(5, 1, 10)) # True

Такие проверки полезны при валидации возраста, количества предметов и т.п.

Распространённая ошибка: путать проверку типа и проверку значения. Например, if x может неявно преобразовывать 0 к False, что приведёт к неверному результату. Всегда используйте явные проверки.

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

Пример 1. Проверка ввода пользователя с помощью цикла

Пример
def get_integer(prompt):
    while True:
        value = input(prompt).strip()
        try:
            num = int(value)
            return num
        except ValueError:
            print("Ошибка: введите целое число")

# Пример использования
age = get_integer("Введите ваш возраст: ")
print(f"Возраст {age} сохранён")
Введите ваш возраст: двадцать
Ошибка: введите целое число
Введите ваш возраст: 25
Возраст 25 сохранён

Пример 2. Фильтрация целых чисел из смешанного списка

Пример
def filter_integers(mixed_list):
    return [x for x in mixed_list if isinstance(x, int) and not isinstance(x, bool)]

data = [1, 2.5, True, "abc", -7, 0, 42]
integers = filter_integers(data)
print(integers)  # [1, -7, 0, 42]

Пример 3. Проверка строки на целое число с учётом основания системы счисления

Пример
def is_int_in_base(s, base=10):
    try:
        int(s, base)
        return True
    except (ValueError, TypeError):
        return False

print(is_int_in_base("FF", 16))  # True (255)
print(is_int_in_base("377", 8)) # True (255)
print(is_int_in_base("10", 2))  # True (2)

Пример 4. Проверка, является ли число целым с помощью модуля fractions

Пример
from fractions import Fraction

def is_whole_number(num):
    if isinstance(num, Fraction):
        return num.denominator == 1
    elif isinstance(num, float):
        return num.is_integer()
    elif isinstance(num, complex):
        return num.real.is_integer() and num.imag == 0
    else:
        return isinstance(num, int) and not isinstance(num, bool)

print(is_whole_number(Fraction(10, 2)))  # True (5)
print(is_whole_number(Fraction(1, 3)))   # False
print(is_whole_number(3+0j))             # True

Пример 5. Использование регулярного выражения для проверки строки на целое число

Пример
import re

def is_int_regex(s):
    return bool(re.fullmatch(r'-?\d+', s.strip()))

print(is_int_regex("  -42 "))  # True
print(is_int_regex("0123"))    # True
print(is_int_regex("12.3"))    # False

Регулярное выражение -?\d+ допускает необязательный знак минуса и одну или более цифр. Такой подход может быть быстрее try-except на очень больших строках, но менее гибок в обработке переполнения.

Пример 6. Проверка целого числа с учётом типа Decimal

Пример
from decimal import Decimal

def is_decimal_integer(d):
    if not isinstance(d, Decimal):
        return False
    return d == d.to_integral_value()

print(is_decimal_integer(Decimal('10.000')))  # True
print(is_decimal_integer(Decimal('10.001'))) # False

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

En
Python проверка на целое (python)