/
elder247
/
aaa-python-advanced
Обзор
Документация
Войти
/
elder247
/
aaa-python-advanced
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
hw_4/task_1.py
68 строк
2 KB
Anton Trofimuk
add task_1.py
08 дек 2024, 13:09
08 дек 2024, 13:09
0b9b6fe
Код
Авторство
О чём код?
from typing import Callable class Seq: def __init__(self, sequence): self.sequence = sequence self.generator = (el for el in self.sequence) def map(self, func: Callable): """ Преобразует каждый элемент генератора в результат выполнения func(elem) """ self.generator = ( func(el) for el in self.generator ) return self def filter(self, func: Callable): """ Оставляет в генераторе только те элементы, для которых func(elem) == True """ self.generator = ( el for el in self.generator if func(el) ) return self def take(self, numb: int) -> list: """ Принимает число numb и возвращает список с этим количеством элементов """ result = [] for _ in range(numb): el = next(self.generator, None) if el is None: break result.append(el) return result def reset(self): """ Сбрасывает генератор self.generator в исходное состояние Чтобы можно было повторно применять выражения вида instance.map().take() """ self.generator = (el for el in self.sequence) return self if __name__ == '__main__': numbers = [1, 2, 3, 4, 5] seq_1 = Seq(numbers) res_1 = seq_1.filter(lambda n: n % 2 == 0).map(lambda n: n + 10).take(3) assert res_1 == [12, 14] string = 'ABCD' seq_2 = Seq(string) res_2 = seq_2.filter(lambda char: char in 'ABC').map(str.lower).take(2) assert res_2 == ['a', 'b'] # возвращаем seq_2 к исходному состоянию (до применения filter, map, take) seq_2.reset() res_3 = seq_2.filter(lambda char: char in 'CD').map(str.lower).take(1) assert res_3 == ['c']