Способы определения чисел в коде Python

Раздел: Python -> Проверка данных

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

Методы проверки чисел в Python

Основной способ: комбинация isinstance и try/except

Наиболее универсальное решение включает проверку типа переменной и попытку преобразования строки.


def is_number(value):
    if isinstance(value, (int, float, complex)):
        return True
    try:
        float(value)
        return True
    except (ValueError, TypeError):
        return False

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

Функция is_number принимает любое значение. Сначала проверяется, является ли оно уже числовым типом через isinstance. Если нет, предпринимается попытка преобразования в float. Если преобразование успешно, возвращается True, иначе False.

Проблемы: float('inf') и float('nan') считаются числами, но в некоторых задачах их нужно исключить. Для комплексных чисел float() не подходит, поэтому используется complex() в альтернативах. Также True и False являются подтипами int и будут распознаны как числа.

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

Использование метода str.isdigit().

s = "123"
print(s.isdigit())  # True
s2 = "-123"
print(s2.isdigit()) # False

Python проверить ключ (проверка наличия ключа в словаре python)

True
False

Python проверить на символы (проверка строки на наличие символов в python)

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

Ошибка: для пустой строки возвращает False, для строки с пробелами или знаками минуса – False. Не подходит для проверки ввода с возможным минусом.

Как проверить строку на число с плавающей точкой?

Попытка преобразования float() в блоке try/except.


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

print(is_float("3.14"))     # True
print(is_float("-1.5e2"))   # True (научная нотация)
print(is_float("abc"))      # False

Python проверить тип (проверка типа переменной в python)

True
True
False

Python проверить подстроку в строке (проверить наличие подстроки в строке)

Этот способ корректно обрабатывает знаки, десятичные точки, научную нотацию, специальные значения inf и nan.

Проблема: float('inf') и float('nan') будут считаться числами. Если это нежелательно, нужно дополнительно проверять через math.isfinite().

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

Использование isinstance с кортежем типов или с numbers.Number.


import numbers

x = 5
print(isinstance(x, (int, float, complex)))  # True
print(isinstance(x, numbers.Number))         # True

y = "5"
print(isinstance(y, numbers.Number))         # False
True
True
False

Модуль numbers предоставляет абстрактные базовые классы для числовых типов. numbers.Number охватывает все встроенные числовые типы (int, float, complex, bool, и т.д.).

Не проверяет строки, только уже созданные объекты. Также подтипы вроде bool будут считаться числами.

Как проверить строку на число с помощью регулярных выражений?

Можно задать точный шаблон для целого или дробного числа.


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("123"))    # True
print(is_number_regex("-.5"))    # True
print(is_number_regex("1e10"))   # True
print(is_number_regex("+0.0"))   # True
print(is_number_regex("1.2.3"))  # False
True
True
True
True
False

Регулярное выражение даёт полный контроль над форматом. Можно настроить под конкретные требования (например, запретить научную нотацию).

Сложность составления шаблона, возможные проблемы с производительностью при большом количестве проверок. Не учитывает локализованные разделители.

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

Использование locale.atof.


import locale
locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8')  # устанавливаем локаль

def is_number_locale(s):
    try:
        locale.atof(s)
        return True
    except (ValueError, locale.Error):
        return False

print(is_number_locale("123,45"))  # True (немецкий формат)
print(is_number_locale("123.45"))  # False в этой локали
True
False

Этот подход полезен при работе с международными данными, где десятичный разделитель – запятая.

Требуется установка корректной локали в системе, что может быть ненадёжно. Не все локали поддерживаются.

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

Попытка преобразования complex().


def is_complex(s):
    try:
        complex(s)
        return True
    except ValueError:
        return False

print(is_complex("3+4j"))   # True
print(is_complex("5"))      # True (также считается комплексным)
print(is_complex("i"))      # False (ожидается 'j')
True
True
False

complex() может распознавать строки в формате "a+bj". При этом обычные числа тоже будут преобразованы (мнимая часть = 0).

Не все математические обозначения (например, "i" вместо "j") поддерживаются. Для полноценной проверки можно использовать регулярное выражение.

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

Дополнительные сценарии и нестандартные случаи.

Проверка на конечное число (исключение inf/nan)

Пример

import math

def is_finite_number(value):
    try:
        f = float(value)
        return math.isfinite(f)
    except (ValueError, TypeError):
        return False

print(is_finite_number("inf"))     # False
print(is_finite_number("nan"))     # False
print(is_finite_number("123.45"))  # True
False
False
True

Используется math.isfinite для отбрасывания бесконечности и NaN.

Проверка строки на число после удаления символов валют и пробелов

Пример

import re

def is_number_currency(s):
    # удаляем пробелы и символы валют (€, $, ₽)
    cleaned = re.sub(r'[\s€$₽,;:]+', '', s).replace(' ', '')
    try:
        float(cleaned)
        return True
    except ValueError:
        return False

print(is_number_currency("12 345.67 €"))  # True (если точка - десятичный разделитель)
print(is_number_currency("1,234.56"))     # False, так как запятая не удалена

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

Проверка целого числа в разных системах счисления

Пример

def is_integer_in_base(s, base=10):
    try:
        int(s, base)
        return True
    except ValueError:
        return False

print(is_integer_in_base("1010", 2))  # True (двоичное 10)
print(is_integer_in_base("FF", 16))   # True
print(is_integer_in_base("123", 10))  # True
print(is_integer_in_base("1A", 10))   # False
True
True
True
False

Проверка строки на целое число в указанной системе счисления.

Массовая проверка данных с помощью pandas

Пример

import pandas as pd

def is_number_pandas(value):
    try:
        pd.to_numeric(value, errors='raise')
        return True
    except (ValueError, TypeError):
        return False

# Для списка данных:
data = ['123', '3.14', 'abc', None]
mask = pd.to_numeric(pd.Series(data), errors='coerce').notna()
print(mask.tolist())  # [True, True, False, False]
[True, True, False, False]

Использование pd.to_numeric удобно для массовой проверки в DataFrame.

Проверка рационального числа, записанного как дробь

Пример

from fractions import Fraction

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

print(is_fraction("3/4"))    # True
print(is_fraction("5/0"))    # False (деление на ноль)
print(is_fraction("1.5/2"))  # False (неправильный формат)
True
False
False

Проверка строки, содержащей дробное выражение.

Проверка на вещественное число с помощью numbers.Real

Пример

import numbers

def is_real_number(x):
    return isinstance(x, numbers.Real)

print(is_real_number(3.14))    # True
print(is_real_number(2+3j))    # False (комплексное)
print(is_real_number(True))    # True (bool подкласс int)
True
False
True

Позволяет отличить вещественные числа от комплексных.

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

En
Python проверка на число (python)