Алгоритмы проверки чисел на чётность в Python

Раздел: Алгоритмы -> Алгоритмы проверки чисел

Проверка числа на четность в Python: методы и примеры

Как определить четность числа с помощью оператора %?

Наиболее эффективный и распространённый способ - использование оператора взятия остатка от деления %. Если число n делится на 2 без остатка (n % 2 == 0), то оно чётное. Этот метод работает для целых чисел и обрабатывает отрицательные числа корректно (остаток от деления в Python всегда неотрицательный).


def is_even_base(n):
    return n % 2 == 0

print(is_even_base(10))  # True
print(is_even_base(-3))  # False

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

Основная цель - быстрое и читаемое решение. Рекомендуется для всех стандартных сценариев.

Возможные проблемы и ошибки:

  • Если передано не целое число (например, строка или float), возникнет исключение TypeError. Необходима предварительная проверка типа.
  • Для очень больших целых чисел (тип int) оператор % работает без ограничений.

Как проверить четность с помощью битовой операции AND?

Битовый оператор & позволяет проверять младший бит числа: n & 1 равно 0 для чётных и 1 для нечётных. Этот метод быстрее, чем %, но менее читаем. Применяется в низкоуровневых оптимизациях.


def is_even_bit(n):
    return (n & 1) == 0

print(is_even_bit(7))   # False
print(is_even_bit(-4))  # True

Типичные ошибки:

  • Забывают, что оператор & имеет более низкий приоритет, чем ==, поэтому скобки обязательны: (n & 1) == 0.
  • Метод работает только с целыми числами.

Как использовать divmod для проверки четности?

Функция divmod возвращает частное и остаток. Проверка остатка на ноль даёт результат: divmod(n, 2)[1] == 0. Подходит для случаев, когда требуется и частное, и остаток.


def is_even_divmod(n):
    return divmod(n, 2)[1] == 0

print(is_even_divmod(5))  # False
print(is_even_divmod(0))  # True

Когда это неудобно:

Вызов divmod создаёт кортеж, что добавляет небольшие накладные расходы. Используйте, если одновременно нужно частное.

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

Преобразовав число в строку, можно проверить последний символ: str(n)[-1] in '02468'. Такой подход полезен при работе с очень большими числами во встроенном представлении, но медленнее из-за преобразования.


def is_even_str(n):
    return str(n)[-1] in '02468'

print(is_even_str(123))   # False
print(is_even_str(-246))  # True (знак не учитывается)

Ошибки:

Для отрицательных чисел строка начинается с минуса, поэтому str(-2)[-1] равно '2' - корректно. Однако проверка на принадлежность к кортежу ('0','2','4','6','8') может быть медленнее, чем использование %.

Как реализовать проверку через остаток в функциональном стиле (lambda)?

Лямбда-функции удобны для быстрой проверки в коллбэках: lambda n: (n % 2) == 0. Часто используется вместе с filter() или map().


is_even_lambda = lambda n: n % 2 == 0
print(is_even_lambda(100))  # True
print(is_even_lambda(101))  # False

Недостаток:

Лямбда-функции сложно отлаживать, и они не подходят для многоразового использования с обработчиками ошибок.

Как проверить чётность с помощью округления до ближайшего целого (для чисел с плавающей точкой)?

Для чисел с плавающей точкой можно проверить, равно ли число округлённому значению, делённому на 2: n / 2 == int(n / 2). Но такой подход ненадёжен из-за погрешностей вычислений. Лучше сначала проверить, является ли число целым с помощью is_integer().


def is_even_float(n):
    if not isinstance(n, float) or not n.is_integer():
        return False
    return int(n) % 2 == 0

print(is_even_float(4.0))   # True
print(is_even_float(4.5))   # False

Важно:

Не все дробные числа можно точно представить в двоичном виде (например, 0.1). Поэтому проверка n % 2 == 0 для float может дать ложный результат.

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

Пример 1. Фильтрация чётных чисел из списка с помощью оператора %

Пример

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = [num for num in numbers if num % 2 == 0]
print(even_numbers)  # [2, 4, 6, 8, 10]
[2, 4, 6, 8, 10]

Пример 2. Использование функции filter с lambda

Пример

nums = range(0, 20)
evens = list(filter(lambda x: x % 2 == 0, nums))
print(evens)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

Пример 3. Проверка чётности с помощью среза (для строковых представлений больших чисел)

Пример

huge_number = 12345678901234567890
# Проверка через последний символ
def is_even_str_huge(n):
    return str(n)[-1] in '02468'
print(is_even_str_huge(huge_number))  # True
True

Пример 4. Рекурсивная функция проверки чётности (демонстрация, не рекомендуется)

Пример

def is_even_rec(n):
    n = abs(n)
    if n == 0:
        return True
    elif n == 1:
        return False
    else:
        return is_even_rec(n-2)

print(is_even_rec(10))  # True
print(is_even_rec(7))   # False
True
False

Примечание:

Рекурсия ограничена глубиной стека, для больших чисел может вызвать RecursionError.

Пример 5. Проверка чётности для элементов кортежа с map

Пример

tup = (15, 16, 17, 18)
result = tuple(map(lambda x: (x, x%2==0), tup))
print(result)
((15, False), (16, True), (17, False), (18, True))

Пример 6. Использование побитовой операции для проверки чётности массива (numpy стиль)

Пример

import numpy as np
arr = np.array([1, 2, 3, 4, 5])
print(arr & 1 == 0)  # поэлементная проверка
[False  True False  True False]

Пример 7. Проверка чётности с обработкой ошибок (пользовательский ввод)

Пример

def safe_is_even(value):
    try:
        n = int(value)
        return n % 2 == 0
    except (ValueError, TypeError):
        return None

print(safe_is_even("4"))    # True
print(safe_is_even("abc"))  # None
print(safe_is_even(3.14))   # None (float не конвертируется в int)
True
None
None

Пример 8. Генератор чётных чисел с помощью while и проверкой

Пример

def even_generator(limit):
    n = 0
    while n <= limit:
        if n % 2 == 0:
            yield n
        n += 1

for en in even_generator(10):
    print(en, end=' ')
0 2 4 6 8 10 

Проверка числа на четность в Python - comments

En
Python проверка на четность (python)