3.2. Subprograme definite de utilizator
def, parametri, apel, corpul funcției și mecanismul de executare
La finalul lecției vei putea...
- să explici rolul subprogramelor definite de utilizator;
- să identifici antetul, parametrii și corpul unei funcții Python;
- să definești o funcție folosind instrucțiunea def;
- să apelezi o funcție cu argumente potrivite;
- să explici diferența dintre parametrul formal și argumentul efectiv;
- să urmărești mecanismul de executare al unei funcții;
- să folosești funcții pentru a evita repetarea acelorași instrucțiuni;
- să proiectezi funcții simple pentru operații matematice și prelucrări algoritmice deja cunoscute.
Definirea și apelul funcțiilor
Pe măsură ce programele cresc, aceeași prelucrare poate apărea în mai multe locuri. Un subprogram definit de utilizator grupează instrucțiuni care realizează o operație clară și poate fi apelat ori de câte ori este necesar.
2.1. Definirea unei funcții
def mesaj():
print("Bun venit!")
mesaj()
mesaj()Cuvântul-cheie def începe definiția. După numele funcției urmează parantezele și două puncte. Instrucțiunile indentate formează corpul funcției. Definirea nu execută corpul.
2.2. Parametri și argumente
def patrat(x):
print(x * x)
patrat(5)
patrat(12)În definiție, x este parametru formal. La apel, 5 și 12 sunt argumente efective.
2.3. Mecanismul de executare
- Programul ajunge la definiția funcției; corpul nu este executat atunci.
- Programul întâlnește un apel.
- Argumentele sunt transmise parametrilor.
- Se execută corpul funcției.
- După terminarea corpului, execuția revine după apel.
- La un nou apel, procesul se repetă cu noile argumente.
2.4. Mai mulți parametri
def suma(a, b):
print(a + b)
suma(7, 4)
suma(20, 5)Numărul și poziția argumentelor trebuie să corespundă parametrilor necesari.
Funcția ca operație reutilizabilă
Rețeta
Aceeași rețetă poate fi folosită de mai multe ori, schimbând cantitățile.
Funcția
Definim o operație o singură dată și o solicităm prin apel, cu datele necesare.
Ce se execută?
Ce se întâmplă la patrat(5) dacă def patrat(x) este deja definită?
Funcții definite de utilizator
def suma(a, b):
print("Suma =", a + b)
def diferenta(a, b):
print("Diferența =", a - b)
x = int(input("x = "))
y = int(input("y = "))
suma(x, y)
diferenta(x, yFuncțiile sunt definite înainte de apel. Variabilele x și y sunt argumente efective, iar a și b sunt parametri formali.
Parametru sau argument?
În def f(x): ..., ce este x?
Definim separat subprogramul și apelul
subprogram suma(a, b)
s ← a + b
afișează s
■
citește x, y
Apel suma(x, y)Pseudocodul separă definiția subprogramului de apelul său. În Python, forma corespunzătoare folosește def și indentarea corpului.
Greșeli frecvente
- Definirea unei funcții nu înseamnă apelarea ei. Corpul se execută la apel.
- Parametrul formal apare în definiție; argumentul efectiv apare la apel.
- Numărul și poziția argumentelor trebuie să corespundă parametrilor necesari.
- Corpul funcției trebuie indentat corect.
- O funcție trebuie să aibă o responsabilitate clară.
- În această lecție funcțiile sunt folosite în principal pentru organizarea instrucțiunilor;
returnva fi aprofundat în lecția 3.3.
Afișarea divizorilor printr-o funcție
Problemă
Se citește un număr natural n. Să se definească o funcție care afișează toți divizorii pozitivi ai lui n și să fie apelată pentru n.
Analiză
Intrare: n > 0. Ieșire: divizorii pozitivi. Grupăm parcurgerea cunoscută într-o funcție.
Algoritm
subprogram afiseaza_divizori(n)
pentru d ← 1, n execută
dacă n % d = 0 atunci
afișează d
■
■
■
citește n
Apel afiseaza_divizori(n)Python
def afiseaza_divizori(n):
for d in range(1, n + 1):
if n % d == 0:
print(d, end=" ")
n = int(input("n = "))
afiseaza_divizori(n)Urmărirea variabilelor
| Etapă | n | d | Acțiune |
|---|---|---|---|
| apel | 12 | - | se transmite 12 funcției |
| 1 | 12 | 1 | 12 % 1 = 0 → afișează 1 |
| 2 | 12 | 2 | 12 % 2 = 0 → afișează 2 |
| 3 | 12 | 3 | 12 % 3 = 0 → afișează 3 |
| 4 | 12 | 4 | 12 % 4 = 0 → afișează 4 |
| 6 | 12 | 6 | 12 % 6 = 0 → afișează 6 |
| 12 | 12 | 12 | 12 % 12 = 0 → afișează 12 |
La apel, parametrul primește valoarea citită. Execuția intră în funcție, parcurge valorile lui d, apoi revine în programul principal.
Primele funcții
- Definește funcția salut() care afișează un mesaj și apeleaz-o de trei ori.
- Definește funcția afiseaza_patrat(x), care afișează pătratul lui x.
- Definește funcția afiseaza_maxim(a, b), care afișează maximul celor două valori.
- Definește funcția afiseaza_paritate(n), care afișează dacă n este par sau impar.
- Definește funcția afiseaza_cifre(n), care afișează cifrele unui număr folosind prelucrarea cunoscută din capitolul 2.
- Definește funcția suma_cifre(n), care, în această etapă, afișează suma cifrelor lui n.
- Definește o funcție care afișează divizorii unui număr și apeleaz-o pentru două numere citite.
Reutilizare și combinare
- Definește o funcție care afișează toți divizorii proprii ai unui număr.
- Definește o funcție care afișează dacă un număr este prim. Folosește o parcurgere eficientă deja studiată.
- Definește o funcție care afișează CMMDC-ul a două numere, folosind algoritmul lui Euclid.
- Definește o funcție care afișează conversia unui număr natural din baza 10 în baza 2.
- Scrie un program în care aceeași funcție de verificare a divizibilității este apelată pentru mai multe perechi.
- Analizează un program în care aceeași secvență apare de trei ori. Rescrie-l folosind o funcție și explică avantajul.
Verifică-ți înțelegerea
Mini-quiz
1. Care este rolul lui def?
2. În definiția f(x), x este...
3. Când se execută corpul?
4. În f(7,3), 7 și 3 sunt...
5. Ce trebuie să fie corect în corpul funcției?
Trusa de operații algoritmice
Trusa de operații algoritmice
Construiește un program care citește mai multe valori și pune la dispoziție, prin funcții separate, operații precum afișarea divizorilor, verificarea parității, calculul sumei cifrelor și afișarea CMMDC pentru două valori.
- fiecare funcție are o singură responsabilitate principală;
- parametrii sunt folosiți pentru datele necesare funcției;
- programul principal conține citirea datelor și apelurile;
- include cel puțin trei seturi de date de test;
- explică, pentru un apel, traseul execuției de la programul principal la funcție și înapoi.