Wykład 4
Transkrypt
Wykład 4
Podstawy programowania Python – wykład 4 Funkcje ● ● ponowne użycie kodu: funkcje pozwalają na grupowanie i parametryzację części kodu, która ma być użyta dowolnie często w dowolnym czasie; dekompozycja proceduralna: funkcje zapewniają mechanizm podziału systemów na fragmenty, realizujące dobrze zdefiniowane zadania; łatwiej jest wykonywać małe zadania oddzielnie niż cały program naraz; Funkcje ● ● ● ● ● Instrukcja def: jest instrukcją wykonywalną; po uruchomieniu generuje nowy obiekt i przypisuje go do nazwy funkcji. Instrukcja return: przekazuje obiekt wynikowy do wywołujacego; po wywołaniu funkcji wywołujacy zatrzymuje się, aż do momentu, gdy funkcja zakończy działanie i zwróci sterowanie; funkcje obliczjące wartość przekazują ją do wywołującego za pomocą instrukcji return. Instrukcja global: deklaruje zmienne, które mają zasięg (są przypisane) na poziomie modułu. Argumenty: są przekazywane przez przypisanie (odwołanie do obiektu). UWAGA: Ponieważ w Pythonie nie ma przymusu okreslania typu w funkcjach, to jedna funkcja może być stosowana do obiektów różnego typu. Postać ogólna def <nazwa>(arg1, arg2, …, argN): #nagłówek <instrukcje> return <wartość> #ciało funkcji UWAGI ● ● ● ● ● Instrukcja def tworzy obiekt funkcji i przypisuje mu nazwę. Wiersz nagłówkowy zawiera nazwę funkcji (do której jest przypisany obiekt funkcji) oraz listę argumentów (parametrów), które są przypisane do obiektów przekazywanych w nawiasach w miejscu wywołania. W ciele funkcji są instrukcje, czyli kod uruchamiany przy każdym wywoływaniu funkcji. W ciele funkcji może, ale nie musi występować instrukcja return. Kończy ona wywolanie funkcji i odsyła wynik do wywołujacego. Zawiera ona wyrażenie obiektowe, które podaje wynik funkcji. Przy braku instrukcji return, funkcja kończy się po wyjściu sterowania poza ciało. Formalnie funkcja bez return zwraca automatycznie obiekt None. Przykład 1 def razy(x,y): return x * y print(razy(2,4)) print(razy('Ala',4)) Przykład 2 def przeciecie(arg1, arg2): wynik = [] for i in arg1: if i in arg2: wynik.append(i) return wynik s1 = 'mielonka' s2 = 'wiele' print(przeciecie(s1,s2)) print(przeciecie([1,2,3,4],(1,2,4,5))) Zakresy działania w funkcjach ● ● ● ● ● Gdy w programie użyjemy nazwy, Python tworzy, modyfikuje lub wyszukuje ją w miejscu zwanym przestrzenią nazw. Nazwy w języku Python pojawiają się wówczas, gdy zostanie im przypisana wartość. Ponieważ nazwy nie są deklarowane z góry, Python używa przypisania nazwy do powiązania jej z odpowidnią przestrzenią nazw. Funkcje dodają dodatkową warstwę do obszaru nazw w programie. Domyślnie nazwy przypisane wewnątrz funkcji są związane tylko z przestrzenią nazw tej funkcji, i z niczym innym. Zakresy działania w funkcjach ● ● ● Funkcje działają w zagnieżdżonym obszarze nazw, czasem zwanym zakresem. Dzięki temu nazwy, których one używają, nie powodują konfliktu z nazwami zewnętrznymi (umieszczonymi w innej funkcji lub w module). Zwykle mówi się, że funkcja definiuje zakres lokalny, a moduły definiują zakres globalny. Zakresy te zależne są od siebie w następujący sposób: – moduł otaczający jest zakresem globalnym; – każde wywołanie funkcji ma nowy zakres lokalny; – nazwy przypisane są lokalne, chyba że są zadeklarowane jako globalne; – wszystkie pozostałe nazwy są nazwami globalnymi lub wbudowanymi. Przykład 3 X = 99 def A(Y): wynik = X + Y return wynik print(A(1)) Przykład 4 X, Y = 99, 1 def A(): global wynik wynik = X + Y A() print(wynik) Przekazywanie argumentów ● ● ● Argumenty są przekazywane za pomocą przypisania obiektów do nazw lokalnych. Przypisanie do nazw argumentów wewnątrz funkcji nie wpływa na wywołanie Modyfikacja obiektu zmiennego (listy, słowniki) w funkcji może mieć wpływ na wywołanie. Przykład 5 def changer(x,y): x = 2 y[0] = 'golonka' X = 1 L = [1,2] print(X) print(L) changer(X,L) print(X) print(L) Przykład 6 def zmiana(x,y): x = 2 y = [3,4] return x, y X = 1 Y = [1,2] print(X, Y) X,Y = zmiana(X,Y) print(X, Y) Specjalne tryby dopasowania argumentów ● Pozycyjny: dopasowanie od lewej do prawej. ● Słowa kluczowe: dopasowanie za pomocą nazwy argumentu. ● ● varargs: wychwycenie niedopasowanych argumentów pozycyjnych lub słów kluczowych. Funkcje mogą używać specjalnych argumentów, gromadzących dowolną liczbę argumentów dodatkowych. Domyślne: określanie wartości dla argumentów, które nie zostały przekazane. Specjalne tryby dopasowania argumentów Składnia Położenie Interpretacja func(value) wywołanie Argument normalny: dopasowanie na podstawie pozycji func(naze=value) wywołanie Słowo kluczowe: dopasowanie na podstawie nazwy def func(name) funkcja Argument normalny: dopasowanie do wszystkiego na podstawie pozycji lub nazwy def func(name = value) funkcja Domyślna wartość argumentu, jeśli nie był on przekazany w wywołaniu def func(*name) funkcja Dopasowanie do pozostałych argumentów pozycyjnych (w krotce) def func(**name) funkcja Dopasowanie do pozostałych słów kluczowych (w słowniku) Przykład 7 def wypisz(A, B, C = 0, D = 0): print(A, B, C, D) wypisz(1,2) wypisz(1, D = 9, B = 3) wypisz(A = 10, B = 11) wypisz(C = 9, B = 8, A = 7) wypisz(1,2,3,4) Przykład 8 def A(*args): wynik = [] for x in args[0]: for i in args[1:]: if x not in i: break else: wynik.append(x) return wynik a, b, c = 'mielonka', 'wiele', 'szlam' print(A(a,b,c)) Przykład 9 def B(*args): wynik = [] for x in args: for i in x: if i not in wynik: wynik.append(i) return wynik a, b, c = 'mielonka', 'wiele', 'szlam' print(B(a,b,c))