2024-08-06

Myśląc o Pythonie: Funkcje

Functions are like the verbs of programming

Zdanie powyżej usłyszałem, gdy uczyłem się o funkcjach w PHP. Funkcje (nie tylko one) w każdym języku programowania są oczywiście podobną konstrukcją. Funkcje w Pythonie są po prostu, jak wiele innych rzeczy, minimalistyczne. Czym są zatem funkcje?

Funkcja jest nazwanym blokiem kodu, który możemy ponownie wykorzystać. Takie wykorzystanie może być dowolne, możemy funkcji użyć w dowolnym miejscu kodu w dowolny sposób. Jest to kolejne "ucieleśnienie" zasady DRY. Blok takiego kodu może zawierać oczywiście dowolne instrukcje, czy deklaracje, które często się powtarzają.

W przeszłości używaliśmy już funkcji, były to wbudowane w Pythona funkcje, będące częścią tzw. biblioteki standardowej. Wbudowane funkcje są zadeklarowane już w plikach Pythona i interpreter niejako je "zna". Jeśli chodzi o Nasze własne funkcje, będziemy musieli je dopiero zdefiniować.

Definiowanie funkcji, to nic innego jak właśnie "nadawanie nazwy" pewnej części kodu, tak by można ją było wielokrotnie powtarzać, a nie w kółko pisać od nowa. W definicji takiej funkcji ważne jest by był to blok kodu oznaczony wspomnianą nazwą i specjalnym słówkiem kluczowym. W przypadku Pythona, słówkiem takim jest def. Jak można się domyślić jest to skrót od define.

Przykładem wbudowanej funkcji, której już używaliśmy jest funkcja print(). Służy ona do wyświetlania czegoś w konsoli tekstowej, natomiast nie musieliśmy jej definiować. Wystarczyło, że znaliśmy jej nazwę, i przy okazji to co powinno znaleźć się w nawiasach, po jej nazwie. Python ma dość rozbudowany zestaw funkcji wbudowanych, ale możemy go rozszerzyć o własne.

Zanim wgryziemy się w praktykę, należałoby jeszcze wspomnieć o rozróżnieniu dwóch pojęć; funkcji oraz metod. Funkcja to niejako samodzielna jednostka, ją wywołujemy z argumentami lub bez argumentów. Natomiast metoda, to taka specyficzna funkcja będąca elementem jakiejś klasy. Metodę zawsze wywołamy na jakimś obiekcie, którego jest integralną częścią, przykładem metody może być keys() wywoływane na rzecz jakiegoś słownika.

Funkcje w Pythonie z bliska

Jak już wspomniałem, by zdefiniować własną funkcję musimy użyć, przede wszystkim, słówka def, razem z tym słówkiem używamy wybranej nazwy metody (oczywiście bez spacji), a następnie umieszczamy parametry, w nawiasach po nazwie. Tutaj też należy wspomnieć o pewnym subtelnym rozróżnieniu, bowiem w nawiasie po nazwie funkcji, przy deklaracji, umieszczamy parametry, natomiast te same elementy przy wywołaniu funkcji już nazywamy argumentami. Jest to często popełniany błąd, którego już od dziś nie musimy robić.

No dobrze, wracając do deklaracji funkcji. Zadeklarujmy sobie funkcję o nazwie fn, natomiast nie wspomniałem, ale parametry nie są obowiązkowe, dlatego ich nie podamy. Funkcja będzie wyświetlać po prostu jakiś tekst.

Funkcje w Pythonie definicja funkcji

Jak widzimy po uruchomieniu powyższego kodu nic się nie wyświetla. Czy domyślasz się dlaczego?

Wróćmy myślami do funkcji print, by jej użyć podawaliśmy jej nazwę, a później argumenty w nawiasie. Otóż właśnie w tym leży Nasz problem. My definiujemy funkcję i wszystko pięknie, natomiast nigdzie jej nie wywołujemy, czyli po prostu nie używamy funkcji. Nie mówimy, żeby wzięła się do roboty, mówimy interpreterowi tylko, że taka funkcja od teraz istnieje i co robi. Zatem by ją wywołać po prostu używamy jej nazwy razem z nawiasami.

I po takim zabiegu mamy efekt wykonania Naszej funkcji na ekranie. Widzimy słowo "Siema" czyli dokładnie efekt wykonania tych instrukcji, które umieściliśmy w ciele funkji. Tak bowiem nazywamy to co wewnątrz funkcji, jest to jej ciało, natomiast ciąg znaków przed dwukropkiem nazywamy nagłówkiem funkcji.

Funkcje w Pythonie: parametry

Funkcja, którą stworzyliśmy poprzednio była bardzo podstawowa, przez to też mało przydatna, wrzechstronna i elastyczna. Mogła robić tylko to co umieszczono w jej ciele z danymi jakie tam umieściliśmy. Jednak jak wspomniałem wcześniej funkcje mogą przyjmować pewne parametry.

Parametry to wartości, na których funkcja będzie pracowała, a które umieszczamy w nawiasach po nazwie funkcji. Bowiem zazwyczaj funkcje tworzymy po to by przetworzyły one jakąś wartość na wejściu i zwróciły pewien rezultat. Parametry pozwolą podać do funkcji dane, które mogą się zmieniać za każdym jej wywołaniem.

Mając do dyspozycji funkcje z parametrami, może ona wykonywać cały czas określone czynności, robić to samo, ale za każdym razem na innych danych. Przykładowo funkcja logująca użytkownika może za każdym razem logować innego użytkownika, bo inne dane użytkownika otrzyma w każdym przypadku.

Zobaczmy sobie na przykładzie, jak Nasza funkcja może przyjmować różne wartości, właśnie dzięki użyciu parametrów.

Funkcje w Pythonie, parametry

Mamy zatem, jak możesz zauważyć, funkcje, która przyjmuje parametry. Wywołujemy też dwa razy naszą funkcję, podając za każdym razem inne wartości jako argumenty. I za każdym razem funkcja dodaje podane przy wywołaniu argumenty. Funkcja wie też który argument jest którym, bo są to argumenty pozycyjne. Znaczy to, że jeśli w deklaracja parametr a był jako pierwszy, to w wywołaniu to co podano jako pierwsze, będzie wartością właśnie argumentu a, nie innego. Analogiczna sytuacja ma miejsce z nastepnymi w kolejności.

Keyword arguments - argumenty nazwane

Argumenty pozycyjne, podane powyżej nie są jedynym rodzajem argumentów. Możemy zadeklarować funkcję z nazwanymi parametrami, tzw. keyword arguments, czyli po prostu każdy z parametrów będzie miał swoją nazwę. Z tego wynika, że nie będziemy musieli przejmować się ich kolejnością, bowiem przypiszemy im wartości tak jakbyśmy to robili ze zmiennymi. Wtedy też musimy określić wartość domyślną takowego. Zobaczmy przykład.

Funkcje w Pythonie, argumenty nazwane.

Tym razem w nagłówku funkcji wymieniliśmy parametry, ale też przypisaliśmy im od razu wartości. Są to tzw. wartości domyślne, jeśli pominiemy taką wartość przy podawaniu argumentu podczas wywołania funkcji, to taki argument przyjmnie wartość domyślną. Nastepnie w funkcji wyświetlamy nazwę argumentu i jego wartość, by lepiej zobaczyć co się dzieje.

Widzimy teraz, że nie musimy przejmować się kolejnością podawania kolejnych argumentów, bowiem i tak podajemy nazwę argumentu jakiemu przypisujemy daną wartość. I bez zaskoczenia, możemy się przekonać, że gdy wskażemy, że wartość 1 ma argument b, a 2 argument a, to właśnie takie wartości będą miały wymienione argumenty w funkcji.

Funkcje w Pythonie, pominięcie arguementu z wartością domyślną

Jak widzimy powyżej, możemy pominąć argument, który ma określoną wartość domyślną, bo... ma on wartość domyślną 😉 Zostanie zatem ona użyta, bo innej nie podano. Jeśli pominiemy argument pozycyjny, dostaniemy po łapkach.

Za tydzień porozmawiamy sobie jeszcze więcej o temacie funkcje w Pythonie, do przeczytania!

5 comments on “Myśląc o Pythonie: Funkcje”

Dodaj komentarz

linkedin facebook pinterest youtube rss twitter instagram facebook-blank rss-blank linkedin-blank pinterest youtube twitter instagram