KULTUROSFERA

Repetiții și liste: media clasei în Python

Lecția-suport: Testez în simulator și pe viu

Calculatorul tău de medii din laboratorul 3 avea o slăbiciune: pentru 3 note, 3 rânduri de input. Pentru toată clasa — 25 de elevi — ar însemna 25 de rânduri aproape identice. Niciun programator nu scrie așa. Azi înveți cele două unelte care rezolvă problema dintr-o lovitură: lista (o variabilă care ține oricâte valori) și for (repetiția care lucrează pentru tine). La finalul laboratorului vei avea un program care primește notele întregii clase, oricâte ar fi, și raportează media, nota cea mai mică și cea mai mare.

Ce îți trebuie

  • VS Code cu Python funcțional și dosarul python-lab (laboratoarele 3-4).
  • Un set real de date: notele clasei tale la un test recent (sau inventate, dacă profesorul nu le dă — dar cu date reale e mai interesant).
  • Timp: 45 de minute — 20 pentru unelte, 25 pentru program și misiune.

Lista: o cutie cu multe compartimente

  1. Creează liste.py și scrie:
note = [8, 10, 7, 9, 6]

print(note)
print("Prima notă:", note[0])
print("Câte note sunt:", len(note))
print("Suma lor:", sum(note))
  1. Rulează și potrivește fiecare rând de rezultat cu rândul de cod care l-a produs. Trei lucruri de ținut minte:
    • parantezele pătrate creează lista; elementele se despart cu virgulă;
    • numerotarea pozițiilor începe de la 0note[0] e prima notă, note[4] e a cincea;
    • len numără elementele, sum le adună. Deci media e la un pas: sum(note) / len(note).
  2. Adaugă la final print("Media:", sum(note) / len(note)) și verifică de mână rezultatul pentru cele 5 note.

For: repetiția care lucrează pentru tine

  1. Creează repetitie.py:
note = [8, 10, 7, 9, 6]

for nota in note:
    print("Am găsit nota:", nota)

Rulează: cinci mesaje dintr-un singur print. Citirea corectă a rândului cu for: „pentru fiecare nota din lista note, fă ce urmează indentat". Variabila nota primește pe rând fiecare valoare din listă.

  1. for poate și să construiască o listă, nu doar să o citească. Exact ce ne trebuie ca să strângem notele de la tastatură:
note = []

for i in range(4):
    nota = int(input("Nota elevului: "))
    note.append(nota)

print("Am strâns notele:", note)

Trei piese noi: [] e lista goală (cutia fără nimic în ea), range(4) face repetiția să se execute exact de 4 ori, iar note.append(nota) adaugă nota la coada listei. Rulează și introdu 4 note.

Programul complet: raportul clasei

  1. Acum asamblează tot în media_clasei.py:
print("=== Media clasei ===")
cati = int(input("Câți elevi au primit note? "))

note = []
for i in range(cati):
    nota = int(input("Nota " + str(i + 1) + ": "))
    note.append(nota)

media = sum(note) / len(note)

print("--- Raport ---")
print("Note introduse:", len(note))
print("Media clasei:", round(media, 2))
print("Cea mai mică notă:", min(note))
print("Cea mai mare notă:", max(note))
  1. Observă finețea de la input: i merge de la 0, dar oamenii numără de la 1, așa că afișăm i + 1; și pentru că i + 1 e număr iar mesajul e text, îl convertim cu str — conversia inversă față de int.
  2. Testează cu notele reale ale clasei la ultimul test. Programul nu are nicio limită: merge la fel de bine cu 5 note sau cu 30 — asta e diferența față de varianta cu 3 input-uri fixe din laboratorul 3.

Dacă nu merge

  • IndentationError sau se repetă doar o parte din instrucțiuni. Tot ce trebuie să se întâmple la fiecare repetiție stă indentat sub for. Ce stă neindentat se execută o singură dată, după ce repetiția s-a terminat. Verifică rând cu rând: e la locul lui?
  • TypeError: can only concatenate str (not "int") to str. Ai lipit un număr de un text cu + fără conversie. Împachetează numărul în str(...), ca la pasul 7.
  • ZeroDivisionError. Ai răspuns 0 la „câți elevi" — lista a rămas goală și media împarte la zero. Poți adăuga un if len(note) > 0 înainte de calcul; cu ce ai învățat în laboratorul 4, știi deja cum.
  • IndexError: list index out of range. Ai cerut note[5] dintr-o listă cu 5 elemente — care are pozițiile 0-4. Ultima poziție e mereu len(note) - 1.
  • Programul cere note la nesfârșit. range(cati) a primit un număr uriaș pentru că ai tastat greșit. Oprește-l cu Ctrl + C în terminal și rulează din nou.

Misiunea ta

Nivel de bază: media_clasei.py funcționează pentru oricâte note și raportează media (2 zecimale), minimul și maximul.

Extindere: adaugă în raport câte note sunt sub 5. Ai nevoie de o variabilă-contor pornită de la 0 înainte de un for prin listă, și un if nota < 5 care o crește cu 1 — combinația dintre laboratorul 4 și cel de azi.

Provocare: raportul directorului — după afișarea mediei, programul verdictează: media peste 8.50 „clasă de top", între 7 și 8.50 „clasă solidă", sub 7 „e de lucru". Apoi afișează fiecare notă pe un rând propriu, cu un marcaj ! lângă notele sub 5. Totul cu un singur for suplimentar.

Ai terminat când:

  • programul dă raportul corect pentru notele reale ale clasei tale;
  • pentru 6, 8, 10 raportează exact valorile din punctul de control;
  • poți explica ce face fiecare dintre: [], append, range, sum, len;
  • programul merge neschimbat și pentru 5 note, și pentru 30.