Fundamente de programare

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
La problemele de pe platformă, formatul de afișare contează: 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

Intro Python: Transformarea temperaturilor Ușor Rezolvată

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

1. Media notelor Exercițiu

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.

2. Frecvența cuvintelor Exercițiu

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.

3. Conversie CSV Exercițiu

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ă.

4. Probleme „Ușor" pe platformă Platformă

Filtrează după dificultatea Ușor și rezolvă problemele introductive de prelucrare de date.