Способы определения чисел в коде 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()) # FalsePython проверить ключ (проверка наличия ключа в словаре python)
True False
Python проверить на символы (проверка строки на наличие символов в python)
Метод isdigit() возвращает True, если все символы являются десятичными цифрами. Не поддерживает отрицательные числа, числа с плавающей точкой, ведущие нули (хотя нули считаются цифрами).
Как проверить строку на число с плавающей точкой?
Попытка преобразования 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.
Как проверить, является ли переменная числовым типом данных (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, и т.д.).
Как проверить строку на число с помощью регулярных выражений?
Можно задать точный шаблон для целого или дробного числа.
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).
Расширенные примеры проверки чисел
Дополнительные сценарии и нестандартные случаи.
Проверка на конечное число (исключение 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
Позволяет отличить вещественные числа от комплексных.