Четность в Python: от простого условия до работы со списками
Проверка числа на четность в Python
Четность целого числа определяется по остатку от деления на два. Если остаток равен нулю, число четное. Эта операция широко применяется при фильтрации данных, организации циклов, проверке условий. В Python существуют несколько способов выполнения такой проверки, каждый из которых имеет свои особенности.
Наиболее эффективный и читаемый способ - использование оператора % (остаток от деления). Выражение number % 2 == 0 возвращает True, когда число делится на два без остатка.
number = 42
if number % 2 == 0:
print(f"{number} - четное")
else:
print(f"{number} - нечетное")четные элементы python (поиск четных элементов в python)
42 - четное
Python четные (четные числа в python)
Для наглядности результат выводится с помощью f-строки. Подход работает как с положительными, так и с отрицательными числами: -5 % 2 даёт 1, поэтому условие number % 2 == 0 корректно определяет четность.
Как определить четность без оператора %?
Побитовое И (&) с единицей: младший бит четных чисел равен 0. Выражение (number & 1) == 0 эквивалентно проверке остатка. Важно не забывать скобки из-за приоритета операторов.
num = 10
if (num & 1) == 0:
print("Четное")Типичные ошибки:
- Отсутствие скобок:
num & 1 == 0интерпретируется какnum & (1 == 0)→num & False→num & 0→ 0, что всегда ложно. - Попытка использовать побитовое И для нецелых чисел - приведет к ошибке.
Как отфильтровать четные числа из списка?
Функция filter с лямбда-выражением возвращает итератор, который затем преобразуется в список.
numbers = [1, 2, 3, 4, 5, 6]
even = list(filter(lambda x: x % 2 == 0, numbers))
print(even)[2, 4, 6]
Типичные ошибки:
- Забывают обернуть
filterвlist(), получают объект filter, а не список. - Используют
lambda x: x % 2- это вернетTrueдля нечетных чисел (так как остаток 1), что даст обратный фильтр.
Как вывести все четные числа от 1 до N?
Цикл for с шагом 2 позволяет перебирать только четные значения.
n = 10
for i in range(2, n+1, 2):
print(i, end=' ')2 4 6 8 10
Типичные ошибки:
- Начинают с 1 вместо 2, тогда первое число нечетное, и шаг 2 даёт только нечетные.
- Путают
range(start, stop)- stop не включается, поэтому нужноn+1.
Как проверить, все ли числа в списке четные?
Встроенная функция all() в сочетании с генератором списка возвращает True, если каждый элемент удовлетворяет условию.
nums = [4, 8, 12, 16]
if all(x % 2 == 0 for x in nums):
print("Все четные")Типичные ошибки:
- Передача списка вместо генератора:
all([x%2==0 for x in nums])- тоже работает, но создаёт дополнительный список. - Использование
any()вместоall()для проверки, что хотя бы одно четное.
Как получить список четных чисел через генератор списка?
List comprehension - компактная запись, аналогичная filter.
numbers = [1, 2, 3, 4, 5, 6]
even = [x for x in numbers if x % 2 == 0]
print(even)[2, 4, 6]
Этот подход предпочтительнее, когда требуется список целиком, так как он выполняется быстрее и легче читается.
Как организовать цикл while для поиска четных чисел?
Цикл while с ручным увеличением счётчика на 1 и проверкой четности внутри.
i = 1
while i <= 10:
if i % 2 == 0:
print(i, end=' ')
i += 12 4 6 8 10
Типичные ошибки:
- Забывают увеличивать счётчик - цикл становится бесконечным.
- Неправильно расставляют отступы, проверка выполняется вне цикла.
Каждый из рассмотренных вариантов решает свою задачу: от базовой проверки до обработки коллекций. Выбор способа зависит от контекста и требований к производительности.
Примеры работы с четными числами
1. Функция is_even с проверкой типа
def is_even(n):
"""Возвращает True, если n - четное целое число."""
if not isinstance(n, int):
raise TypeError("Ожидается целое число")
return n % 2 == 0
print(is_even(4))
print(is_even(7))True False
2. Обработка пользовательского ввода с исключениями
try:
user_input = int(input("Введите целое число: "))
if user_input % 2 == 0:
print("Число четное")
else:
print("Число нечетное")
except ValueError:
print("Ошибка: введено не целое число")Введите целое число: 25 Число нечетное
3. List comprehension для генерации четных чисел от 1 до 100
even_numbers = [x for x in range(1, 101) if x % 2 == 0]
print(even_numbers[:10]) # вывод первых 10 четных[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
4. Использование map для маркировки четности
numbers = [1, 2, 3, 4, 5]
labeled = list(map(lambda x: (x, 'четное' if x % 2 == 0 else 'нечетное'), numbers))
print(labeled)[(1, 'нечетное'), (2, 'четное'), (3, 'нечетное'), (4, 'четное'), (5, 'нечетное')]
5. Фильтрация списка с отрицательными числами
data = [-5, -4, -3, -2, -1, 0, 1, 2]
even_negative = [x for x in data if x % 2 == 0]
print(even_negative)[-4, -2, 0, 2]
Обратите внимание: 0 считается четным.
6. Проверка всех чисел на четность с all()
test_cases = [
[2, 4, 6],
[1, 3, 5],
[2, 4, 7]
]
for case in test_cases:
print(f"{case}: все четные? {all(x % 2 == 0 for x in case)}")[2, 4, 6]: все четные? True [1, 3, 5]: все четные? False [2, 4, 7]: все четные? False
7. Цикл while до первого четного числа больше заданного
start = 11
while True:
if start % 2 == 0:
print(f"Первое четное >= 11: {start}")
break
start += 1Первое четное >= 11: 12
8. Генератор бесконечной последовательности четных чисел
def even_generator():
n = 0
while True:
yield n
n += 2
gen = even_generator()
print([next(gen) for _ in range(5)])[0, 2, 4, 6, 8]
9. Использование itertools.islice для ограничения бесконечного генератора
import itertools
def even_infinite():
n = 0
while True:
yield n
n += 2
first_ten = list(itertools.islice(even_infinite(), 10))
print(first_ten)[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
10. Сравнение производительности оператора % и побитового &
import timeit
mod_time = timeit.timeit('n % 2 == 0', setup='n=123456', number=1000000)
bit_time = timeit.timeit('(n & 1) == 0', setup='n=123456', number=1000000)
print(f"Оператор %: {mod_time:.5f}")
print(f"Побитовое &: {bit_time:.5f}")Оператор %: 0.03421 Побитовое &: 0.02845
Побитовое И обычно немного быстрее, однако разница незначительна для большинства приложений.