Эффективная проверка на целое число в 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)) # FalsePython проверка на целое (проверка на целое число в 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