Funkcje

Funkcje są podstawową konstrukcją w programowaniu. Dzięki nim możemy używać fragmentów kodu wielokrotnie w programie. O użyteczności funkcji dowiedziałeś się już korzystając ze sprawdzenia długości listy czy też napisu - pomyśl o ile mniej wygodnie byłoby za każdym razem robić pętle "for" i za każdym jej przejściem do zmiennej dodawać 1.

Na potrzeby tego rozdziału załóżmy sobie, że będziemy często potrzebować policzyć wartość tej funkcji:

\(f(x) = \frac{2*x^3}{8.51}\)

W Pythonie przedstawia się to tak:

x = 15
wynik = (2 * (x**3))/8.51
print wynik

Ale kopiowanie tego i zmienianie zmiennej jest bardzo niewygodne. Możemy zdefiniować sobie funkcję, która jako argument przyjmie x i zwróci nam wartość policzonego wyrażenia:

def f(x):
    return (2 * (x**3))/8.51
 
print f(5)

aby zdefiniować funkcję używamy słowa def, po którym następuje nazwa funkcji. W nawiasach podajemy nazwy kolejnych argumentów (w szczególności, możemy nie podawać ich wcale jeśli nie chcemy). Ciało funkcji oznaczamy tak samo jak w przypadku pętli for lub instrukcji warunkowych, czyli wcięciem w kodzie.

Możemy (ale nie musimy) zwrócić jakąś wartość poprzez użycie return, dzięki czemu możemy zapisać wynik naszego działania do jakiejś zmiennej tak samo jak w przypadku kiedy sprawdzaliśmy długość listy funkcją len. Co bardzo ważne, jeśli dojdziemy do instrukcji "return" funkcja się kończy (nawet jeśli coś "za" słówkiem "return" było)! Możemy też nic nie zwracać, co spowoduje, że nasza funkcja wydawać się może mało użyteczna, ale stosuje się to często w przypadku funkcji działających przez efekty uboczne, które np. wypisują jakieś złożone dane na ekran, albo zmieniają jakiś obiekt (tak jest np. z metodami usuwającymi elementy z listy).

Co bardzo ważne, instrukcje wewnątrz ciała funkcji nie wykonają się jeśli nie wywołamy tej funcji. Zobacz jak zadziała ten kod:

def funkcja():
    print "wykonalo sie"

jak widzisz, nic kompletnie się nie stało. Dopiero gdy napiszesz "funkcja()" zostanie wyświetlony napis "wykonalo sie".

Wróćmy jednak do naszej funkcji obliczającej wyrażenie arytmetyczne. Załóżmy, że chcieli byśmy założyć, że często nie wiemy w jakim miejscu chcemy policzyć wartość funcji, więc chcieli byśmy ją liczyć dla powiedzmy zera, ot tak żeby tylko ją policzyć :)

W Pythonie jest to bardzo proste, wystaczy po nazwie argumentu napisać znak równości a po nim wartość, która ma być domyślnie używana.

def f(x=0):
    return (2 * (x**3))/8.51
 
print f()
print f(5)