3.3. Funcții cu și fără valoare returnată
Transmiterea parametrilor, variabile locale/globale și mecanismul de apel
La finalul lecției vei putea...
- să diferențiezi o funcție care produce o valoare de una care realizează doar un efect, precum afișarea;
- să utilizezi instrucțiunea return pentru a transmite rezultatul unei funcții;
- să folosești valoarea returnată într-o expresie sau să o memorezi într-o variabilă;
- să explici rolul parametrilor și transmiterea argumentelor la apel;
- să diferențiezi variabilele locale de variabilele globale;
- să explici de ce este preferabil ca datele necesare unei funcții să fie transmise prin parametri;
- să urmărești mecanismul de apel, executare și revenire dintr-o funcție;
- să alegi între o funcție cu valoare returnată și una care realizează un efect.
return, parametri și domeniul variabilelor
2.1. Funcție fără valoare returnată
def afiseaza_patrat(x):
print(x * x)
a = 6
afiseaza_patrat(a)Funcția produce un efect, aici afișarea unui rezultat.
2.2. Funcție cu valoare returnată
def patrat(x):
return x * x
p = patrat(6)
print(p)
print(p + 10)La apelul patrat(6), funcția calculează 36 și îl returnează. Valoarea poate fi atribuită, afișată sau folosită într-o expresie.
2.3. return oprește execuția
def semn(x):
if x > 0:
return 1
if x < 0:
return -1
return 0Când se execută un return, funcția se încheie pe acel traseu.
2.4. Variabile locale și globale
def calcul():
x = 10
print("În funcție:", x)
x = 25
calcul()
print("În programul principal:", x)Variabila creată în funcție este locală. O variabilă definită în afara funcțiilor poate fi accesată pentru citire, dar este preferabil să transmitem datele prin parametri.
mesaj = "Salut"
def afiseaza():
print(mesaj)
afiseaza()2.5. Transmiterea parametrilor
def modifica(x):
x = x + 10
print("În funcție:", x)
a = 5
modifica(a)
print("În programul principal:", a)Pentru valorile numerice folosite aici, modificarea parametrului în interiorul funcției nu schimbă automat variabila din programul principal. Pentru a transmite rezultatul folosim return.
Acțiune sau rezultat
Fără return
Ca un buton care aprinde un bec: funcția produce un efect.
Cu return
Ca un aparat de măsură: primești o valoare pe care o poți folosi mai departe.
Ce alegem?
Vrem să folosim rezultatul unei funcții într-o expresie. Ce este necesar?
Funcții care returnează valori
def afiseaza_dublu(x):
print(2 * x)
def dublu(x):
return 2 * x
a = 7
afiseaza_dublu(a)
b = dublu(a)
print("b =", b)
print("b + 1 =", b + 1)Prima funcție produce efectul de afișare. A doua produce o valoare care este preluată în b.
Valoarea returnată
Dacă f(x) returnează x*x, cât este f(4)?
Subprogram cu rezultat returnat
subprogram dublu(x) returnează
returnează 2 * x
■
citește n
r ← Apel dublu(n)
afișează rÎn pseudocod, subprogramul este declarat cu un rezultat returnat. În Python, mecanismul este exprimat prin return.
print() nu este return
print()afișează o valoare;returntransmite o valoare către locul apelului.- Dacă o funcție este folosită într-o expresie, ea trebuie să returneze o valoare potrivită.
returnîncheie executarea funcției pe acel traseu.- O variabilă locală nu trebuie confundată cu una globală cu același nume.
- Evită folosirea inutilă a variabilelor globale. Parametrii fac dependențele mai clare.
- Modificarea unui parametru numeric în funcție nu modifică automat variabila din programul principal.
- O funcție poate avea mai multe puncte de return dacă fiecare caz este clar justificat.
CMMDC ca funcție cu valoare returnată
Problemă
Se citesc două numere naturale a și b. Definiți funcția cmmdc(a, b) care returnează CMMDC-ul folosind algoritmul lui Euclid cu împărțiri repetate.
Algoritm
subprogram cmmdc(a, b) returnează
cât timp b ≠ 0 execută
r ← a % b
a ← b
b ← r
■
returnează a
■
citește a, b
g ← Apel cmmdc(a, b)
afișează gPython
def cmmdc(a, b):
while b != 0:
r = a % b
a = b
b = r
return a
a = int(input("a = "))
b = int(input("b = "))
g = cmmdc(a, b)
print("CMMDC =", g)Urmărirea variabilelor
| Pas | a | b | r |
|---|---|---|---|
| 0 | 48 | 18 | - |
| 1 | 18 | 12 | 12 |
| 2 | 12 | 6 | 6 |
| 3 | 6 | 0 | 0 |
Testare
Pentru 48 și 18, resturile sunt 12, 6, 0, iar rezultatul este 6. Testăm și valori egale și situații precum un număr egal cu 1.
Verificare
Algoritmul lui Euclid păstrează CMMDC-ul prin înlocuirea perechii cu (b, a % b). Când b devine 0, a este CMMDC-ul.
Transformăm efectele în rezultate
- Transformă funcția afiseaza_patrat(x) într-o funcție patrat(x) care returnează rezultatul.
- Definește o funcție maxim(a, b) care returnează maximul celor două numere.
- Definește o funcție este_par(n) care returnează True dacă n este par și False în caz contrar.
- Definește o funcție suma_cifre(n) care returnează suma cifrelor lui n.
- Definește o funcție numar_divizori(n) care returnează numărul divizorilor pozitivi ai lui n.
- Scrie un program care apelează o funcție de două ori și adună cele două rezultate returnate.
- Demonstrează printr-un exemplu diferența dintre print() și return.
Reutilizare, domenii și rezultate
- Definește o funcție care returnează numărul de factori primi distincți ai unui număr.
- Definește o funcție care returnează cifra maximă a unui număr natural.
- Definește o funcție care returnează valoarea obținută prin inversarea cifrelor unui număr.
- Definește o funcție care returnează conversia unui număr din baza 10 în baza 2 ca șir de caractere, fără bin().
- Construiește o funcție care returnează CMMMC(a,b), folosind CMMDC(a,b). Explică de ce este utilă reutilizarea funcției.
- Construiește un exemplu în care o variabilă locală are același nume ca una globală și explică ce valoare este folosită în fiecare context.
- Analizează un program care modifică o variabilă globală din mai multe funcții. Rescrie-l folosind parametri și return.
Verifică-ți înțelegerea
Mini-quiz
1. Ce transmite return?
2. Ce se întâmplă după return?
3. Variabila creată în corpul funcției este, în mod obișnuit...
4. Ce este de preferat pentru datele necesare funcției?
5. Ce rămâne în a după modifica(a), dacă a=5 și funcția face x=x+10?
Biblioteca de funcții numerice
Biblioteca de funcții numerice
Realizează un modul de funcții pentru probleme cu numere: suma cifrelor, numărul de divizori, testul de primalitate, CMMDC și CMMC. Funcțiile care calculează valori trebuie să le returneze.
- nu folosi variabile globale pentru datele principale;
- transmite prin parametri valorile necesare;
- folosește return pentru rezultate;
- testează fiecare funcție separat cu cel puțin trei cazuri;
- include cel puțin un caz-limită și explică rezultatul.