Как узнать, является ли переменная числом в языке 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, он не будет распознан.
Дополнительные примеры и тонкости
Проверка с помощью регулярного выражения
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