Является ли значение числом в Python? Инструкция с примерами

Раздел: Типы данных -> Проверка типов

Проверка, является ли значение числом в Python

Наиболее эффективный и рекомендуемый способ проверки, является ли значение числовым типом в Python - использование функции isinstance() с кортежем встроенных числовых классов: int, float, complex. Этот метод работает для всех стандартных чисел, включая целые, вещественные и комплексные. Он не пытается преобразовать значение, а просто проверяет его тип.

def is_number(value):
    return isinstance(value, (int, float, complex))

# Примеры
print(is_number(42))         # True
print(is_number(3.14))       # True
print(is_number(1+2j))       # True
print(is_number("123"))      # False – строка
print(is_number(None))       # False

определить целое число python (определить, является ли число целым в python)

Проблема: isinstance() не распознает пользовательские числовые классы (например, из библиотек numpy, decimal), если они явно не наследуются от встроенных типов. Для расширенной поддержки следует использовать модуль numbers.

Как проверить тип через type()?

Альтернативный способ - сравнение результата type(x) с кортежем типов. Он подходит, когда нужно отличить именно встроенные типы без учета наследования.

def is_number_type(value):
    return type(value) in (int, float, complex)

число ли python (проверка, является ли значение числом в python)

Проблема: Этот вариант не сработает для объектов, унаследованных от числовых типов (например, подкласс int вернёт False). Он также не охватывает типы из сторонних библиотек.

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

Для строк часто требуется проверить, можно ли преобразовать содержимое в число. Используйте метод str.isdigit() для целых неотрицательных чисел или попытку преобразования через float() в блоке try/except.

def is_string_number(s):
    try:
        float(s)
        return True
    except ValueError:
        return False

print(is_string_number("123"))      # True
print(is_string_number("-3.14"))    # True
print(is_string_number("12abc"))    # False

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

Проблема: float() принимает такие строки как "inf", "-inf", "nan", что может быть нежелательно. Для строгого контроля используйте дополнительную проверку.

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

Модуль numbers предоставляет иерархию для числовых типов. numbers.Number - корневой класс для всех чисел, включая пользовательские реализации, которые регистрируются как числа.

import numbers

def is_number_abstract(value):
    return isinstance(value, numbers.Number)

# Работает с int, float, complex, Decimal, Fraction и т.д.
from decimal import Decimal
from fractions import Fraction
print(is_number_abstract(Decimal('0.1')))  # True
print(is_number_abstract(Fraction(1,3)))   # True

Проблема: numbers.Number включает булевы значения (True/False), так как bool является подклассом int. Если это неприемлемо, добавьте проверку not isinstance(value, bool).

Как проверить, является ли значение конкретным числовым типом (например, только int или float)?

Используйте isinstance() с одним типом или комбинацией. Например, чтобы исключить комплексные числа:

def is_real_number(value):
    return isinstance(value, (int, float))

print(is_real_number(1+2j))  # False

Как отличить NaN или бесконечность от обычного числа?

Используйте функции math.isnan() и math.isinf(). Если нужно считать такие значения некорректными, дополнительно отфильтруйте их.

import math

def is_finite_number(value):
    if not isinstance(value, (int, float)):
        return False
    if math.isnan(value) or math.isinf(value):
        return False
    return True

print(is_finite_number(float('nan')))   # False
print(is_finite_number(1.0))            # True

Проблема: math.isnan() и math.isinf() работают только с float, для других типов (например, Decimal) потребуются соответствующие методы.

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

1. Проверка элементов списка на числа

Пример
data = [1, 2.5, "3", None, [1,2], 1+2j, True]

def is_number(value):
    import numbers
    return isinstance(value, numbers.Number) and not isinstance(value, bool)

result = [is_number(x) for x in data]
print(result)  # [True, True, False, False, False, True, False]
[True, True, False, False, False, True, False]

2. Проверка строк на число с поддержкой экспоненциальной записи

Пример
def is_string_numeric(s):
    """Проверяет, можно ли интерпретировать строку как число (int/float)."""
    try:
        float(s)
        return True
    except ValueError:
        return False

tests = ["123", "-45.6", "7e10", "  8.9  ", "0xFF", "12,34"]
for t in tests:
    print(f"'{t}' -> {is_string_numeric(t)}")
'123' -> True
'-45.6' -> True
'7e10' -> True
'  8.9  ' -> True
'0xFF' -> False (не число, это шестнадцатеричная запись)
'12,34' -> False (запятая вместо точки)

3. Проверка типов из библиотеки numpy

Пример
import numpy as np
import numbers

def is_numpy_number(value):
    # numpy-числа наследуются от numbers.Number или имеют dtype
    return isinstance(value, numbers.Number) or hasattr(value, 'dtype')

arr = np.array([1, 2.0, np.nan, np.inf], dtype=np.float64)
for v in arr:
    print(v, is_numpy_number(v))
1.0 True
2.0 True
nan True
inf True

4. Проверка на число с учётом Decimal и Fraction

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

values = [Decimal('0.1'), Fraction(1,3), complex(1,2), 100]
for v in values:
    result = isinstance(v, numbers.Number)
    print(f"{v!r:20} -> {result}")
Decimal('0.1')          -> True
Fraction(1, 3)          -> True
(1+2j)                  -> True
100                     -> True

5. Исключение булевых значений из числовых проверок

Пример
def is_number_exclude_bool(value):
    import numbers
    return isinstance(value, numbers.Number) and not isinstance(value, bool)

tests = [True, False, 1, 0, 1.0, 0+0j]
for t in tests:
    print(f"{t!r:10} -> {is_number_exclude_bool(t)}")
True       -> False
False      -> False
1          -> True
0          -> True
1.0        -> True
0j         -> True

6. Проверка на число с дополнительным контролем NaN и бесконечности

Пример
import math
import decimal

def is_finite(strict=False):
    """Возвращает функцию-предикат для проверки конечности."""
    def check(value):
        if not isinstance(value, (int, float, decimal.Decimal)):
            return False
        if isinstance(value, float):
            return not (math.isnan(value) or math.isinf(value))
        if isinstance(value, decimal.Decimal):
            return value.is_finite()
        return True
    return check

is_finite_num = is_finite()
values = [1, float('nan'), decimal.Decimal('Infinity'), 3.14, 'abc']
for v in values:
    print(f"{v!r:25} -> {is_finite_num(v)}")
1                         -> True
nan                       -> False
Infinity                  -> False
3.14                      -> True
'abc'                     -> False

Проверка, является ли значение числом в Python - comments

En
число ли python (python)