Алгоритмы проверки чисел на чётность в 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