from functools import reduce

if __name__ == "__main__":
    # redukcja listy
    lst = [1, 2, 3, 4, 10]

    # wzgledem dodawania: suma
    print(reduce(lambda x, y: x + y, lst))

    # wzgledem mnozenia: iloczyn
    print(reduce(lambda x, y: x * y, lst))

    # silnia jako reduce:
    def factorial(n):
        return reduce(lambda x, y: x * y, range(1, n + 1))

    print(factorial(1))

    # "join":
    lst = ["Ala", "ma", "szczura"]
    print(reduce(lambda x, y: x+" "+y, lst))

    # (bonus) reduce z poczatkowym obiektem (dziala wtedy dla ciagow pustych):
    print(reduce(lambda x, y: x+y, [], 0))
    print(reduce(lambda x, y: x*y, [], 1))
    print(reduce(lambda x, y: x+"/"+y, [], ""))
