You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
instrucţiunea global.<br />
Parametrii actuali ai unei funcţii apelate sunt introduşi în tabela de simboluri locală a acelei funcţii în momentul<br />
apelării ei. Astfel transferul argumentelor se face utilizând apelul prin valoare (unde valoare este totdeauna un<br />
obiect referinţă, nu valoarea obiectului). 1<br />
Când o funcţie apelează o alta funcţie, este creată o nouă tabelă de simboluri pentru funcţia apelată.<br />
Definirea unei funcţii trece numele funcţiei în tabela de simboluri curentă.<br />
Funcţia nou creată este recunoscută de interpretor ca o funcţie definită de utilizator. În <strong>Python</strong> există un mecanism<br />
de redenumire a funcţiilor:<br />
>>> fib<br />
<br />
>>> f = fib<br />
>>> f(100)<br />
1 1 2 3 5 8 13 21 34 55 89<br />
Aţi putea obiecta că funcţia fib este o procedură nu o funcţie. În <strong>Python</strong>, la fel ca în C, procedurile sunt<br />
funcţii, numai că nu returnează nici o valoare. Tehnic vorbind, procedurile returnează totuşi o valoare, aceasta<br />
este None(niciuna). None este un cuvânt cheie (predefinit). În mod normal valoarea None nu este afişată de<br />
interpretor. Totuşi dacă doriţi să vă convingeţi că aşa funcţionează procedurile încercaţi următorul exemplu:<br />
>>> print fib(0)<br />
None<br />
Este foarte simplu să construim o funcţie care întoarce ca rezultat şirul lui Fibonacci:<br />
>>> def fib2(n): # Intoarce sirul lui Fibonacci pana la n<br />
... "Intoarce o lista continand sirul lui Fibonacci pana la n"<br />
... result = []<br />
... a, b = 0, 1<br />
... while b< n:<br />
... result.append(b) # vezi mai jos<br />
... a, b = b, a+b<br />
... return result<br />
...<br />
>>> f100 = fib2(100) # apelarea functiei<br />
>>> f100 # afisarea rezultatului<br />
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]<br />
Acest exemplu demonstrează mai multe facilităţi ale limbajului <strong>Python</strong>:<br />
• Instrucţiunea return întoarce rezultatul funcţiei. return fără nici un parametru întoarce ca rezultat al<br />
funcţiei valoarea None. Puteţi folosi return fără parametrii pentru a încheia execuţia unei funcţii înainte<br />
de a se ajunge la finalul instrucţiunilor din cadrul funcţiei. Valoarea None este de asemenea întoarsă ca<br />
rezultat al unei funcţii atunci când au fost executate toate instrucţiunile procedurii.<br />
• Instrucţiunea result.append(b) apelează o metodă a obiectului result. O metodă este o funcţie<br />
care ‘aparţine’ unui obiect. Metodele sunt apelate folosind sintaxa obj.metodă(unde obj este un obiect,<br />
poate fi şi o expresie, iar metodă este numele metodei ce este apelată). În funcţie de tipul lor, obiectele<br />
pot avea diferite metode. Este posibil să existe metode de tipuri diferite fără a se crea confuzii. Este de<br />
asemenea posibil să creaţi obiecte şi metode folosind clasele, dar despre clase vom discuta mai târziu.<br />
Metoda append este definită pentru obiecte de tip listă, şi adaugă un element la sfârşitul listei. În acest<br />
exemplu ar fi echivalentă cu ‘result = result + [b]’ dar mult mai eficientă.<br />
1 De fapt apelul prin referinţă poate fi mai bine înţeles daca este transmis un obiect modificabil şi apelantul va vedea dacă în urma apelarii<br />
obiectul s-a modificat ( ex.: un element inserat într-o listă).<br />
22 Capitolul 4. Structuri de control