poprzedni temat | w górę | następny temat

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

  1. 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.

  2. 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.

  3. 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 metody sort (lub funkcji sorted — czym one się różnią?) na liście oraz wyrażenia lambda jako jej argumentu key.

  4. Napisz generator, który będzie zwracał nazwy kolejnych plików z bieżącego katalogu, których rozszerzenie to .py. Skorzystaj z funkcji os.listdir oraz metody endswith klasy str.

poprzedni temat | w górę | następny temat