Wykład 5
Transkrypt
Wykład 5
Podstawy programowania Python – wykład 5 Funkcje ● lambda tworzy funkcje anonimowe; ● map uruchamia funkcję poza sekwencją i zbiera wyniki; ● funkcje zwracają None, jeśli nie używają instrukcji return; ● funkcje dają możliwość wyboru projektu; ● funkcje są obiektami, podobnie jak liczby i łańcuchy. Wyrażenia lambda ● Oprócz instrukcji def w języku Python istnieje wyrażenie, które generuje obiekty funkcji – to wyrażenie lambda. ● Zapisuje się to jako słowo kluczowe lambda, po którym nastepuje jeden lub więcej argumentów zakończonych dwukropkiem, a za tym następuje wyrażenie: lambda arg1, arg2, …, argN: wyr używające arg lambda ● ● ● ● lambda jest wyrażeniem, a nie instrukcją – dlatego może pojawiać się wszędzie tam, gdzie nie może występować def, np. wewnątrz stałej listy. lambda jako wyrażenie zwraca wartość (czyli nową funkcję), której może być opcjonalnie przypisana nazwa. (Instrukcja def zawsze przypisuje nową funkcję do nazwy w nagłówku, a nie zwraca ją jako wynik). Ciało wyrażenia lambda jest pojedynczym wyrażeniem, a nie blokiem instrukcji – podobne jest do tego, co wstawia się w ciele def w instrukcji return. W wyrażeniu lambda można zawrzeć tylko takie działania, w których nie są wymagane instrukcje podobne do if. Przykład 1 def F(x,y,z): return x + y + z print(F(2,3,4)) f = lambda x, y, z: x + y + z print(f(2,3,4)) x = lambda a='ala', b='ola', c='ela': a + b + c print(x(c='zbyszek')) Przykład 2 Wprowadzenie wyrażenia lambda do stałej listy: L = ( lambda x: x**2, lambda x: x**3, lambda x: x**4 ) for i in L: print(i(2)) print(L[0](3)) Wbudowana funkcja map ● ● ● Jedną z najczęściej spotykanych sytuacji przy przetwarzaniu list przez programy jest wykonanie operacji w każdym węźle i zebranie wyników – służy do tego wbudowana funkcja map. Ponieważ map spodziewa się funkcji, to właśnie z nią stosowane są często wyrażenia labda, przykład 6. map jest najprostszą spośród funkcji wbudowanych języka Python, używanych w programowaniu funkcjonalnym (w większości przypadków oznacza to narzędzia, które uruchamiają funkcje w sekwencji). Przykład 3 Aktualizacja wszystkich liczników z danej listy: liczniki = [1,2,3,4] poprawione = [] for i in liczniki: poprawione.append(i+10) print(poprawione) Przykład 4 Funkcja map wywołuje przekazaną funkcję dla każdej pozycji w obiekcie sekwencyjnym i zwraca listę, zawierającą wszystkie wyniki wywołania tej funkcji. liczniki = [1,2,3,4] def przyrost(x): return x + 10 s = list(map(przyrost, liczniki)) print(s) w = list(map(lambda x: x+3, liczniki)) print(w) Zasady projektowania funkcji ● ● ● Dla wejść należy używać argumentów, a dla wyjść instrukcji return – powinniśmy starać się zbudować funkcję niezależnie od czynników na zewnątrz funkcji. Zmiennych globalnych należy używać tylko wtedy, gdy jest to absolutnie konieczne. Nie należy modyfikować argumentów zmiennych, jeśli wywołanie tego nie oczekuje – uwaga ta dotyczy obiektów zmiennych. Wywołania pośrednie ● ● ● Funkcje w fazie działania programu są obiektami, można tworzyć takie programy, które przetwarzają je w sposób obiektowy. Obiekty funkcji mogą być przypisane, przekazane do innych funkcji, zapisane w strukturach danych, itd., tak, jakby były prostymi liczbami lub łańcuchami. Obiekty funkcji mogą eksportować specjalne operacje, są one wówczas wywołane z argumentami podanymi w nawiasach po wyrażeniu funkcji. Przykład 5 Nazwa funkcji jest odwołaniem do obiektu, który można ponownie przypisać do innych nazw i wywołać go przez dowolne odwołanie, a nie tylko przez jego pierwszą nazwę. def drukuj(komunikat): print(komunikat) x = drukuj x('Hello world!') Przykład 6 Ponieważ argumenty są przekazywane przez przypisania do obiektów, to przekazanie funkcji do innych funkcji jest tak samo proste, jak przekazanie argumentów. def F(func,arg): func(arg) F(drukuj,'Hello world!') Moduły ● ● ● Moduł to najwyższa jednostka organizacyjna programu. Moduły przybierają postać plików z programami języka Python. Moduły są przetwarzane za pomocą: – import – pozwala klientowi na pobranie modułu w całości; – from – pozwala klientowi na pobranie specyficznych nazw z modułu; Dlaczego używa się modułów? ● Pozwalają w prosty sposób zorganizować składniki w jeden system. ● Ponowne użycie kodu. ● Podział systemowej przestrzeni nazw. ● Wprowadzanie współdzielonych usług lub danych. UWAGI ● ● ● ● ● Modułu można nazywać dowolnie, ale nazwy plików modułowych powinny mieć rozszerzenie py. Do nazw modułów stosuje się reguły nazywania zmiennych. Instrukcja import pobiera moduł jako całość, więc trzeba używać kwalifikacji, aby pobrać jego nazwy. from pobiera specyficzne nazwy z modułu. Użycie * w instrukcji from powoduje, że uzyskuje się kopie wszystkich nazw przypisanych na najwyższym poziomie wskazanego modułu. Przykład 7 funkcje.py def wypisz(x): print(x) def suma(x,y): return x + y def roznica(x,y): return x – y def iloczyn(x,y): return x * y def iloraz(x,y): return x / y Przykład 8 import funkcje funkcje.wypisz('Ala ma kota') print(funkcje.suma(10,20)) print(funkcje.roznica(10,20)) print(funkcje.iloczyn(10,20)) print(funkcje.iloraz(10,20)) Przykład 9 from funkcje import wypisz wypisz('Ala ma kota') print(suma(10,20)) Przykład 10 from funkcje import * wypisz('Ala ma kota') print(suma(10,20)) UWAGI ● ● ● ● ● ● Moduły są ładowane i uruchamiane po pierwszej instrukcji import lub from. Uruchomienie kodu modułu tworzy jego nazwy na najwyższym poziomie. Późniejsze wywołania import i from dotyczą modułu załadowanego wcześniej. import przypisuje cały obiekt modułowy do nazwy. from przypisuje jedną lub więcej nazw do obiektów o tych samych nazwach w innym module. import musi być wykonana po instrukcji from. Przykład 11 from funkcje import zm1,zm2 #tworzy kopie dwóch nazw print(zm1) print(zm2) zm1 = 12 #zmienia tylko lokalne zm1 zm2[0] = 123 #modyfikuje współdzielony obiekt zmienny import funkcje #pobiera nazwę modułu (from tego nie robi) print(funkcje.zm1) #zm1 z obiektu funkcje print(funkcje.zm2) #zm2 obiekt współdzielony i zmieniony