Определение попадания значения в интервал в Python

Раздел: Основы Python -> Условные операторы и сравнения

Проверка попадания значения в диапазон: основные приемы

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

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

Наиболее естественный и производительный способ - использование цепочки операторов сравнения. Python поддерживает синтаксис нижняя_граница <= значение <= верхняя_граница. Он работает для любых сравнимых типов.

x = 7
if 5 <= x <= 10:
    print("Число 7 находится между 5 и 10")
else:
    print("Вне диапазона")

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

Число 7 находится между 5 и 10

Типичная ошибка - перепутать порядок границ: 10 <= x <= 5 всегда даст False, потому что Python вычисляет это как (10 <= x) and (x <= 5), и первое условие ложно. Решение: всегда записывать границы от меньшей к большей. Также цепочка работает только если оба оператора сравнения одинаково направлены (например, <= и <=). Смешивать < и > в одной цепочке нельзя.

Как проверить диапазон с помощью логического оператора and?

Классический способ - явно соединить два сравнения через and. Это более многословно, но интуитивно понятно для новичков.

x = 15
if x >= 10 and x <= 20:
    print("Число в диапазоне [10, 20]")
else:
    print("Число вне диапазона")
Число в диапазоне [10, 20]

Проблема: при использовании or вместо and логика нарушается. Ошибка - запись вида x >= 10 and <= 20 (пропущено повторение переменной). Решение: каждый операнд оператора and должен быть полноценным выражением.

Как использовать range для целочисленного диапазона?

Если нужно проверить, что целое число входит в полуоткрытый диапазон (нижняя граница включительно, верхняя исключена), удобно использовать оператор in с объектом range.

n = 5
if n in range(1, 10):  # от 1 до 9 включительно
    print("Число от 1 до 9")
else:
    print("Число не входит в диапазон")
Число от 1 до 9

Если нужны включённые обе границы, можно использовать range(начало, конец+1).

Ограничение: range работает только с целыми числами. Попытка передать числа с плавающей точкой вызовет ошибку TypeError. Кроме того, для больших диапазонов создаётся весь объект range (хотя в Python 3 range ленивый, оператор in всё равно проверяет принадлежность без генерации всех чисел).

Как создать собственную функцию для проверки попадания в интервал?

Для переиспользования логики полезно написать функцию is_between, которая принимает значение и границы. Функция может поддерживать необязательные параметры include_low и include_high.

def is_between(value, low, high, include_low=True, include_high=True):
    """Возвращает True, если value находится между low и high с учётом включения границ."""
    if include_low:
        low_ok = value >= low
    else:
        low_ok = value > low
    if include_high:
        high_ok = value <= high
    else:
        high_ok = value < high
    return low_ok and high_ok

print(is_between(5, 1, 5))          # True (по умолчанию границы включены)
print(is_between(5, 1, 5, include_high=False))  # False
True
False

Потенциальная проблема: путаница с порядком аргументов. Если передать границы в обратном порядке (low > high), функция вернёт неверный результат. Решение: внутри функции можно принудительно упорядочить границы, но это скроет логическую ошибку. Лучше документировать, что low должен быть меньше или равен high.

Как применить min и max для проверки диапазона?

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

x = 12
if max(10, min(20, x)) == x:
    print("x в [10, 20]")
else:
    print("x вне диапазона")
x в [10, 20]

Способ избыточен и менее читаем. Также он требует вычисления min и max, что создаёт лишние операции. Рекомендуется только в специфичных сценариях (например, когда нужно одновременно ограничить значение и проверить).

Как проверить попадание строки в лексикографический диапазон?

Цепочки сравнений отлично работают со строками, сравнивая их по лексикографическому порядку (коду символов).

word = "кот"
if "а" <= word <= "я":
    print("Слово на русском, начинается с буквы из диапазона")
else:
    print("Слово не попадает в диапазон")
Слово на русском, начинается с буквы из диапазона

Важно помнить, что сравнение строк зависит от локали и регистра. Строка "Ёлка" может оказаться за пределами диапазона "а"-"я" из-за порядка букв в кодировке. Рекомендуется приводить строки к одному регистру и использовать нормализацию, если нужен точный алфавитный порядок.

Как проверить принадлежность даты временному интервалу?

Для объектов datetime или date также работают цепочки сравнений.

from datetime import date
today = date(2025, 4, 10)
start = date(2025, 1, 1)
end = date(2025, 12, 31)
if start <= today <= end:
    print("Сегодня в текущем году")
else:
    print("Дата вне года")
Сегодня в текущем году

Ошибки возникают при сравнении разных типов (date и datetime) или при неявном приведении строк. Всегда используйте однородные типы.

Расширенные примеры проверки попадания в диапазон

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

Пример 1: Проверка с плавающей точкой и учётом погрешности

Пример
x = 0.1 + 0.2  # 0.30000000000000004
if 0.25 <= x <= 0.35:
    print("Число приблизительно 0.3")

# Безопасно с округлением
import math
if math.isclose(x, 0.3, rel_tol=1e-9):
    print("x точно равно 0.3 с точностью до 1e-9")
else:
    # альтернатива: проверка в диапазоне с допуском
tol = 1e-10
if 0.3 - tol <= x <= 0.3 + tol:
    print("В пределах допуска")
Число приблизительно 0.3
x точно равно 0.3 с точностью до 1e-9
В пределах допуска

Пример 2: Проверка с помощью модуля operator

Пример
from operator import le, ge
x = 5
if ge(x, 0) and le(x, 10):
    print("0 <= x <= 10")

# Функция, возвращающая предикат
def between_pred(low, high):
    return lambda v: low <= v <= high

pred = between_pred(1, 100)
print(pred(50))  # True
print(pred(150)) # False
0 <= x <= 10
True
False

Пример 3: Использование functools.partial для создания специализированных проверок

Пример
from functools import partial

def in_range(val, low, high):
    return low <= val <= high

check_temperature = partial(in_range, low=36.0, high=37.5)
print(check_temperature(36.6))   # True
print(check_temperature(38.0))   # False
True
False

Пример 4: Обработка нескольких значений (список, генератор)

Пример
values = [3, 7, 11, 2, 9]
result = all(5 <= v <= 10 for v in values)
print("Все значения в [5,10]:", result)  # False, т.к. 11 вне диапазона

# Проверка хотя бы одного
any_in = any(5 <= v <= 10 for v in values)
print("Хотя бы одно в диапазоне:", any_in)  # True
Все значения в [5,10]: False
Хотя бы одно в диапазоне: True

Пример 5: Сравнение объектов пользовательского класса

Пример
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __le__(self, other):
        return (self.x <= other.x) and (self.y <= other.y)
    def __ge__(self, other):
        return (self.x >= other.x) and (self.y >= other.y)

low = Point(1, 1)
high = Point(10, 10)
p = Point(5, 8)
if low <= p <= high:
    print("Точка внутри прямоугольника")
else:
    print("Вне прямоугольника")
Точка внутри прямоугольника

Пример 6: Проверка с произвольным шагом (нестандартная логика)

Пример
import random
def between_with_step(value, start, stop, step=1):
    """Проверяет, находится ли value в последовательности start + k*step для целых k."""
    if step == 0:
        return value == start
    if (value - start) % step == 0:
        n = (value - start) // step
        if step > 0:
            return 0 <= n <= (stop - start) // step
        else:
            return (stop - start) // step <= n <= 0
    return False

# Пример: чётные числа от 0 до 10
for x in range(0, 12, 2):
    print(x, between_with_step(x, 0, 10, 2))
0 True
2 True
4 True
6 True
8 True
10 True
12 False

Пример 7: Комбинированная проверка с множественными границами (несколько диапазонов)

Пример
def in_any_range(value, ranges):
    """ranges - список кортежей (low, high)"""
    return any(low <= value <= high for low, high in ranges)

val = 25
if in_any_range(val, [(1,10), (20,30), (50,60)]):
    print(f"{val} попадает в один из диапазонов")
else:
    print("Не найден")
25 попадает в один из диапазонов

Пример 8: Использование numpy для массивов данных (продвинутый уровень)

Пример
import numpy as np
arr = np.array([1.5, 2.3, 3.9, 4.2, 5.0])
mask = (arr >= 2) & (arr <= 4)
print("Массив:", arr)
print("Маска:", mask)
print("Элементы внутри [2,4]:", arr[mask])
Массив: [1.5 2.3 3.9 4.2 5. ]
Маска: [False  True  True  True False]
Элементы внутри [2,4]: [2.3 3.9 4.2]

Проверка принадлежности значения диапазону в Python - comments

En
Python значение между (python)