1. Tokenii limbajului

Orice program este o succesiune de tokeni — unitățile elementare pe care interpretorul le recunoaște. În Python există cinci categorii:

Categorie Ce este Exemple
Identificator nume dat unei variabile, funcții, clase viteza, citeste_date, Senzor
Cuvânt rezervat termen cu sens fix în limbaj def, class, if, return
Literal valoare scrisă direct în cod 42, 3.14, "text", True, None
Operator simbol al unei operații +, **, and, is, :=
Delimitator structurează codul ( ) [ ] { } , : . = ->

Diferența vizibilă imediat față de Java, C sau C# este absența acoladelor. Blocurile de cod nu sunt delimitate de { }, ci de indentare:

// Java — indentarea este doar estetică
if (x > 5) {
    System.out.println("mare");
    x = 0;
}

# Python — indentarea ESTE sintaxa
if x > 5:
    print("mare")
    x = 0

2. Indentarea

Regulile sunt puține și stricte:

  • Patru spații pe nivel. Convenție PEP 8, respectată de întregul ecosistem.
  • Nu amestecați tabulatori cu spații. Python 3 refuză fișierul cu TabError.
  • Un bloc trebuie să conțină cel puțin o instrucțiune. Dacă nu aveți ce scrie, puneți pass.
  • Indentare consecventă în tot fișierul. Nivelurile trebuie să fie multipli ai aceleiași unități.

Consecința importantă este că indentarea determină sensul programului, nu doar aspectul lui:

# varianta A — afișează la fiecare pas
total = 0
for x in date:
    if x > 0:
        total += x
    print(total)          # în interiorul buclei

# varianta B — afișează o singură dată, la final
total = 0
for x in date:
    if x > 0:
        total += x
print(total)              # după buclă
Ambele variante sunt sintactic corecte. Ambele rulează. Rezultatele sunt complet diferite. Este exact tipul de eroare pe care un compilator nu îl poate semnala — se numește eroare semantică și se depistează doar prin citirea atentă a codului și prin testare.

Continuarea liniilor lungi

# în interiorul parantezelor, continuarea este implicită — forma preferată
rezultat = (valoare_initiala
            + corectie * factor
            - offset)

lista = [
    "primul",
    "al doilea",
]

# cu backslash — permis, dar fragil: după \ nu poate exista niciun spațiu
rezultat = valoare_initiala + corectie \
           - offset

3. Identificatori și cuvinte rezervate

Un identificator poate conține litere, cifre și underscore, dar nu poate începe cu o cifră. Numele sunt sensibile la majuscule: Viteza, viteza și VITEZA sunt trei nume distincte. Diacriticele sunt permise tehnic (măsurare = 5 funcționează), dar nu se folosesc în cod.

import keyword
print(keyword.kwlist)

# False   None    True    and     as      assert  async   await
# break   class   continue  def   del     elif    else    except
# finally for     from    global  if      import  in      is
# lambda  nonlocal  not   or      pass    raise   return  try
# while   with    yield

Sunt 35 de cuvinte rezervate, față de aproximativ 50 în Java. Limbajul este deliberat mic: complexitatea stă în biblioteci, nu în sintaxă.

Nu redefiniți nume din biblioteca standard. O atribuire de tipul list = [1, 2, 3] sau type = "senzor" funcționează, dar face funcția list() sau type() inutilizabilă în tot restul fișierului. Alte nume frecvent „pierdute” din greșeală: str, id, input, sum, dict, max, min.
Ce denumiți Stil Exemplu În Java
variabilă, funcție snake_case viteza_maxima camelCase
clasă PascalCase SenzorTemperatura PascalCase
constantă MAJUSCULE PORT_IMPLICIT MAJUSCULE
modul, pachet litere mici achizitie_date litere mici
intern, „privat” prefix _ _conexiune private

4. Literali

42          -17         0            # int, precizie nelimitată
3.14        2.5e-3      1_000_000    # float; _ este doar separator vizual
0b1010      0o17        0xFF         # binar, octal, hexazecimal
3 + 4j                               # complex
True        False       None         # bool și absența valorii

Underscore-ul din 1_000_000 este ignorat de interpretor și există exclusiv pentru lizibilitate — util la măști de biți și la valori mari.

Șiruri de caractere

'ghilimele simple'
"ghilimele duble"                    # complet echivalente
"""șir pe
mai multe linii"""

r"C:\Users\date"                     # raw: backslash-ul nu mai escapează
f"Viteza: {v:.2f} m/s"               # f-string: expresie evaluată pe loc
b"\x01\x02"                          # bytes — folosit la serial și socket

"Salut, " "lume"                     # două literale alăturate se lipesc
Trei tipuri de șiruri, trei roluri. str este text Unicode — ce manipulați în interiorul programului. bytes sunt octeți bruți — ce circulă prin socket, prin portul serial sau într-un fișier binar. Conversia este întotdeauna explicită: text.encode("utf-8") și octeti.decode("utf-8"). Această graniță revine în temele 7 și 8.

5. Operatori

Operator Ce face Exemplu
/ împărțire, rezultat întotdeauna float 4 / 22.0
// împărțire întreagă, rotunjire în jos -7 // 2-4
% restul, cu semnul împărțitorului -7 % 21
** ridicare la putere 2 ** 101024
is identitate — același obiect a is None
== egalitate — aceeași valoare a == b
:= atribuire în expresie („walrus”) if (n := len(x)) > 5:

Distincția is / == este sursă frecventă de erori:

a = [1, 2, 3]
b = [1, 2, 3]

print(a is b)      # False — sunt două obiecte distincte în memorie
print(a == b)      # True  — au aceleași valori

# is se folosește doar pentru None, True, False:
if rezultat is None:
    ...

Precedența, de la mare la mic: ()** → unar -* / // %+ - → comparații → notandor. Python evaluează logica leneș: dacă partea stângă a unui and este falsă, partea dreaptă nu se evaluează deloc. Acesta nu este doar un detaliu de optimizare, ci un instrument de protecție:

if n != 0 and 100 / n > 5:      # dacă n == 0, împărțirea nu se execută
    print("da")

if 0 <= indice < len(lista):    # lanț de comparații — nu există în Java
    print(lista[indice])

6. Comentarii și documentare

# comentariu pe o linie — pentru cititorul codului

def citeste_masuratori(port: str, viteza: int = 9600) -> list[float]:
    """Citește măsurătorile de pe portul serial indicat.

    Argumente:
        port: numele portului ("COM3" sau "/dev/ttyUSB0")
        viteza: rata de transfer în baud

    Returnează:
        lista valorilor citite, în ordinea recepției
    """
    ...

Docstring-ul nu este un comentariu. Comentariul dispare la compilare; docstring-ul rămâne în program, ca atribut al obiectului:

print(citeste_masuratori.__doc__)   # textul documentației
help(citeste_masuratori)            # aceeași informație, formatată

Aceleași docstring-uri alimentează autocompletarea din IDE, documentația generată automat și testele executabile (doctest). Este prima formă de introspecție din acest curs — programul își citește propria descriere la rulare. Tema 9 duce ideea până la capăt.

7. PEP 8 și codificarea sursei

PEP 8 este standardul oficial de stil. Regulile pe care le veți aplica cel mai des:

  • Indentare de 4 spații, niciodată tabulator.
  • Maximum 79–99 caractere pe linie — codul se citește adesea pe ecran împărțit.
  • Un spațiu în jurul operatorilor binari: a = b + c, nu a=b+c.
  • Două linii goale între funcții la nivel de modul; una singură între metodele unei clase.
  • Importurile grupate: bibliotecă standard, apoi pachete terțe, apoi module proprii.
pip install ruff black

ruff check .        # semnalează erori și abateri de stil
ruff check --fix .  # corectează automat ce se poate
black .             # reformatează tot codul după un stil unic
Într-o echipă, formatarea automată elimină complet discuțiile despre stil și scoate din istoricul de versiuni diferențele artificiale, produse doar de reformatare.

Codificarea

# Python 3 presupune UTF-8 pentru fișierele sursă, fără nicio declarație
mesaj = "Măsurătoare finalizată"     # diacriticele merg direct în sursă

# problema apare la DATE, nu la sursă:
open("raport.txt", "w")                       # codificare dependentă de sistem
open("raport.txt", "w", encoding="utf-8")     # portabil

8. Greșeli tipice

Simptom Cauză și rezolvare
IndentationError: unexpected indent Spațiu în plus la începutul liniei
TabError Tab și spații amestecate. Configurați editorul pe spații
SyntaxError pe o linie corectă Paranteză neînchisă pe linia de dinainte
SyntaxError: invalid character '“' Ghilimele „inteligente” copiate din Word
Programul dă alt rezultat decât cel așteptat Instrucțiune la nivel greșit de indentare
is returnează False la valori egale Folosiți ==; is doar pentru None
4 / 22.0 unde așteptați 2 /float; folosiți // pentru întreg
list „nu mai funcționează” Ați folosit numele unei funcții încorporate ca variabilă

9. Întrebări de autoverificare

  1. De ce indentarea greșită poate produce un program corect sintactic, dar greșit logic?
  2. Câte cuvinte rezervate are Python și de ce sunt mult mai puține decât în Java?
  3. Care este diferența dintre is și ==? Când folosiți fiecare?
  4. Ce returnează -7 // 2 și -7 % 2? Explicați rezultatul.
  5. Prin ce diferă un comentariu de un docstring, din punctul de vedere al programului?
  6. De ce fișierul sursă nu are nevoie de encoding, dar open() are?
  7. Ce se întâmplă dacă scrieți str = "text" la începutul programului?
Последнее изменение: понедельник, 14 сентября 2026, 13:44