Целые положительные числа. Примеры и проверки
Проверка и использование целых положительных чисел
Как наиболее эффективно проверить, что значение является целым положительным числом?
Самый надёжный способ - использовать встроенную функцию isinstance() совместно с проверкой на положительность. Для большинства задач этого достаточно.
def is_positive_int(value):
return isinstance(value, int) and value > 0
print(is_positive_int(42)) # True
print(is_positive_int(-5)) # False
print(is_positive_int(0)) # False
print(is_positive_int(3.0)) # False (вещественное число)Set str python (множество из строки в python)
Типичные ошибки и их решения:
- Путаница с типом bool:
TrueиFalseявляются подклассамиint, поэтомуisinstance(True, int)вернётTrue. Чтобы исключить булевы значения, можно добавить проверкуtype(value) is int. - Ноль не является положительным числом, его нужно явно исключать.
- Числа с плавающей точкой, даже если их дробная часть равна нулю (например, 5.0), не считаются целыми.
Вариант 1: Как проверить целое положительное число без учёта булевых значений?
Если требуется строгое соответствие типу int и исключение подклассов (bool), используют type().
def is_strict_positive_int(value):
return type(value) is int and value > 0
print(is_strict_positive_int(True)) # False (bool исключён)Python переменная время (переменные для времени в python)
Вариант 2: Как получить целое положительное число из строки?
При вводе данных от пользователя часто требуется преобразовать строку в число и проверить, что оно целое и положительное. Используется блок try/except.
def parse_positive_int(s):
try:
value = int(s)
if value > 0:
return value
else:
raise ValueError("Число должно быть положительным")
except ValueError as e:
print(f"Ошибка: {e}")
return None
print(parse_positive_int("25")) # 25
print(parse_positive_int("-3")) # None
print(parse_positive_int("12.7")) # None (ошибка int())
Python типы данных время (типы данных для времени в python)
Возможные проблемы:
- Строка может содержать пробелы -
int()их игнорирует, но если на вход подаётся" 42 ", преобразование пройдёт успешно. - Большие числа (например, 10**100) также будут обработаны, так как
intв Python не имеет ограничений по длине.
Вариант 3: Как отфильтровать список, оставив только целые положительные числа?
Для обработки коллекций удобно использовать функцию filter() или генератор списка.
data = [3, -1, 0, 7.5, 10, "abc", True]
positive_ints = list(filter(lambda x: isinstance(x, int) and not isinstance(x, bool) and x > 0, data))
print(positive_ints) # [3, 10]Python объект тип (тип объекта в python)
Вариант 4: Как проверить, что все элементы последовательности - целые положительные числа?
Применяется функция all() и генератор.
def all_positive_ints(sequence):
return all(isinstance(x, int) and not isinstance(x, bool) and x > 0 for x in sequence)
print(all_positive_ints([1, 2, 3])) # True
print(all_positive_ints([1, -2, 3])) # Falseвещественные значения python (вещественные значения в python)
Вариант 5: Как использовать абстрактный базовый класс из модуля numbers?
Если требуется поддержка любых целых типов (например, numpy.int64), используют numbers.Integral.
import numbers
def is_positive_integral(value):
return isinstance(value, numbers.Integral) and value > 0
print(is_positive_integral(42)) # True
print(is_positive_integral(1.0)) # False (не Integral)
print(is_positive_integral(10**100)) # TrueДополнительные сложные примеры работы с целыми положительными числами.
Расширенные примеры
Пример 1: Валидация аргументов функции с помощью декоратора
Декоратор проверяет, что все переданные аргументы (позиционные) являются целыми положительными числами.
from functools import wraps
def require_positive_ints(func):
@wraps(func)
def wrapper(*args, **kwargs):
for arg in args:
if not (isinstance(arg, int) and not isinstance(arg, bool) and arg > 0):
raise ValueError(f"Аргумент {arg} не является целым положительным числом")
return func(*args, **kwargs)
return wrapper
@require_positive_ints
def multiply(a, b):
return a * b
print(multiply(3, 5)) # 15
# multiply(3, -1) # вызовет ValueError15
Пример 2: Генератор всех положительных целых чисел, не превышающих заданный предел
Используется для создания последовательности.
def positive_ints_up_to(n):
if not isinstance(n, int) or n < 1:
raise ValueError("Предел должен быть целым положительным числом")
for i in range(1, n+1):
yield i
for num in positive_ints_up_to(5):
print(num, end=' ')1 2 3 4 5
Пример 3: Проверка большого числа на положительность и целостность
Python поддерживает числа произвольной длины, поэтому проверка работает и для огромных значений.
huge = 10**100 + 1
print(isinstance(huge, int) and huge > 0) # TrueTrue
Пример 4: Работа с массивом NumPy с последующей проверкой
Элементы массива NumPy имеют свой тип, но numbers.Integral позволяет корректно проверить.
import numpy as np
import numbers
arr = np.array([1, 2, 3], dtype=np.int32)
for x in arr:
print(isinstance(x, numbers.Integral) and x > 0) # True для каждогоTrue True True
Пример 5: Рекурсивная проверка вложенных структур
Функция проверяет, что все числа в произвольной вложенной коллекции (списки, кортежи) являются целыми положительными.
def all_positive_ints_deep(item):
if isinstance(item, (list, tuple)):
return all(all_positive_ints_deep(sub) for sub in item)
else:
return isinstance(item, int) and not isinstance(item, bool) and item > 0
data = [1, [2, 3], (4, 5)]
print(all_positive_ints_deep(data)) # True
data2 = [1, [2, -3]]
print(all_positive_ints_deep(data2)) # FalseTrue False
Пример 6: Использование assert для документации кода
Утверждения помогают отлавливать некорректные данные на этапе разработки.
def factorial(n):
assert isinstance(n, int) and n > 0, "n должно быть целым положительным"
result = 1
for i in range(1, n+1):
result *= i
return result
print(factorial(5)) # 120120