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

Раздел: Общие сведения о Python -> Основы языка Python

В Python часто возникает необходимость определить, является ли переменная числом. Это может потребоваться для валидации входных данных, выбора алгоритма обработки или безопасного преобразования типов. Рассмотрим основные подходы.

Способы проверки числовых значений

Как наиболее эффективно проверить, что переменная имеет числовой тип (int, float, complex)?

Самый надёжный способ использовать встроенную функцию isinstance() с кортежем допустимых типов:


value = 42
if isinstance(value, (int, float, complex)):
    print(f"{value} является числом")
else:
    print(f"{value} не является числом")

что делает strip в python (метод strip() в python)

Объяснение:

Функция isinstance() проверяет принадлежность объекта указанному классу или его подклассу. Кортеж (int, float, complex) охватывает все стандартные числовые типы Python. Этот метод работает быстро и не вызывает исключений.

Возможные проблемы:
  • bool является подклассом int, поэтому True и False тоже будут распознаны как числа. Если требуется исключить булевы значения, нужно добавить дополнительную проверку.
  • Строки, которые выглядят как числа (например, "3.14"), не будут распознаны - для них требуется преобразование.
  • Специальные значения float('inf') и float('nan') считаются числами типа float, что может быть нежелательно в некоторых вычислениях.

Как проверить, является ли объект числом с помощью модуля numbers?

Модуль numbers предоставляет абстрактные базовые классы для числовых типов. Например, numbers.Number - корень иерархии. Проверка через isinstance(x, numbers.Number) охватывает все стандартные числа, включая decimal.Decimal и fractions.Fraction, если они импортированы.


import numbers

x = 3.14
if isinstance(x, numbers.Number):
    print(f"{x} принадлежит иерархии Number")

математические примеры python (математические примеры в python)

Проблемы:
  • Булевы значения (bool) также подходят, поскольку bool является подклассом int, а int - подклассом numbers.Integral.
  • Для работы с decimal.Decimal необходимо импортировать соответствующий модуль.

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

Классический способ - попробовать преобразовать строку в float или int внутри блока try/except. Это позволяет обрабатывать как целые, так и дробные числа, включая научную нотацию.


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

print(is_numeric_string("3.14"))  # True
print(is_numeric_string("abc"))   # False
print(is_numeric_string("1e-5"))  # True

новые возможности условного оператора python (новые возможности условного оператора в python)

Типичные ошибки:
  • Пустая строка или строка только с пробелами вызовет ValueError.
  • Строка с разделителем тысяч (например, "1,000") не будет преобразована - нужно предварительно удалять запятые.
  • float('inf') и float('nan') считаются допустимыми числами, что может потребовать дополнительной фильтрации.
  • Булевы строки "True" и "False" не преобразуются в числа.

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

Если необходимо считать числами только int, float и complex, но не bool, можно явно исключить булевы значения:


def is_number_excluding_bool(x):
    return isinstance(x, (int, float, complex)) and not isinstance(x, bool)

print(is_number_excluding_bool(True))  # False
print(is_number_excluding_bool(42))    # True

Float python пример (примеры float в python)

Примечание:

Поскольку bool является подклассом int, проверка isinstance(x, bool) должна идти после проверки на int или быть первой. Порядок условий важен.

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

Метод строки isdigit() возвращает True, если все символы являются цифрами. Подходит только для неотрицательных целых чисел.


s = "12345"
if s.isdigit():
    print(f"{s} - целое неотрицательное число")

Python кортежи примеры (примеры кортежей в python)

Ограничения:
  • Не распознаёт отрицательные числа, дробные числа, числа в научной нотации.
  • Не работает с символами, отличными от цифр (например, пробелы, знак минуса).
  • Для строк с ведущими нулями (например, "001") вернёт True, что может быть нежелательно.

Как проверить тип с помощью type()?

Можно напрямую сравнить тип переменной, но это не учитывает наследование (например, bool не будет распознан как int).


x = 3.14
if type(x) in (int, float, complex):
    print(f"Тип {x} входит в указанный кортеж")
Недостаток:

Не сработает для подклассов - например, если создать класс, наследующий от int, он не будет распознан.

- типы данных в python с примерами (типы данных в python с примерами)
- множественный выбор python (множественный выбор (if-elif-else) в 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("-1e5"))   # True
print(is_number_regex(".5"))     # True
print(is_number_regex("12."))    # True
print(is_number_regex(" "))      # False
True
True
True
True
False
Особенности:
  • Регулярное выражение не учитывает разделители тысяч, бесконечность и NaN.
  • Может быть избыточным для простых задач, но даёт полный контроль над форматом.

Проверка с учётом локали (десятичная запятая)

Пример

import locale

def is_number_locale(s, loc='de_DE'):
    try:
        locale.setlocale(locale.LC_NUMERIC, loc)
        locale.atof(s)
        return True
    except (ValueError, locale.Error):
        return False

print(is_number_locale("3,14"))  # True (немецкая локаль)
print(is_number_locale("3.14"))  # False (в немецкой локали точка не является десятичным разделителем)
True
False

Проверка с использованием decimal.Decimal и fractions.Fraction

Пример

from decimal import Decimal, InvalidOperation
from fractions import Fraction

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

def is_fraction(s):
    try:
        Fraction(s)
        return True
    except (ValueError, ZeroDivisionError):
        return False

print(is_decimal("3.14"))        # True
print(is_decimal("1/2"))         # False (Decimal не принимает дроби)
print(is_fraction("1/2"))        # True
print(is_fraction("3.14"))       # True (Fraction может преобразовать строку с плавающей точкой)
True
False
True
True

Проверка с ast.literal_eval (для безопасного преобразования строк)

Пример

import ast

def is_number_ast(s):
    try:
        result = ast.literal_eval(s)
        return isinstance(result, (int, float, complex))
    except (ValueError, SyntaxError):
        return False

print(is_number_ast("3.14"))     # True
print(is_number_ast("1+2j"))     # True (комплексное число)
print(is_number_ast("[1,2]"))    # False (список - не число)
print(is_number_ast("inf"))      # True (ast.literal_eval принимает inf)
True
True
False
True

Проверка на NaN и бесконечность

Пример

import math

def is_finite_number(x):
    if isinstance(x, (int, float, complex)):
        if isinstance(x, complex):
            return math.isfinite(x.real) and math.isfinite(x.imag)
        return math.isfinite(x)
    return False

print(is_finite_number(float('nan')))   # False
print(is_finite_number(float('inf')))   # False
print(is_finite_number(42))             # True
print(is_finite_number(1+2j))           # True
print(is_finite_number(float('inf')+0j)) # False
False
False
True
True
False

Пользовательский класс, наследующий от int

Пример

class MyInt(int):
    pass

x = MyInt(10)
print(isinstance(x, int))       # True
print(type(x) in (int, float))  # False (type не учитывает подклассы)
print(isinstance(x, (int, float))) # True
True
False
True

Проверка строки с учётом знака и ведущих пробелов

Пример

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

print(is_strict_number("  -3.14  "))  # True (float допускает пробелы)
print(is_strict_number("  "))         # False
print(is_strict_number("1,000"))      # False (запятая)
print(is_strict_number("1_000"))      # False (подчёркивание, но int допускает? float нет)
True
False
False
False

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

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