diff --git a/Tutorium/tut12/notes.md b/Tutorium/tut12/notes.md new file mode 100644 index 0000000..501a47a --- /dev/null +++ b/Tutorium/tut12/notes.md @@ -0,0 +1,20 @@ +# Notes for Tutorium 12 - 19.01.2024 + +## Topics + +- Type Annotation - The Full Guide + - Basics + - parameter + - variable + - return type + - + - Advanced + - Collections + - args, kwargs +- Functional programming + - map + - filter + - reduce + - function composition + - monads - Result/Optional +- Pattern-Matching \ No newline at end of file diff --git a/Tutorium/tut12/src/functional.py b/Tutorium/tut12/src/functional.py new file mode 100644 index 0000000..0a9da25 --- /dev/null +++ b/Tutorium/tut12/src/functional.py @@ -0,0 +1,48 @@ +from typing import Callable, Iterable, Iterator + +type Optional[T] = T | None + + +def map[T, R](func: Callable[[T], R], xs: Iterable[T]) -> Iterable[R]: + return [func(x) for x in xs] + + +def filter[T](func: Callable[[T], bool], xs: Iterable[T]) -> Iterable[T]: + return [x for x in xs if func(x)] + + +def reduce[T](func: Callable[[T, T], T], xs: Iterable[T]) -> T: + it: Iterator[T] = iter(xs) + value: T + try: + x: T = next(it) + except StopIteration: + raise TypeError("can't reduce empty list") + else: + value = x + for y in it: + value = func(value, y) + return value + + +def compose[T](*funcs: Callable[[T], T]) -> Callable[[T], T]: + return reduce(lambda f, g: lambda n: f(g(n)), funcs) + + +f: Callable[[int], int] = lambda n: n + 42 +g: Callable[[int], int] = lambda n: n ** 2 +h: Callable[[int], int] = lambda n: n - 3 + +print(compose(f, g, h)(0)) + +print(list(filter(lambda e: bool(e), [1, 2, 3, None, 5, 6]))) +print(list(filter(lambda e: not bool(e), [1, 2, 3, None, 5, 6]))) + +print(list(map(lambda e: str(e), [1, 2, 3, 4, 5, 6, "hello_functional"]))) + +print(list( + filter(lambda e: len(e) > 1, + map(lambda e: str(e), + [1, 2, 3, 4, "hello_world"])))) + +print(list(filter(lambda e: isinstance(e, int), [1, 2, 3, "hello"])))