1.1 Bazele limbajului Python
Python este limbajul de lucru la ONIA. Aici punem fundația: variabile, structuri de control, funcții, colecții, clase și lucrul cu fișiere — exact ce cere programa.
Teorie
Tipuri de date și variabile
O variabilă primește o valoare prin atribuire; tipul se deduce automat. Tipurile de bază:
int (întregi), float (reale), str (texte), bool
(adevărat/fals).
varsta = 16 # int
medie = 9.75 # float
nume = "Ana" # str
promovat = True # bool
print(type(medie)) # <class 'float'>
print(int("42") + 1) # conversie: 43
print(f"{nume} are media {medie:.2f}") # f-string cu 2 zecimale
f"{x:.2f}"
rotunjește la două zecimale exact cum cere enunțul.Structuri de control: if, for, while
nota = 7
if nota >= 9:
print("excelent")
elif nota >= 5:
print("promovat")
else:
print("corigent")
for i in range(1, 6): # 1, 2, 3, 4, 5
print(i * i)
n = 100
while n > 1:
n = n // 2 # împărțire întreagă
Funcții
O funcție primește parametri, returnează un rezultat și poate fi refolosită și testată separat. Bună practică: funcția returnează, afișarea se face în afara ei.
def medie_aritmetica(valori):
return sum(valori) / len(valori)
def normalizeaza(x, minim, maxim):
"""Aduce x în intervalul [0, 1]."""
return (x - minim) / (maxim - minim)
print(medie_aritmetica([7, 9, 10])) # 8.666...
Liste, tupluri, dicționare, comprehensions
note = [7, 9, 10, 4] # listă — modificabilă
punct = (3, 4) # tuplu — nemodificabil
elev = {"nume": "Ana", "medie": 9.5} # dicționar — cheie: valoare
note.append(8)
note.sort()
print(note[0], note[-1]) # primul și ultimul element
print(elev["nume"])
# list comprehension: transformă/filtrează într-o singură linie
patrate = [x**2 for x in range(10)]
promovate = [n for n in note if n >= 5]
# dict comprehension
frecventa = {litera: "ana maria".count(litera) for litera in "anm"}
Clase
class Elev:
def __init__(self, nume, note):
self.nume = nume
self.note = note
def medie(self):
return sum(self.note) / len(self.note)
e = Elev("Ana", [9, 10, 8])
print(e.nume, e.medie())
Fișiere text și CSV
Aproape orice problemă ONIA înseamnă: citește train.csv și test.csv,
calculează, scrie submission.csv. Modulul standard csv este suficient
la început.
# fișier text
with open("date.txt", "r", encoding="utf-8") as f:
linii = f.read().splitlines()
# fișier CSV cu antet
import csv
with open("train.csv", "r", encoding="utf-8") as f:
for rand in csv.DictReader(f):
print(rand["SampleID"], rand["temperature_c"])
# scriere CSV
with open("submission.csv", "w", encoding="utf-8", newline="") as f:
w = csv.DictWriter(f, fieldnames=["SampleID", "pred"])
w.writeheader()
w.writerow({"SampleID": 1, "pred": 32.0})
Imagini
O imagine este o matrice de pixeli. Cu Pillow o citim, iar cu NumPy o prelucrăm
(detaliem în lecția 1.2).
from PIL import Image
import numpy as np
img = Image.open("poza.png")
print(img.size) # (lățime, înălțime)
a = np.array(img) # matrice (H, W, 3) cu valori 0-255
gri = img.convert("L") # tonuri de gri
gri.save("poza_gri.png")
Problemă rezolvată: Celsius → Fahrenheit
Primim temperaturi în Celsius în test.csv și trebuie să construim
submission.csv cu valorile în Fahrenheit, rotunjite la două zecimale.
Formula: F = C × 9/5 + 32.
Soluția pas cu pas
1. Verificăm formula pe train.csv (are și răspunsul corect).
2. Aplicăm formula pe test.csv.
3. Scriem submission.csv cu coloanele cerute.
import csv
def celsius_to_fahrenheit(c):
return round(c * 9 / 5 + 32, 2)
rows = []
with open("test.csv", encoding="utf-8") as f:
for r in csv.DictReader(f):
rows.append({
"SampleID": r["SampleID"],
"temperature_f": f"{celsius_to_fahrenheit(float(r['temperature_c'])):.2f}"
})
with open("submission.csv", "w", encoding="utf-8", newline="") as f:
w = csv.DictWriter(f, fieldnames=["SampleID", "temperature_f"])
w.writeheader()
w.writerows(rows)
Probleme propuse
Citește dintr-un fișier text câte o notă pe linie și afișează media, nota minimă și nota maximă, cu două zecimale. Rezolvă fără biblioteci externe.
Citește un text și construiește un dicționar {cuvânt: număr de apariții}. Afișează cele mai
frecvente 5 cuvinte. Indiciu: text.lower().split() și un dicționar.
Un CSV are coloanele nume, inaltime_cm. Creează un CSV nou cu o coloană suplimentară
inaltime_m (metri, două zecimale) — același tipar citire → transformare → scriere
ca la problema rezolvată.
Filtrează după dificultatea Ușor și rezolvă problemele introductive de prelucrare de date.