Functiile sunt secvente de cod care sunt definite pentru a fi apoi apelate in diverse sectiuni ale programelor. Acestea asigura o structurare mult mai buna a aplicatiilor. In general, o functie primeste un set de argumente, efectueaza un numar de operatii si returneaza o valoare.
In limbajul Python, functiile trebuie definite inainte de utilizare/apelare, in caz contrar fiind generate erori de tipul NameError.
>>> hello() Traceback (most recent call last): File "", line 1, in NameError: name 'hello' is not defined
Pot fi utilizate atat functii predefinite, disponibile la nivelul limbajului Python (print(), type(), id()), cat si functii definite de utilizator.
def functie(parametri): """docstring""" instructiuni
Prima instructiune din corpul unei functii poate fi un sir de caractere care reprezinta documentatia functiei. In Python, toate functiile returneaza o valoare, chiar daca nu fac acest lucru in mod explicit (None). Returnarea unei valori intr-o maniera explicita presupune utilizatarea instructiunii de salt return.
>>> def par(numar): ... """Functia verifica daca numarul este par.""" ... return numar % 2 == 0 ... >>> for n in [23, 5, 44, 87]: ... if par(n): ... print('numarul %d este par' % n) ... numarul 44 este par
>>> par <function par at 0x0097C6F0>
>>> par.__doc__ 'Functia verifica daca numarul este par.'
La nivelul functiilor pot aparea si parametri cu valori predefinite; un astfel de parametru primeste valoarea predefinita in cazul in care nu se precizeaza un argument la apelul functiei. In exemplul urmator, parametrul nume ia valoarea Ghita, daca nu se transmite o valoare pentru acesta la apelul functiei.
>>> def hello(nume = 'Ghita'): ... print('Buna %s!' % nume) ... >>> hello <function hello at 0x02DF3540>
>>> hello() Buna Ghita! >>> hello('Maria') Buna Maria!
La apelul unei functii, in afara argumentelor pozitionale (disponibile la nivelul exemplelor precedente) pot fi utilizate si argumente cu nume.
>>> def hello(nume, prenume): ... print('Buna %s %s!' % (prenume, nume)) ... >>> hello(prenume = 'Marian', nume = 'Popescu') Buna Marian Popescu! >>> hello(nume = 'Popescu', prenume = 'Marian') Buna Marian Popescu! >>> hello('Popescu', 'Marian') Buna Marian Popescu!
Daca nu se cunoate numarul de argumente ce urmeaza a fi transmise la apelul unei functii, este necesara precizarea caracterului * inaintea parametrului care preia aceste argumente.
>>> def hello(*nume): ... for n in nume: ... print('Buna {}!'.format(n)) ... >>> hello('Maria', 'Zaya', 'Sofia') Buna Maria! Buna Zaya! Buna Sofia!
Daca o functie are un parametru de tipul **param, atunci la apelul functiei vor fi transmise perechi cheie-valoare. Este recomandata utilizarea unui astfel de parametru in cazul in care se utilizeaza argumente cu nume.
>>> def date_personale(**kwargs): ... for key, value in kwargs.items(): ... print('{} = {}'.format(key, value)) ... >>> date_personale(nume = 'Popescu', prenume = 'Sofia', matricol = 'LK7437') nume = Popescu prenume = Sofia matricol = LK7437