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ă
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ă.
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
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 / 2 → 2.0 |
// |
împărțire întreagă, rotunjire în jos | -7 // 2 → -4 |
% |
restul, cu semnul împărțitorului | -7 % 2 → 1 |
** |
ridicare la putere | 2 ** 10 → 1024 |
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 → not → and → or. 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, nua=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
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 / 2 dă 2.0 unde așteptați 2 |
/ dă 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
- De ce indentarea greșită poate produce un program corect sintactic, dar greșit logic?
- Câte cuvinte rezervate are Python și de ce sunt mult mai puține decât în Java?
- Care este diferența dintre
isși==? Când folosiți fiecare? - Ce returnează
-7 // 2și-7 % 2? Explicați rezultatul. - Prin ce diferă un comentariu de un docstring, din punctul de vedere al programului?
- De ce fișierul sursă nu are nevoie de
encoding, daropen()are? - Ce se întâmplă dacă scrieți
str = "text"la începutul programului?
