Методы определения числа в Python

Раздел: Основы Python -> Типы данных

Основное решение: проверка с помощью isinstance и numbers.Number

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

import numbers

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

# Примеры:
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

Set str python (множество из строки в python)

Важное замечание: bool является подклассом int, поэтому True и False также будут считаться числами. Если требуется исключить булевы значения, используйте дополнительную проверку:

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

print(is_number_exclude_bool(True))  # False
print(is_number_exclude_bool(1))     # True

Python переменная время (переменные для времени в python)

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

Используйте type() и сравнение с кортежем типов:

def is_int_or_float(value):
    return type(value) in (int, float)

print(is_int_or_float(100))    # True
print(is_int_or_float(5.5))    # True
print(is_int_or_float(True))   # False (bool не входит)
print(is_int_or_float(1+2j))   # False (complex не учитывается)

Python типы данных время (типы данных для времени в python)

Проблема: не учитываются complex, Decimal, Fraction. Решение - расширять кортеж типов или использовать isinstance.

Как проверить, можно ли преобразовать строку в число?

Попробуйте привести строку к float() или int() внутри блока try-except:

def is_convertible_to_number(s):
    try:
        float(s)
        return True
    except (ValueError, TypeError):
        return False

print(is_convertible_to_number('123'))        # True
print(is_convertible_to_number('3.14'))       # True
print(is_convertible_to_number('1e-5'))       # True (научная нотация)
print(is_convertible_to_number('abc'))        # False
print(is_convertible_to_number(''))           # False
print(is_convertible_to_number('  '))         # False (строка с пробелами)

Python объект тип (тип объекта в python)

Ошибка: float('NaN') вернёт nan без исключения, хотя это специальное значение с плавающей точкой. Аналогично 'Inf'. Если нужно считать их не числами, добавьте проверку на math.isnan() и math.isinf().

Как проверить, что строка состоит только из цифр (целое положительное число)?

Метод строк isdigit() подходит для целых неотрицательных чисел без знака:

print('123'.isdigit())   # True
print('-5'.isdigit())    # False (есть минус)
print('12.3'.isdigit())  # False (есть точка)
print(''.isdigit())       # False

вещественные значения python (вещественные значения в python)

Ограничения: не работает с отрицательными, дробными, научной нотацией, а также с числами в других системах счисления (например, '0x10').

Как проверить, что значение является числом с плавающей точкой, но не бесконечностью и не NaN?

Сначала проверьте тип float, затем функции math.isfinite():

import math

def is_finite_float(value):
    return isinstance(value, float) and math.isfinite(value)

print(is_finite_float(3.14))       # True
print(is_finite_float(float('inf'))) # False
print(is_finite_float(float('nan'))) # False

вывести тип данных python (вывод типа данных в python)

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

Используйте isinstance с complex:

def is_complex(value):
    return isinstance(value, complex)

print(is_complex(1+2j))   # True
print(is_complex(3+0j))   # True
print(is_complex(5))       # False

Python двоичные данные (работа с двоичными данными в python)

Как проверить, что значение является числом любого типа, включая Decimal и Fraction из стандартной библиотеки?

Абстрактный класс numbers.Number является базовым для всех числовых типов, включая decimal.Decimal и fractions.Fraction:

import numbers
from decimal import Decimal
from fractions import Fraction

print(isinstance(Decimal('10.5'), numbers.Number))  # True
print(isinstance(Fraction(3, 4), numbers.Number))   # True
print(isinstance('abc', numbers.Number))            # False
- логические значения python (логические значения в python)
- длина переменной python (длина числа и переменной в python)
- определение объекта python (определение типа объекта в python)

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

Проверка с использованием регулярных выражений (для строк)

Регулярное выражение позволяет учесть знак, десятичную точку, научную нотацию:

Пример
import re

def is_number_regex(s):
    pattern = r'^[+-]?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?$'
    return bool(re.match(pattern, s.strip()))

print(is_number_regex('3.14'))     # True
print(is_number_regex('-2.5e10'))  # True
print(is_number_regex('.5'))        # True
print(is_number_regex('5.'))        # True
print(is_number_regex('+1.23E-4')) # True
print(is_number_regex('abc'))       # False
print(is_number_regex(''))          # False

Проверка с учётом Decimal и дробей Fraction

Если нужно строго убедиться, что значение является экземпляром Decimal или Fraction, а не просто числом:

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

def is_decimal(value):
    return isinstance(value, Decimal)

def is_fraction(value):
    return isinstance(value, Fraction)

d = Decimal('10.5')
f = Fraction(1, 3)
print(is_decimal(d))   # True
print(is_decimal(f))   # False
print(is_fraction(f))  # True

Проверка числовых массивов NumPy

При работе с библиотекой NumPy тип элемента может быть numpy integer или numpy float. Универсальная проверка - через np.issubdtype:

Пример
import numpy as np

def is_numpy_number(value):
    return np.issubdtype(type(value), np.number)

arr = np.array([1, 2, 3])
print(is_numpy_number(arr[0]))          # True (numpy.int64)
print(is_numpy_number(np.float32(3.5))) # True
print(is_numpy_number(5))               # False (int не является подтипом np.number)

# Для обычных чисел тоже сработает, если передать np.dtype:
def is_any_number(value):
    try:
        return np.issubdtype(np.dtype(type(value)), np.number)
    except TypeError:
        return False

print(is_any_number(5))           # True
print(is_any_number(3.14))        # True
print(is_any_number('abc'))       # False

Результат:

True
True
False
True
True
False

Кастомная функция для строгой проверки, исключающая bool и учитывающая NaN/Inf

Объединяет несколько условий:

Пример
import math
import numbers

def strict_is_number(value):
    if isinstance(value, bool):
        return False
    if isinstance(value, numbers.Number):
        if isinstance(value, float):
            return math.isfinite(value)
        return True
    return False

print(strict_is_number(42))                # True
print(strict_is_number(0.0))               # True
print(strict_is_number(float('nan')))      # False
print(strict_is_number(float('inf')))      # False
print(strict_is_number(True))              # False
print(strict_is_number(1+2j))              # True

Проверка строки на число с возможным пробелом и знаком с помощью try-except и decimal.Decimal

Использование Decimal даёт более строгий контроль над точностью и избегает проблем с float('NaN'):

Пример
from decimal import Decimal, InvalidOperation

def is_string_number_decimal(s):
    try:
        Decimal(s)
        return True
    except InvalidOperation:
        return False

print(is_string_number_decimal('123.45'))  # True
print(is_string_number_decimal('1.2.3'))   # False
print(is_string_number_decimal('NaN'))     # False (Decimal не считает 'NaN' числом)
print(is_string_number_decimal('Inf'))     # False
print(is_string_number_decimal(' 5 '))     # True (пробелы допускаются)

Проверка на бога: является ли объект числом с помощью hasattr и метода __float__

Многие пользовательские классы могут реализовывать протокол чисел, определяя __float__ или __int__:

Пример
def is_number_duck(value):
    try:
        float(value)
        return True
    except (TypeError, ValueError):
        return False

class MyNumber:
    def __float__(self):
        return 42.0

print(is_number_duck(MyNumber()))  # True
print(is_number_duck('abc'))       # False
print(is_number_duck(None))        # False

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

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