Методы определения числа в 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)) # FalseSet 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)) # TruePython переменная время (переменные для времени в 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)) # FalsePython двоичные данные (работа с двоичными данными в 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
Проверка с использованием регулярных выражений (для строк)
Регулярное выражение позволяет учесть знак, десятичную точку, научную нотацию:
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