Generowanie i transformacje danych

Programowanie funkcyjne kładzie nacisk na przetwarzanie danych w sposób deklaratywny – poprzez operacje na kolekcjach bez użycia jawnych pętli i modyfikacji zmiennych. W Pythonie typowe techniki tego typu opierają się na funkcjach map(), filter(), reduce() oraz generatorach.

Funkcja map() pozwala na zastosowanie danej funkcji do każdego elementu sekwencji:

1  numbers = [1, 2, 3, 4]
2  doubled = map(lambda x: x * 2, numbers)
3  print(list(doubled))  # wynik: [2, 4, 6, 8]

Funkcja filter() służy do wybierania elementów spełniających określony warunek:

1  numbers = [1, 2, 3, 4, 5, 6]
2  even = filter(lambda x: x % 2 == 0, numbers)
3  print(list(even))  # wynik: [2, 4, 6]

reduce() (z modułu functools) umożliwia akumulację wartości, np. obliczenie sumy lub iloczynu:

1  from functools import reduce
2
3  numbers = [1, 2, 3, 4]
4  product = reduce(lambda x, y: x * y, numbers)
5  print(product)  # wynik: 24

Oprócz powyższych funkcji, ważnym elementem stylu funkcyjnego są generatory – konstrukcje umożliwiające leniwe (czyli nieprzechowujące całej sekwencji w pamięci) generowanie danych. Przykład generatora liczb parzystych:

1  def even_numbers(n):
2      for i in range(n):
3          if i % 2 == 0:
4              yield i
5
6  for num in even_numbers(10):
7      print(num, end=" ")  # wynik: 0 2 4 6 8

Generatory pozwalają na przetwarzanie dużych zbiorów danych w sposób wydajny pamięciowo, co czyni je szczególnie przydatnymi w praktyce analizy danych, przetwarzania plików czy strumieni.