Wprowadzenie do funkcji w Pythonie
Funkcja, czasami nazywana podprogramem, a rzadziej procedurą, to wydzielona część programu przetwarzająca parametry lub argumenty i ewentualnie zwracająca wartość lub wiele wartości, które następnie mogą być wykorzystane jako argument w innych działaniach lub funkcjach.
Czasami o funkcjach mówi się jak o czarnych skrzynkach. Nie zawsze wiesz, co ona zawiera, ale masz klucz, możesz ją otworzyć i do niej zajrzeć. Możesz zawsze użyć skrzynki do pewnych zadań, które potrafi wykonać dzięki swojej zawartości. Ty wcale nie musisz do końca wiedzieć, jak ona to dokładnie robi. Wystarczy, że doskonale wiesz, co owa skrzynka na końcu dla ciebie zrobi, i jak sprawić, aby to zrobiła. Natomiast szczegóły działania pozostawiasz jej, czyli funkcji - czarnej skrzynce.
W dużych firmach programiści często zajmują się tylko fragmentem całości - przykładowo pojedynczą funkcją. Możesz otrzymać następujące zlecenie: stwórz funkcję, która przyjmuje trzy parametry: pozostałą do spłacenia kwotę kredytu, pozostałe do spłacenia odsetki oraz pozostały czas trwania kredytu. Na podstawie tych danych oblicz i zwróć kwotę następnej raty. Tego typu opis, który mówi, czego potrzebujemy na wejściu i wyjściu do naszej czarnej skrzynki, z pewnością będzie przydatny również w przypadku pracy na innym stanowisku, a nawet gdy zlecamy takie zadanie innym programistom lub zewnętrznej firmie.
Funkcje w programach mają bardzo różne zadania do wykonania, trochę jak w zespole pracowników różne osoby mają różne zadania, jednak wymieniają się pomiędzy sobą informacjami i w ten sposób wykonują swoją pracę. Dzięki współpracy powstają na przykład telewizory czy samochody, piosenki lub teledyski, reklamy czy artykuły prasowe, a także również programy. W przypadku tworzenia tych ostatnich bardzo ważne jest, aby programiści tworzyli funkcje, które mogą współpracować w jak najlepszy sposób.
Wyobraź sobie program do obsługi dziennika elektronicznego. Nawet nie musisz starać się oszacować ilości funkcji użytych w całym programie - na pewno są ich dziesiątki, jeśli nie setki. Funkcja jest odpowiedzialna za swój mały wycinek pracy, który jest elementem większej całości. Wyobraź sobie wpisywanie do dziennika ocen uczniów. W programie, aby wpisać ocenę, należy wpisać słowo z klawiatury, na przykład czwórka. Nagle, po kilku latach działania programu, ktoś wpada na genialny pomysł, aby słowa zastąpić cyframi. Samo to nie jest jeszcze problematyczne. Jednak po pewnym czasie okazuje się, że użytkownikom zdarza się wpisać ocenę siedem lub inną, która według skali ocen nie istnieje. Zatem programiści otrzymują zadanie - należy tak zmienić program, aby nie było możliwości wpisania cyfr innych niż od jednego do sześciu.
Aby to zrobić, trzeba sprawdzić w każdym miejscu programu, czy nie ma kawałka kodu odpowiadającego za wpisywanie danych z klawiatury przez użytkownika. Wyobraź sobie, że trzeba przeanalizować na przykład dziesięć tysięcy linii kodu. W tym fragmencie może być ukrytych kilkanaście miejsc, gdzie trzeba zmienić kilkanaście linii. W sumie - powiedzmy - zmiana pięciuset linii kodu wśród dziesięciu tysięcy. To żmudna praca, a do tego obarczona dużym prawdopodobieństwem błędu - w końcu programista może się pomylić i na przykład w szóstym wystąpieniu danego kawałka kodu programu wstawi znak plus zamiast minus lub odwrotnie.
A gdyby wpisywanie danych od użytkownika było funkcją, która jest wywoływana w wielu różnych miejscach, ale jest to TYLKO jedna funkcja? Wówczas wystarczyłoby dbać o JEDNO wystąpienie kodu odpowiedzialnego za pobieranie ocen od użytkownika. A każde zmiany, jakie programiści wprowadzą w JEDNEJ funkcji, od razu są widoczne w wielu miejscach dużego programu.
W ten sposób działają funkcje i taka idea przyświeca od zawsze tworzeniu programów. Duże problemy są dzielone na mniejsze, które to realizowane są poprzez małe funkcje. A wyniki działania wielu małych funkcji składają się na dobrze działający duży program.
Jako ciekawostkę możemy dodać, że w Pythonie – w przeciwieństwie do niektórych języków programowania - funkcja może być argumentem funkcji, może również być wynikiem, czyli wartością zwracaną funkcji lub można ją przypisać do zmiennych.