(item for item in my_generator if condition(item))
filter(condition, my_generator)
condition(item)
- функция, возвращающая True
или False
в зависимости от условия.
Для возврата значений из генератора по условию в Python можно использовать несколько подходов. Выбор конкретного метода зависит от сложности условия и предпочтений разработчика.
1. Использование конструкции yield
внутри цикла с условием:
Это наиболее простой и распространенный способ. Внутри генератора, в цикле, проверяется условие, и если оно выполняется, то с помощью yield
возвращается текущее значение.
def generator_with_condition(data):
for item in data:
if item % 2 == 0: # Пример условия: четное число
yield item
# Пример использования:
numbers = [1, 2, 3, 4, 5, 6]
even_numbers = generator_with_condition(numbers)
for number in even_numbers:
print(number) # Выведет 2, 4, 6
В этом примере, генератор generator_with_condition
принимает список чисел и возвращает только четные числа.
2. Использование генераторного выражения:
Генераторные выражения предоставляют компактный синтаксис для создания генераторов "в одну строку". Они очень удобны, когда условие достаточно простое.
numbers = [1, 2, 3, 4, 5, 6]
even_numbers = (item for item in numbers if item % 2 == 0)
for number in even_numbers:
print(number) # Выведет 2, 4, 6
Здесь (item for item in numbers if item % 2 == 0)
- это генераторное выражение, которое фильтрует список numbers
и возвращает только четные числа.
3. Использование функции filter
:
Функция filter()
принимает функцию-предикат и итерируемый объект. Она возвращает итератор, который выдает только те элементы из итерируемого объекта, для которых функция-предикат возвращает True
. Важно отметить, что filter
возвращает итератор, а не генератор напрямую, но его можно использовать так же, как и генератор.
numbers = [1, 2, 3, 4, 5, 6]
def is_even(number):
return number % 2 == 0
even_numbers = filter(is_even, numbers) # filter возвращает итератор
for number in even_numbers:
print(number) # Выведет 2, 4, 6
В этом примере, функция is_even
является предикатом, который определяет, является ли число четным. Функция filter
применяет этот предикат к каждому элементу списка numbers
и возвращает итератор с четными числами.
Выбор подходящего способа:
yield
.filter
.Важно понимать, что все эти подходы создают генераторы (или итераторы, которые можно использовать аналогично). Генераторы вычисляют значения "лениво", то есть только тогда, когда они необходимы, что может быть полезно для работы с большими объемами данных.