3.3. Funkcije

Mogućnost definiranja novih funkcija je osnovna stepenica k naprednijem programiranju. U Pythonu funkcije se definiraju korištenjem ključnih riječi def i return, te blokova kôda koji su konzistentno uvučeni

>>> def h(x):
...     "Kvadriraj broj x."
...     return x**2

>>> print(h(3))
9

Kao prvi red tijela funkcije može se, kao gore, staviti dokumentacijski string (tzv. docstring ) kojem se kasnije može pristupiti standardnim metodama pristupa dokumentaciji. (Dakle, h? će ispisati dokumentacijski string.)

Funkcija može imati i opcionalne argumente s defaultnom vrijednošću:

>>> def fun(x, n=1, b=0):
...     return x**n + b

>>> fun(3, 4, 5)
86
>>> fun(3, b=5, n=4)
86
>>> fun(3)
3

Uočite da zahvaljujući eksplicitnom imenovanju opcionalnih argumenata ne moramo paziti na njihov poredak.

Bilo što može biti argument funkcije. Najmoćnija stvar, obilato korištena u funkcionalnom pristupu programiranju, je da i same funkcije mogu biti argumenti funkcija:

>>> def twice(f, x):
...     "Komponiraj dvaput funkciju sa samom sobom"
...     return f(f(x))

>>> from scipy import *
>>> print(twice(sqrt, 16))
2.0

Zadatak 1

Isprogramirajte funkciju fib(n) koja računa n-ti član Fibonaccijevog niza (niz kod kojeg je svaki član definiran kao zbroj prethodna dva, a javlja se pri analizi idealizirane populacije zečeva). fib(4) = 3.

Zadatak 2

Isprogramirajte funkciju fibBinet(n) koja računa n-ti član Fibonaccijevog niza putem Binetove formule

\[F_n = \frac{\varphi^n - \cos(n\pi)\varphi^{-n}}{\sqrt{5}}\]

gdje je \(\varphi = 1.618\ldots\) tzv. zlatni omjer

>>> from scipy.constants import golden_ratio
>>> golden_ratio
1.618033988749895

Uvjerite se da dobivate dobre vrijednosti za neke n.