Является ли значение числом в 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