Wprowadzenie

Programowanie funkcyjne to paradygmat, w którym centralną rolę odgrywają funkcje – nie tylko jako bloki kodu wykonujące operacje, ale jako wartości, które można przekazywać, komponować i zwracać. W przeciwieństwie do programowania imperatywnego, gdzie nacisk kładzie się na zmianę stanu i wykonywanie kolejnych instrukcji, styl funkcyjny koncentruje się na wyrażaniu obliczeń jako przekształceń danych za pomocą funkcji. Pozwala to budować kod bardziej zwięzły, deklaratywny i często łatwiejszy do testowania.

Przykładem prostej może być ta poniżej, generująca element SVG – np. prostokąt:

1  def draw_rect(x, y, width, height):
2      return f'<rect x="{x}" y="{y}" width="{width}" height="{height}" />'

Taka funkcja nie modyfikuje żadnego stanu zewnętrznego – po prostu przekształca dane wejściowe w ciąg znaków. Jej działanie jest w pełni przewidywalne: dla tych samych argumentów zawsze zwróci ten sam wynik.

Programowanie funkcyjne pozwala także tworzyć funkcje zwracające inne funkcje, co umożliwia konstruowanie bardziej elastycznego i wielokrotnie używalnego kodu. Na przykład możemy zdefiniować funkcję, która tworzy “generator” prostokątów z określonym kolorem:

1  def make_colored_rect(color):
2      def rect(x, y, width, height):
3          return f'<rect x="{x}" y="{y}" width="{width}" height="{height}" fill="{color}" />'
4      return rect

W ten sposób możemy utworzyć blue_rect = make_colored_rect("blue"), a następnie wywołać blue_rect(10, 20, 100, 50), co da odpowiedni kod SVG z wypełnieniem w kolorze niebieskim. Tego typu konstrukcje – znane jako zamknięcia (closures) – są typowe dla stylu funkcyjnego i pozwalają w elegancki sposób tworzyć wyspecjalizowane wersje funkcji.