Przejdź do treści głównej

Własne funkcje

Funkcje

Funkcje to "czasowniki" w języku programowania. Czyli to nazwany blok kodu który wykonuje jakieś działania. Czasami w jego wyniku jest również zwracana jakaś wartość.

Do tej pory korzystaliśmy z funkcji dostarczonych nam przez Pythona (np . print), lub "wgranych" z biblioteki / modułu.

Pisząc własne programy już na tym etapie zetknęliśmy się z sytuacją gdy robiliśmy podobną rzecz wiele razy - zmieniały się np. tylko dane wejściowe np. modyfikowaliśmy jakiś adres w książce adresowej, gdzie zmieniało się tylko, który adres był modyfikowany.

Możemy taką funkcjonalność ;) zebrać w całość i udostępnić jako własną funkcję. Należy pamiętać, że Python odczytuje nasz kod linijka po linijce, z góry na dół - więc musimy stworzyć nasz "czasownik" przed jego użyciem (deklaracja funkcji musi być wcześniej w kodzie).

Własną funkcję deklarujemy używając słowa def.

np.

def kwadrat(x:int) ->  int:
	wynik = x * x
	return wynik

Zwróćcie uwagę na słowo return - wykorzystujemy je jeśli chcemy, żeby nasza funkcja poza wykonaniem jakiejś operacji zwróciła nam jakąś wartość (którą np. możemy przypisać do zmiennej). Bardzo dużo funkcji korzysta z tej opcji - np. funkcja sum zwraca nam sumę dwóch liczb, funkcja max zwraca nam największą wartość przechowywaną chociażby na liście itd.

Nie jest to jednak reguła - np. funkcja print wyświetla nam daną zawartość na ekranie, ale nie zwraca żadnej wartości.

Powyższy przykład zawiera nieco nieobowiązkowych rzeczy:

  • informację o oczekiwanym typie danych parametru wykorzystywanego w funkcji (x:int)
  • informację o zwracanym typie danych (-> int)

Dodawanie tych informacji jest dobrą praktyką - ułatwia nam (i innym użytkownikom tego kodu) korzystanie z programu.

Ponadto dzięki nim narzędzia jakich używamy do pisania będą w stanie podpowiadać nam w przypadku popełnienia błędu związanego z użyciem nieprawidłowego typu.

Tak skonstruowana funkcje wykorzystujemy identycznie jak te wbudowane np.

def kwadrat(x:int) ->  int:
	wynik = x * x
	return wynik

liczba = kwadrat(2)
print(liczba)

Powyższa kod wyświetli nam 4 gdyż jest to 2 podniesione do kwadratu (a właśnie to robi ta funkcja kwadrat).

Parametry pozycyjne

Paremetry do funkcji możemy przekazywać w kolejności ich zadeklarowania w sygnaturze funkcji np.

def wydrukuj_zmienne(a, b, c):
    print("a to:", a)
    print("b to:", b)
    print("c to:", c)

wydrukuj_zmienne(1,2,3)

zakończy się wynikiem:

a to: 1
b to: 2
c to: 3

Czyli do a została przypisana 1, do b 2, a do c 3.

Jeśli przekazujemy parametry w ten sposób musimy znać ich kolejność w sygnaturze funkcji.

Parametry po kluczu

Możemy też skorzystać z innego wariantu:

def wydrukuj_zmienne(a, b, c):
    print("a to:", a)
    print("b to:", b)
    print("c to:", c)

wydrukuj_zmienne(c=1,a=3,b=2)

co da:

a to: 3
b to: 2
c to: 1

W tym przypadku wywołując funkcję dokładnie podaliśmy do jakiej zmienne powinny przechowywać wskazane wartości.

Oznacza to trochę więcej pisania - ale jest mniejsze ryzyko popełnienia błędu. Ten wariant jest też bardzo przydatny przy bardziej rozbudowanych funkcjach, które mają masę możliwych parametrów - nie musimy zapamiętywać pozycji każdego z nich.

Zakres (scope)

"Wnętrze" funkcji jest odizolowane od reszty kodu. Ozancza to, że np. zmienna moja_zmienna zadaklarowana poza funkcją i identycznie nazwana zmienna wewnątrz funkcji to 2 RÓŻNE zmienne(!).

moja_zmienna = 55 # deklaruje zmienna 

def moja_funkcja():
    moja_zmienna = 1    # deklaruje zmienna wewnatrz funkcji
    print(moja_zmienna)

moja_funkcja()
print(moja_zmienna)

# wynikeim będzie
# 1
# 55
# bo mimo identycznej nazwy
# zmienna wewnątrz funkcji operuje
# w innym zakresie (ma swoje wlasne nazwy)