Programowanie funkcyjne w Pythonie

Podobne dokumenty
Wstęp do programowania

Python i programowanie funkcyjne. Python i programowanie funkcyjne czyli nie tylko obiektowość rządzi. OSEC Funkcyjnie w języku Python 1 z 40

Dzi kuj za uwag! Spotkania z Pythonem. Cz ± 1 - podstawy - rozwi zania zada« Michaª Alichniewicz. Gda«sk Studenckie Koªo Automatyków SKALP

Zaawansowany kurs języka Python

JĘZYK PYTHON - NARZĘDZIE DLA KAŻDEGO NAUKOWCA. Marcin Lewandowski [ ]

Python. Skąd taka nazwa? Kurs systemu UNIX 1

Programowanie funkcyjne wprowadzenie Specyfikacje formalne i programy funkcyjne

Przegląd języka Python. Łukasz Anwajler

Technologie cyfrowe semestr letni 2018/2019

Podstawy Programowania ELEMENTY PROGRAMU i TYPY DANYCH

Elementy języka Scheme

Programowanie funkcyjne. Wykªad 13

PARADYGMATY I JĘZYKI PROGRAMOWANIA. Programowanie funkcyjne (w- 8)

Technologie cyfrowe semestr letni 2018/2019

Bezbolesne Programowanie Współbieżne

Elementy języka Scheme

Wstęp do programowania

Kurs rozszerzony języka Python

Zaawansowany kurs języka Python

Wstęp do programowania

λ parametry. wartość funkcji suma = λ x y. x + y kwadrat = λ x. x * x K.M. Ocetkiewicz, 2008 WETI, PG 2 K.M. Ocetkiewicz, 2008 WETI, PG 3

Języki i metody programowania

PROGRAMOWANIE W PYTHONIE OD PIERWSZYCH KROKÓW

Kurs języka Python. Wykład 5. Marcin Młotkowski. 9 listopada Rodzaje parametrów funkcji. 2 Biblioteka Tk. 3 Układanie kontrolek w oknie

Programowanie w Ruby

PL/SQL. Zaawansowane tematy PL/SQL

Programowanie obiektowe

Podstawy programowania w języku C i C++

Metody Metody, parametry, zwracanie wartości

Podstawy programowania w Pythonie

Język PL/SQL Procedury i funkcje składowane

Programowanie w Ruby

PARADYGMATY I JĘZYKI PROGRAMOWANIA. Programowanie funkcyjne (w- 9)

Kurs rozszerzony języka Python

Wykresy i interfejsy użytkownika

System operacyjny Linux

FUNKCJA REKURENCYJNA. function s(n:integer):integer; begin if (n>1) then s:=n*s(n-1); else s:=1; end;

Paradygmaty programowania

MS Visual Studio 2005 Team Suite - Performance Tool

Bloki anonimowe w PL/SQL

Gdzie jest moja tabela?

Kurs rozszerzony języka Python

Dekoratora używa się wstawiając linijkę zaczynającą się przed definicją dekorowanego obiektu (klasy czy funkcji).

Pytania dla języka Python

Przetwarzanie sygnaªów

Zaawansowane bazy danych i hurtownie danych semestr I

Wątki i komunikacja między nimi w języku Python

Podstawy programowania w Pythonie

Podstawy Pythona. Krzysztof Gdawiec. Instytut Informatyki Uniwersytet Śląski

Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać

Programowanie obiektowe w Perlu

Procedury i funkcje składowane

SymPy czyli matematyka w Pythonie

Programowanie obiektowe

Wstęp do Informatyki i Programowania (kierunek matematyka stosowana)

Programista samouk : profesjonalny przewodnik do samodzielnej nauki kodowania / Cory Althoff. Gliwice, copyright Spis treści

Python. Wprowadzenie. Jolanta Bachan

Wyjątki. try - except

Podstawowe I/O Liczby

Wstęp do Programowania potok funkcyjny

Comarch ERP XL Business Intelligence Start. Migracja do wersji 2018

Podstawy programowania w Pythonie

Ćwiczenie 3. Python 3: Python 3: Funkcje, moduły i operacje na plikach

Oracle PL/SQL. Paweł Rajba.

Dzi kuj za uwag! Spotkania z Pythonem. Cz ± 3 - wyra»enia lambda, generatory, dekoratory, operacje na plikach. Michaª Alichniewicz.

Wrocław, Wstęp do informatyki i programowania: liczby pierwsze. Wydział Matematyki Politechniki Wrocławskiej.

Zaawansowany kurs języka Python

Spis treści. Funkcje. 1 Funkcje 1.1 Zadanie Zadanie Zadanie Zadanie Zadanie Zadanie Zadanie 7

Programowanie w Sieci Internet. Python: Wątki. Kraków, 12 grudnia 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki

Programowanie. Projektowanie funkcje programu tworzenie algorytmu i struktur danych. Programowanie implementacja algorytmu kompilacja programu

Programowanie i projektowanie obiektowe

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Programowanie w Ruby

Wstęp do programowania

Paradygmaty programowania

rozdział 4: ZMIENNE I INSTRUKCJE

Programowanie robota mobilnego E-puck w języku Python

Interpolacja funkcjami sklejanymi

JavaScript funkcyjność

Wzorce logiki dziedziny

Algorytmy i struktury danych

Funkcje w PL/SQL Funkcja to nazwany blok języka PL/SQL. Jest przechowywana w bazie i musi zwracać wynik. Z reguły, funkcji utworzonych w PL/SQL-u

Bash i algorytmy. Elwira Wachowicz. 20 lutego

Podstawy. Jan Koprowski Politechnika Gdańska, FTiMS Informatyka Stosowana

Lab. 02: Algorytm Schrage

x = (x 1, x 2,..., x n ), p = (p 1, p 2,..., p n )

System operacyjny Linux

Języki i metody programowania

Środowisko programisty

Podstawy programowania funkcjonalnego

Scenariusz Web Design DHTML na 10 sesji. - Strony statyczne I dynamiczne. - Dodawanie kodu VBScript do strony HTML. Rysunek nie jest potrzebny

Instrukcja wyboru, pętle. 2 wykład. Podstawy programowania - Paskal

Plan Przegląd podstawowych typów i konstrukcji języka

Wykład nr 1 Język Ruby i framework Rails

2 Liczby rzeczywiste - cz. 2

Filozoa Clojure. Mateusz Dereniowski. 15 lipca Instytut Informatyki Uniwersytetu Wrocªawskiego

Tablice i łańcuchy znakowe jako obiektowe typy danych. dr Jarosław Skaruz

Zofia Kruczkiewicz, Programowanie obiektowe - java, wykład 2 1

1. Wprowadzenie do C/C++

PARADYGMATY PROGRAMOWANIA Wykład 4

Transkrypt:

Programowanie funkcyjne w Pythonie Koªo DSG 2013 Konrad Siek konrad.siek@cs.put.edu.pl dsg.cs.put.poznan.pl

Paradygmat funkcyjny Paradygmat = sposób my±lenia o problemach

Paradygmat funkcyjny Paradygmat = sposób my±lenia o problemach Programowanie imperatywne co robi? w jakiej kolejno±ci? p tle, procedury, obiekty

Paradygmat funkcyjny Paradygmat = sposób my±lenia o problemach Programowanie imperatywne co robi? w jakiej kolejno±ci? p tle, procedury, obiekty Programowanie funkcyjne jaki ma by efekt? jak skomponowa program? funkcje i rekurencja

Problem e ls e suma elementów listy ls

Problem e ls e suma elementów listy ls styl imperatywny sum = 0 for e in ls sum += e

Problem e ls e suma elementów listy ls styl imperatywny sum = 0 for e in ls sum += e styl funkcyjny def f(ls): if not ls: return 0 else: return ls[0] + f(ls[1:])

Paradygmat funkcyjny Programowanie funkcyjne Koncepcje i zagadnienia: funkcje pierwszej klasy funkcje wy»szego rz du czyste funkcje funkcje anonimowe domkni cia rekurencja ogonowa currying leniwa ewaluacja

Paradygmat funkcyjny Programowanie funkcyjne Zalety kompozycja wspóªbie»no± testowanie udawadnianie pasuje do niektórych problemów Wady brak wsparcia cz sto niewydajne ezoteryczne

Paradygmat funkcyjny Programowanie funkcyjne Zalety kompozycja wspóªbie»no± testowanie udawadnianie pasuje do niektórych problemów Wady brak wsparcia cz sto niewydajne ezoteryczne Uzupeªnienia inne paradygmaty

Funkcje pierwszej klasy map, lter, reduce rst-class, higher order functions lambda underscore variable list comprehension

Funkcje pierwszej klasy styl imperatywny sum = 0 for e in ls sum += e styl funkcyjny def f(ls): if not ls: return 0 else: return ls[0] + f(ls[1:])

Funkcje pierwszej klasy styl imperatywny i, sum = 0, 0 while i < length(ls): sum += ls[i] i += 1 styl funkcyjny def f(ls): if not ls: return 0 else: return ls[0] + f(ls[1:])

Funkcje pierwszej klasy reduce(function, sequence [, initial]) Uruchamia kumuluj c funkcj function na ka»dym kolejnym elemencie kolekcji sequence i otrzymuje w wyniku jedn warto±. Python3: functools.reduce

Funkcje pierwszej klasy reduce(function, sequence [, initial]) Uruchamia kumuluj c funkcj function na ka»dym kolejnym elemencie kolekcji sequence i otrzymuje w wyniku jedn warto±. Python3: functools.reduce def reduce(function, sequence, initial): if not sequence: return initial else: return function(sequence[0], reduce(function, sequence[1:], initial)

Funkcje pierwszej klasy styl imperatywny sum = 0 for e in ls sum += e styl funkcyjny def f(ls): if not ls: return 0 else: return ls[0] + f(ls[1:])

Funkcje pierwszej klasy styl imperatywny sum = 0 for e in ls sum += e styl funkcyjny def _sum(a, b): return a + b reduce(_sum, ls, 0)

Funkcje pierwszej klasy lambda [args]: expr Operator funkcji anonimowej o argumentach args zwracajacej wynik wyra»enia expr. Ograniczenia: tylko jedno wyra»enie tylko wyra»enia (nie instrukcje) square = lambda x: x^2 square(2)

Funkcje pierwszej klasy styl imperatywny sum = 0 for e in ls sum += e styl funkcyjny def _sum(a, b): return a + b reduce(_sum, ls, 0)

Funkcje pierwszej klasy styl imperatywny sum = 0 for e in ls sum += e styl funkcyjny _sum = lambda a, b: a + b reduce(_sum, ls, 0)

Funkcje pierwszej klasy styl imperatywny sum = 0 for e in ls sum += e styl funkcyjny reduce(lambda a, b: a + b, ls, 0)

Funkcje pierwszej klasy styl imperatywny sum = 0 for e in ls sum += e styl funkcyjny reduce(lambda a, b: a + b, ls, 0)

Funkcje pierwszej klasy map(function, sequence) Uruchamia mapuj c funkcj function na ka»dym elemencie kolekcji sequence i otrzymuje w wyniku now kolekcj. map(lambda x: 2**x, [0,1,2,3,4,5,6,7])

Funkcje pierwszej klasy map(function, sequence) Uruchamia mapuj c funkcj function na ka»dym elemencie kolekcji sequence i otrzymuje w wyniku now kolekcj. map(lambda x: 2**x, [0,1,2,3,4,5,6,7]) filter(function, sequence) Uruchamia ltruj c funkcj function na ka»dym elemencie kolekcji sequence i otrzymuje w wyniku now kolekcj zawieraj c tylko te elementy dla których function zwróciªo prawd. filter(lambda x: x and x % 2 == 0, [0,1,2,3,4,5,6,7])

Funkcje pierwszej klasy map(function, sequence) Uruchamia mapuj c funkcj function na ka»dym elemencie kolekcji sequence i otrzymuje w wyniku now kolekcj. map(lambda x: 2**x, [0,1,2,3,4,5,6,7]) filter(function, sequence) Uruchamia ltruj c funkcj function na ka»dym elemencie kolekcji sequence i otrzymuje w wyniku now kolekcj zawieraj c tylko te elementy dla których function zwróciªo prawd. filter(lambda x: x and x % 2 == 0, [0,1,2,3,4,5,6,7]) Python3: :c

Przykªad: pomiar temperatury from collections import namedtuple _T = namedtuple('_t', ['city', 'date', 'temp', 'scale']) thermometers = [_T('Dortmund', '2013-03-1', 28, 'F'), _T('Paris', '2013-02-27', 5, 'C'),... ] min, max = None, None for t in thermometers: if t.date!= '2013-03-04': continue temp = t.temp if t.scale == 'C' else 5*(t.temp-32)/9 if not min or temp < min: min = temp if not max or temp > max: max = temp

Przykªad: pomiar temperatury from collections import namedtuple _T = namedtuple('_t', ['city', 'date', 'temp', 'scale']) thermometers = [_T('Dortmund', '2013-03-1', 28, 'F'), _T('Paris', '2013-02-27', 5, 'C'),... ] today = filter(lambda t: t.date == '2013-03-04', thermometers) celsius = map(lambda t: t.temp if t.scale == 'C' else 5*(t.temp-32)/9, today) max = reduce(lambda a,b: a if a > b else b, celsius) min = reduce(lambda a,b: a if a < b else b, celsius)

Przykªad: pomiar temperatury from collections import namedtuple _T = namedtuple('_t', ['city', 'date', 'temp', 'scale']) thermometers = [_T('Dortmund', '2013-03-1', 28, 'F'), _T('Paris', '2013-02-27', 5, 'C'),... ] filter(lambda t: t.date == '2013-03-04', thermometers) map(lambda t: t.temp if t.scale == 'C' else 5*(t.temp-32)/9, _) max = reduce(lambda a,b: a if a > b else b, _) min = reduce(lambda a,b: a if a < b else b, _)

Generatory list Mapowanie [stmt for e in sequence] Tworzy now (anonimow ) sekwencj, w której dla ka»dego elementu e z kolekcji sequence znajdzie si wynik wyra»enia stmt.

Generatory list Mapowanie [stmt for e in sequence] Tworzy now (anonimow ) sekwencj, w której dla ka»dego elementu e z kolekcji sequence znajdzie si wynik wyra»enia stmt. map(lambda x: 2**x, range(0, 7)) [2**x for x in range(0, 7)]

Generatory list Mapowanie [stmt for e in sequence] Tworzy now (anonimow ) sekwencj, w której dla ka»dego elementu e z kolekcji sequence znajdzie si wynik wyra»enia stmt. map(lambda x: 2**x, range(0, 7)) [2**x for x in range(0, 7)] Filtrowanie [stmt for e in sequence if cond] Tworzy now (anonimow ) sekwencj, w której dla ka»dego elementu e z kolekcji sequence dla którego jest speªniony warunek cond znajdzie si wynik wyra»enia stmt.

Generatory list Mapowanie [stmt for e in sequence] Tworzy now (anonimow ) sekwencj, w której dla ka»dego elementu e z kolekcji sequence znajdzie si wynik wyra»enia stmt. map(lambda x: 2**x, range(0, 7)) [2**x for x in range(0, 7)] Filtrowanie [stmt for e in sequence if cond] Tworzy now (anonimow ) sekwencj, w której dla ka»dego elementu e z kolekcji sequence dla którego jest speªniony warunek cond znajdzie si wynik wyra»enia stmt. filter(lambda x: x and x % 2 == 0, range(0, 7)) [x for x in range(0, 7) if x and x % 2 == 0]

Przykªad: pomiar temperatury from collections import namedtuple _T = namedtuple('_t', ['city', 'date', 'temp', 'scale']) thermometers = [_T('Dortmund', '2013-03-1', 28, 'F'), _T('Paris', '2013-02-27', 5, 'C'),... ] filter(lambda t: t.date == '2013-03-04', thermometers) map(lambda t: t.temp if t.scale == 'C' else 5*(t.temp-32)/9, _) max = reduce(lambda a,b: a if a > b else b, _) min = reduce(lambda a,b: a if a < b else b, _)

Przykªad: pomiar temperatury from collections import namedtuple from functools import reduce _T = namedtuple('_t', ['city', 'date', 'temp', 'scale']) thermometers = [_T('Dortmund', '2013-03-1', 28, 'F'), _T('Paris', '2013-02-27', 5, 'C'),... ] [t for t in thermometers if t.date == '2013-03-04'] [t.temp if t.scale == 'C' else 5*(t.temp-32)/9 for t in _] max = reduce(lambda a,b: a if a > b else b, _) min = reduce(lambda a,b: a if a < b else b, _)

Currying partial application

Currying Currying Schönnkeling f : (X Y Z) V f c : X Y Z V

Currying Currying Schönnkeling f : (X Y Z) V f c : X Y Z V lambda x, y, z: v == lambda x: lambda y: lambda z: v

Currying Currying Schönnkeling f : (X Y Z) V f c : X Y Z V lambda x, y, z: v == lambda x: lambda y: lambda z: v cz ±ciowa aplikacja partial(function[, *args]) Tworzy now funkcj * z ustawionymi argumentami args na podstawie funkcji function. Funkcja z pakietu functools.

Currying Currying Schönnkeling f : (X Y Z) V f c : X Y Z V lambda x, y, z: v == lambda x: lambda y: lambda z: v cz ±ciowa aplikacja partial(function[, *args]) Tworzy now funkcj * z ustawionymi argumentami args na podstawie funkcji function. Funkcja z pakietu functools. przykªad from functools import partial power = lambda x, y: x**y square = partial(power, y = 2) cube = partial(power, y = 3) print square(3), cube(3)

Przykªad: funkcje na listach from functools import partial, reduce def sum(ls): return reduce(lambda x,y: x+y, ls) def product(ls): return reduce(lambda x,y: x*y, ls) def factorial(ls): return map(lambda x: product(range(1, x + 1)), ls)

Przykªad: funkcje na listach from functools import partial, reduce sum = partial(reduce, lambda x,y: x+y) product = partial(reduce, lambda x,y: x*y) factorial = partial(map, lambda x: product(range(1, x + 1)))

Przykªad: numpad import Tkinter from functools import partial window = Tkinter.Tk() contents = Tkinter.Variable(window) display = Tkinter.Entry(window, textvariable=contents) display.pack() def clicked(digit): contents.set(contents.get() + str(digit)) for number in [7, 8, 9, 4, 5, 6, 1, 2, 3, 0]: button = Tkinter.Button(window, text=number, command=partial(clicked, number)) button.pack(side="left", fill="x") Tkinter.mainloop()

Domkni cie closures

Domkni cie Domkni cie Funkcje z dost pem do swojego kontekstu.

Domkni cie Domkni cie Funkcje z dost pem do swojego kontekstu. pi = 3.14 def area(r): return pi * r**2

Domkni cie Domkni cie Funkcje z dost pem do swojego kontekstu. def make_area(): pi = 3.14 def area(r): return pi * r**2 return area

Domkni cie Domkni cie Funkcje z dost pem do swojego kontekstu. def make_area(): pi = 3.14 def area(r): return pi * r**2 return area f = make_area() f(2) # 12.56

Domkni cie Domkni cie Funkcje z dost pem do swojego kontekstu. def make_area(): pi = 3.14 def area(r): return pi * r**2 return area f = make_area() f(2) # 12.56 big deal...

Domkni cie Domkni cie Funkcje z dost pem do swojego kontekstu. def make_area(): pi = 3.14 def area(r): return pi * r**2 pi = 3.1415926 return area f = make_area() f(2) # 12.5663704

Przykªad: liczniki counter = 0 def next(): global counter value = counter counter += 1 return value

Przykªad: liczniki counter = 0 def next(): global counter value = counter counter += 1 return value 10 liczników?

Przykªad: liczniki def make_counter(start=0): counter = start def next(): global counter value = counter counter += 1 return value return next counters = [make_counter() for _ in range(0, 10)]

Przykªad: liczniki def make_counter(start=0): counter = start def next(): nonlocal counter value = counter counter += 1 return value return next counters = [make_counter() for _ in range(0, 10)]

Przykªad: liczniki def make_counter(start=0): ctx = {'counter': start} def next(): value = ctx['counter'] ctx['counter'] += 1 return value return next counters = [make_counter() for _ in range(0, 10)]

Podsumowanie the end is nigh

Zagadnienia funkcje pierwszej klasy itp. (map, reduce, filter, lambda)

Zagadnienia funkcje pierwszej klasy itp. (map, reduce, filter, lambda) currying/cz ±ciowa aplikacja (partial)

Zagadnienia funkcje pierwszej klasy itp. (map, reduce, filter, lambda) currying/cz ±ciowa aplikacja (partial) domkni cia

Zagadnienia funkcje pierwszej klasy itp. (map, reduce, filter, lambda) currying/cz ±ciowa aplikacja (partial) domkni cia

Zagadnienia funkcje pierwszej klasy itp. (map, reduce, filter, lambda) currying/cz ±ciowa aplikacja (partial) domkni cia Why bother? prostsze rozwi zania

Zagadnienia funkcje pierwszej klasy itp. (map, reduce, filter, lambda) currying/cz ±ciowa aplikacja (partial) domkni cia Why bother? prostsze rozwi zania zwi zªo±

Zagadnienia funkcje pierwszej klasy itp. (map, reduce, filter, lambda) currying/cz ±ciowa aplikacja (partial) domkni cia Why bother? prostsze rozwi zania zwi zªo± geek cred

Pytania 42

Join us dsg.cs.put.poznan.pl/forum