Programowanie funkcyjne
Listy składane
Listy składane (ang. list comprehensions) pozwalają na tworzenie nowych list na podstawie już istniejących w formie zwięzłego wyrażenia — bez konieczności użycia pętli.
liczby = range(-20, 20) liczby_i_kwadraty = [(x, x**2) for x in liczby] kwadraty_parzyste = [x**2 for x in liczby if x%2 == 0] liczby_dodatnie = [x for x in liczby if x > 0]
Wyrażenia lambda
Wyrażenia lambda służą do tworzenia wyrażeń, których wartościami są funkcje. Taka funkcja może zawierać tylko jedno wyrażenie, którego wartość będzie zwrócona w miejsce wywołania; wyrażenie lambda nie może zawierać instrukcji.
Wyrażenia lambda wykorzystuje się w miejscach,
gdzie wymagany jest obiekt funkcyjny,
ale pisanie w tym celu klasycznej funkcji
(z pomocą słowa kluczowego def
)
byłoby nieopłacalne.
# funkcja jednoparametrowa: kwadrat = lambda x: x*x a = kwadrat(13) import datetime # funkcja bezparametrowa: aktualna_godzina = lambda: datetime.datetime.now().hour print aktualna_godzina() # funkcja dwuparametrowa suma = lambda a, b: a+b
Funkcje wyższego rzędu
W Pythonie wszystko jest obiektem — funkcje również; z tego powodu mogą być one przekazywane do funkcji jako parametry i zwracane z niej jako wartość.
def gen_inc(n): def fun(x): return n+x return fun inc5 = gen_inc(5) print inc5(10) def map(fun, list): return [fun(item) for item in list] print map(lambda x: x+100, range(10))
W powyższym przykładzie zdefiniowano funkję map
znaną z wielu języków funkcyjnych
(dostępna jest standardowo w Pythonie).
Generatory
Generatorów używamy wszędzie, gdzie można użyć sekwencji, przy czym charakteryzują się one leniwą ewaluacją — wydają kolejne elementy sekwencji jedynie w momencie, gdy są one potrzebne.
def generator(n): while n: print 'Zwracam %d z generatora.' % n yield n n -= 1 import time for x in generator(10): time.sleep(0.5) print 'Wypisuję %d w pętli.' % x time.sleep(0.5) generator = ((x, 2*x) for x in range(10)) for a, b in generator: print a, b
Zadania
-
Napisz funkcję, która przyjmuje napis — tekst w języku naturalnym. Funkcja ma zwrócić listę krotek: słowo i jego długość dla wszystkich słów znajdujących się w napisie. Użyj list składanych.
-
Zaimplementuj samodzielnie funkcję
filter
, która przyjmuje funkcję logiczną oraz listę. Funkcja ma zwrócić listę elementów podanej listy, które spełniają warunek określony za pomocą przekazanej jako pierwszy parametr funkcji. -
Napisz funkcję, która przyjmuje listę punktów na płaszczyźnie (np. dwuelementowych krotek z wartościami typu
float
) i zwraca listę tych samych punktów posortowaną według odległości od początku układu współrzędnych. Użyj metodysort
(lub funkcjisorted
— czym one się różnią?) na liście oraz wyrażenia lambda jako jej argumentukey
. -
Napisz generator, który będzie zwracał nazwy kolejnych plików z bieżącego katalogu, których rozszerzenie to
.py
. Skorzystaj z funkcjios.listdir
oraz metodyendswith
klasystr
.