Nareszcie przyjdzie moment na artykuł o Pythonie o jakim już dawno chciałem napisać. Nauczymy się wspólnie definiować własne funkcje w Pythonie. Poznamy słowo kluczowe "def" oraz jak je prawidłowo wykorzystywać w każdym kodzie źródłowym. Jak zainteresowany jeden z drugim, to zapraszam do środeczka!

FUNKCJE W PYTHONIE TEŻ MAJĄ SWOJĄ SKŁADNIĘ

Funkcja to inaczej podprogram. Używany jest w celach odseparowania jednych instrukcji od drugich, a także utorowania sobie możliwości potencjalnego powielenia egzekucji tych samych czynności więcej niż jeden raz. Nie powinien zatem dziwić fakt, iż umiejętność definiowania własnych funkcji jest ELEMENTARNA, żeby zaistnieć w branży IT i jako tako się utrzymać. Python raz kolejny rządzi się swoimi prawami i wyróżnia się nieco zmienioną składnią.

SZKIELET FUNKCJI

Na początek, wzór:

def [nazwa]([opcjonalne parametry]):
	# dowolne instrukcje

Co powinno się pierwsze rzucać w oczy? Słowo "def". Nie ma żadnego "void", "int", "float" etc. Nie ma jakiegokolwiek rozróżnienia co do funkcji zwracających wartość i niezwracających wartości. Przypomnę na szybko, że w niektórych językach programowania, funkcja niezwracająca wartości jest nazywana procedurą. Jednak wszystkie funkcje w Pythonie to są zawsze funkcje.

Po wstawieniu dowolnej nazwy (przy czym panuje konwencja nazewnicza, aby pisać z samych małych liter, a do oddzielania słów stosować znak podkreślenia), otwieramy parę nawiasów okrągłych bez względu na to, czy wstawiamy jakieś parametry, czy nie.

Następnie podajemy nazwy parametrów formalnych jakich będzie każdorazowo wymagać nasza funkcja. Zgodnie z moją opowieścią o typach danych, nie wprowadzamy żadnych ściśle określonych typów. Tylko same nazwy. Czyli możemy nazwać coś "liczbą", a w rzeczywistości to może być łańcuch znaków (jeśli zaprogramujemy to na taką okoliczność).

Znowu mamy dwukropek na samym końcu! Zaraz po nim, wyraźne wcięcie w nowej linijce kodu. To wszystko czego potrzebujecie.

ZWROT WARTOŚCI FUNKCJI

Funkcje w Pythonie mogą zwracać wartość jednak powtarzam: nie ma żadnego rozróżnienia w słowie kluczowym pomiędzy "void", a jakimkolwiek innym typem. Co jak co, aczkolwiek tutaj jeszcze pozostawiono to samo hasło z innych języków wysokiego poziomu: "return". Tak może wyglądać banalny przykład:

def square(n):
    return n**2

Przy użyciu jednego z unikatowych operatorów jakim Python może się "pochwalić", wprowadzamy sobie liczbę N i wyjmujemy jej kwadrat. Odpowiada za to instrukcja "return" obok której podajemy wartość zgodną z typem wedle naszych ustaleń. Co do zabezpieczeń przed odpowiednim typem, należy już samodzielnie zadbać o sprawdzanie typu instrukcjami warunkowymi oraz obsługę wyjątków.

WYWOŁYWANIE

Wywoływanie funkcji, to po prostu rzecz ujmując, skorzystanie z niej. Robi się to bardzo prosto. Jako instrukcję, podaje się jej bezbłędną nazwę razem z parą nawiasów okrągłych. W środku nich wprowadzamy stałe wartości albo zmienne, o ile posiada ona jakiekolwiek parametry formalne określone w swoim nagłówku. Jednak są dwa rozróżnienia:

Tak piszemy, gdy funkcja tylko robi pewne czynności i nie zwraca żadnej wartości:

square(3)

Natomiast, jeśli nasza funkcja zwraca wartość, wtedy podstawiamy ją do zmiennej, bądź do innej funkcji oczekującej wartości, gdyż ta obliczona wartość musi do kogoś lub czegoś "dojść".

x = square(3)			# przypisanie wyniku funkcji do zmiennej

do_something(square(3))		# przypisanie wyniku funkcji do innej funkcji jako parametr aktualny

WARTOŚCI DOMYŚLNE PARAMETRÓW FORMALNYCH

Warto wiedzieć przydatną rzecz. Mianowicie to, że funkcje w Pythonie mogą posiadać domyślne wartości nałożone na jakiekolwiek parametry. W praktyce, możemy podczas wywołań naszej funkcji uniknąć wprowadzania parametru co sprawi, że parametr ten "przyjmie" wartość domyślną zapisaną w definicji. Powtórnie powołajmy się na tę samą funkcję:

def square(n = 2):
    return n**2

Po dodaniu wartości zaraz po znaku przypisania, interpreter będzie wiedział jaką wartość ma tam wstawić w sytuacji, gdy jej zabraknie w momencie wywołania. W praktyce, to:

square()

zwróci wartość 4. Gdy będziemy chcieli kwadrat innej liczby, wtedy musimy ją jawnie wstawić:

square(5)

Co nie zmienia faktu, że nic się złego nie stanie, jak dorzucimy to samo:

square(2)

Wartości domyślne są bardzo przydatne, gdy jakaś wartość danej funkcji powtarza się najczęściej w całym programie, aczkolwiek potrzebuje od czasu do czasu "wymiany" parametru na jakiś inny. Coś w rodzaju "jednego przypadku na sto".

Wartość domyślna parametru funkcji w Pythonie

Wstawienie wartości domyślnych dla poszczególnych parametrów pozwala uniknąć podawania wartości podczas wywoływania funkcji. Najlepiej z tego korzystać, gdy jakaś wartość powtarza się mnóstwo razy przez większość kodu programu.

DOWOLNA KOLEJNOŚĆ WPROWADZANIA PARAMETRÓW AKTUALNYCH

Możecie sobie myśleć "co takiego???". Każdy język wysokiego poziomu wymaga wstawiania parametrów w identycznej kolejności jakie są reprezentowane w definicji funkcji. Natomiast funkcje w Pythonie pozwalają na taki manewr, że możemy bezkarnie podawać na przykład ostatni parametr w kolejności jako pierwszy. Dajmy na to, że mamy funkcję biorącą trzy parametry: "a", "b" i "c":

def expression_result(a, b, c):
    return a + b*c

Nic trudnego. Iloczyn liczb "b" i "c" razem z dodaniem składnika "a". W sytuacji do jakiej się przyzwyczailiście, trzeba by to napisać tak:

x = expression_result(30, 2, 3)

W efekcie czego, ujrzycie 36. A powiedzcie mi, co będzie wynikiem tutaj?

x = expression_result(b = 30, c = 2, a = 3)

Błąd! W innych językach tak, ale nie w Pythonie. Niespodzianka! Tutaj jest dopuszczalna możliwość "przeplatania" ze sobą parametrów zmieniając przebieg funkcji. Teraz wynikiem będzie 63. Tak, właśnie dlatego w poprzednich artykułach trzeba było w wielu sytuacjach podawać parametr "nazwany" np. "file" w funkcji "print". U góry macie uzasadnienie z czego to wynika.

Przemienność parametrów funkcji w Pythonie

W Pythonie, dopuszcza się możliwość zamiany miejscami wprowadzanych parametrów pod warunkiem, że poda się nazwę parametru jaką ma przyjąć wartość, a odbiega od podanej w nagłówku kolejności.

Co powiecie na jeszcze jedną kombinację?

x = expression_result(30, c = 2, b = 3)

Dopóki nie umieszczacie pomiędzy jakiegokolwiek parametru bez nazwy, Python pozwoli Wam przepuścić wywołanie funkcji "pół na pół". Miejcie się na baczności jak robicie powyższą kombinację! Przy próbie podstawienia wielu wartości do tego samego parametru, wyskoczy Wam wyjątek!

Wyjątek przy próbie podstawienia wielu wartości do jednego parametru funkcji w Pythonie

Przy pomieszaniu wprowadzania parametrów według kolejności razem z wprowadzaniem poza nią, można otrzymać wyjątek jeśli dowolny parametr przyjmie dwie lub więcej wartości w treści wywołania.


Funkcje w Pythonie jak wspomniałem, rządzą się swoimi prawami i pozwalają na elastyczne wykorzystywanie, które może dla innych być zbawieniem, a dla innych przekleństwem. Jest jeszcze kilka ciekawych rzeczy dotyczących funkcji jednak na razie poprzestaniemy na tym, co napisałem. Dzięki serdeczne za pełne przeczytanie!

PODOBNE ARTYKUŁY