Funkcje¶
W języku Python funkcją nazywamy sekwencję poleceń, należącą do jednego bloku. Podstawowym celem tworzenia funkcji jest organizacja programu w kawałki, które odpowiadają naszemu wyobrażeniu o tym, jak widzimy rozwiązanie danego problemu.
Funkcję w język Python definiujemy następująco:
def name( parametry ):
wyrazenia
Funkcje możemy nazywać jak tylko chcemy, za wyjątkiem słów kluczowych języka Python. Nazwy funkcji muszą też spełniać reguły poprawnych identyfikatorów, które były podane wcześniej. Parametry specyfikują, jakie informacje (jeżeli w ogóle jakiekolwiek) musimy podać, aby móc używać nowo zdefiniowaną funkcję. Innymi słowy parametry specyfikują, czego potrzebują funkcje, aby poprawnie pracować.
W ciele funkcji możemy zawrzeć dowolną ilość wyrażeń, pod warunkiem, że znajdą się one po wcięciu w stosunku do definicji (def). W przykładach, jakie znajdziecie w tej książce będziemy używać standardowej długościa wcięcia, wynoszącą 4 spacje. Definicja funkcji to drugie z wielu wyrażeń złożonych o których będziemy mówić. Każde z tych wyrażeń zbudowane jest podobnie:
- Linię nagłówkową, zaczynającą się od słowa kluczowego i kończącą się dwukropkiem.
- Ciało zawierające jedno lub więcej wyrażeń języka Python, każde wcięte o tyle samo w stosunku do linii nagłówkowej. Standardem dla języka Python są wcięcia o długości 4 spacji.
Widzieliśmy już pętlę for, która spełnia powyższy wzorzec.
Jeżeli chodzi o definicję funkcji, słowem kluczowym będzie def, po którym następuje nazwa funkcji oraz następnie szereg parametrów, które z kolei zawarte są w nawiasach. Lista parametrów może być pusta, może też zawierać dowolną ilość parametrów oddzielonych od siebie przecinkami. W każdym jednak przypadku nawiasy okrągłe są obowiązkową częścią definicji funkcji.
Na chwilę zatrzymamy się przy parametrach. Podczas definiowania funkcji owa lista parametrów, zwana jest parametrami formalnymi. Lista ta składa się z tych nazw, które użytkownik funkcji musi podać, aby móc używać funkcji. Używając (wywołując) funkcji musisz podać wartości, odpowiadające danym parametrom formalnym.
Poniższy rysunek przedstawia schematycznie tę relację. Funkcja potrzebuje konkretnych informacji, aby móc wykonać co do niej należy. Wartości te, zwyczajowo nazywane argumentami lub też parametrami rzeczywistymi przekazywane są do funkcji programista.
Schemat tego typu nazywamy diagramem komunikacji lub diagramem komponentów, gdzie zawartość komponentu ma charakter czarnej skrzynki, ponieważ zazwyczaj specyfikuje jedynie wymagania z perspektywy użytkownika. Użytkownik musi znać nazwę funkcji oraz wiedzieć, jakie argumenty musi do niej podać. Szczegóły działania funkcji ukryte są w owej „czarnej skrzynce”.
Załóżmy, że pracując z żółwiami częstą operacją jest rysowanie kwadratów. Byłoby całkiem logiczne, jeżeli nie musielibyśmy duplikować wszystkich kroków potrzebnych do narysowania kwadratu. Możemy sobie wyobrazić, że owo „narysuj kwadrat” to pewien rodzaj abstrakcji, opisującej pewną ilość mniejszych kroków. Aby funkcja zadziałała będziemy musieli dostarczyć dwóch informacji: owego żółwia, aby narysował kwadrat oraz długość boku kwadratu. Poniżej znajdziecie diagram, reprezentujący właśnie tą ideę.
A poniżej jest program, który ją realizuje. Wypróbujcie go.
Powyższa funkcja nazywa się draw_square. Ma ona dwa parametry — pierwszy powie funkcji, którego żółwia zatrudnić oraz drugi, określający długość boku kwadratu, który chemy narysować. W definicji funkcji mają one nazwy odpowiednio t oraz sz. Upewnij się, że wiesz, gdzie kończy się ciało funkcji — zależy to tylko od wcięć i puste linie pod nim nie mają znaczenia.
docstring (dokumentacja)
Pierwszą rzeczą występującą pod definicją funkcji jest ciąg znaków (niektóre programy narzędziowe wymagają, by ów ciąg zawierał się pomiędzy potrójnymi cudzysłowami). Ciąg ten nazywamy docstringiem i jest on traktowany przez język Python i niektóre programy narzędziowe w szczególny sposób.
Innym sposobem, aby dobrać się do tych informacji jest użycie interaktywnej powłoki, gdzie trzeba wprowadzić wyrażenie <nazwa_funkcji>.__doc__, która zwróci docstring dla danej funkcji. Zatem, do ciągu znaków, który konstruujemy na początku ciała funkcji możemy odwołać się za pomocą narzędzi języka Python w czasie wykonywania programu. Jest to kompletnie inne zachowanie od komentarzy, które umieszczacie w kodzie, a które są usuwane, gdy program jest parsowany przez interpreter.
Konwencją przyjętą przez programistów języka Python jest używanie docstringów jako podstawowej dokumentacji konstruowanych funkcji.
Zdefiniowanie nowej funkcji nie spowoduje, że będzie ona automatycznie działać. Aby to osiągnąć musimy wywołać funkcję. Już wiemy jak wywoływać niektóre funkcje wbudowane w system np: print, range czy int. Wywołania funkcji zawierają nazwę funkcji, którą chcemy uruchomić, po której to następuje lista wartości, zwana argumentami. Elementy tej listy zostaną przypisane do parametrów, znajdujących się w definicji funkcji. W drugiej od końca linijce powyższego programu wywołujemy właśnie naszą funkcję i przekazujemy do niej zmienną alex, będącego żółwiem, którym funkcja ta może manipulować oraz liczbę 50, będącą długością boku kwadratu.
Jak już raz zdefiniowaliśmy jakąś funkcję, możemy ją wołać tak często jak tylko nam się podoba, a wyrażenia zawarte w ciele funkcji będą wykonywane za każdym wywołaniem. W takim razie możemy dzięki funkcji zmusić żółwia to narysowania kwadratu, następnie przesunąć żółwia i znów użyć funkcji do narysowania kolejnego kwadratu w innym miejscu. Zauważcie proszę, że przesuwając żółwia podniesiemy jego ogon, tak, by nie zostawił śladu przemieszczenia. Przed narysowaniem drugiego kwadratu opuścimy ogon z powrotem. Upewnij się, że widzisz oba miejsca, gdzie wywołujemy funkcję draw_square.
W kolejnym przykładzie zmieniliśmy lekko funkcję draw_square oraz wykorzystamy tess, by narysowała 15 kwadratów, każdy nieco inny. Jako, że raz zdefiniowaną funkcję możemy wykorzystywać tak często jak tylko chcemy, będziemy ją wołać z takimi argumentami, jak nam się zapragnie.
Informacja
Ten obszar roboczy jest tutaj dla Twojej wygody. Możesz tu wypróbować dowolny program.
Sprawdź swoją wiedzę
func-1-4: Jaka jest nazwa poniższej funkcji?
def draw_square(t, sz):
"""Uzywa zolwia t by narysowal kwadrat o boku sz."""
for i in range(4):
t.forward(sz)
t.left(90)
func-1-5: Jakie są parametry formalne poniższej funkcji?
def draw_square(t, sz):
"""Uzywa zolwia t by narysowal kwadrat o boku sz."""
for i in range(4):
t.forward(sz)
t.left(90)
func-1-6: Rozważmy poniższa funkcję. Która z podanych wyrażeń poprawnie wywołuje tę funkcję (powoduje, że funkcja zadziała)? Zakładamy, że istnieje już żółw o imieniu alex.
def draw_square(t, sz):
"""Uzywa zolwia t by narysowal kwadrat o boku sz."""
for i in range(4):
t.forward(sz)
t.left(90)