Indentarea
Indentarea reprezinta plasarea/alinierea liniilor unui program, astfel incat sa fie cat mai usor de parcurs/citit. In limbajul Python, nivelul de indentarea are semnificatie sintactica. Instructiunile dintr-un bloc de cod prezinta acelasi nivel de indentare, spre deosebire la alte limbaje de programare in care blocurile sunt delimitate prin intermediul constructiilor begin … end sau prin intermediul acoladelor { … }.
>>> for i in range(5, 0, -1): ... print(i) ... 5 4 3 2 1
In limbajul Python, orice declaratie/instructiune se termina cu un caracter de linie noua. Daca se doreste continuarea unei declaratii pe mai multe linii poate fi utilizat caracterul \.
>>> a = 1 >>> a = \ ... a + \ ... 3 >>> a 4
>>> "Bun venit \ ... in \ ... lumea \ ... Python" 'Bun venit in lumea Python'
De asemenea, este posibila combinarea mai multor instructiuni pe o singura linie. Intr-un astfel de caz, este necesara utilizarea caracterului ; pentru separarea instructiunilor.
>>> # posibil >>> err = True >>> if err: print('error'); print('please wait') ... error please wait >>> # preferat >>> if err: ... print('error') ... print('please wait') ... error please wait
Declaratiile neindentate de la nivelul unui program sunt definitii de functii, clase, variabile globale sau elemente ale programului principal (main).
Chiar daca nu exista reguli clare cu privire la modalitatea de implementare a indentarii (spatiu, tab), trebuie avut in vedere faptul ca aceasta trebuie sa fie una consecventa (aceiasi la nivelul blocului).
>>> if err: ... print('error') ... print('please wait') File "", line 3 print('please wait') ^ IndentationError: unexpected indent
Cuvinte cheie
Cuvintele cheie sunt termeni rezervati care nu pot fi utilizati ca si identificatori; sunt utilizate pentru a defini sintaxa si structura limbajului Python. Cu execptia lui True, False si None, cuvintele cheie trebuie precizate cu litere mici (sunt case-sensitive).
Lista cuvintelor cheie este una dinamica, putand sa primeasca/piarda membri pe parcursul evolutiei limbajului. O prima modalitate de obtinere a termenilor rezervati presupune utilizarea modulului keyword.
>>> 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']
De asemenea, lista cuvintelor cheie din limbajul Python poate fi obtinuta prin precizarea termenului keywords in cadrul sistemului de ajutor Python (disponibil prin apelul help()).
>>> help() help> keywords Here is a list of the Python keywords. Enter any keyword to get more help. False class from or None continue global pass True def if raise and del import return as elif in try assert else is while async except lambda with await finally nonlocal yield break for not
Comentarii
Comentariile sunt parti ale programelor care au rolul de a explica procesele executate sau de a preciza informatii aditionale cu privire la programe (autor, scop); comentariile sunt ignorate de interpretor.
In limbajul Python, comentariile pe o singura linie sunt precedate de caracterul (#); un comentariu pe o singura linie se termina la incheierea linie de program.
>>> # comentariu pe o singura linie
Daca in primele doua linii ale unei fisier sursa exista un comentariu care corespunde modelului coding[=:]\s*([-\w.]+), acest comentariu este interpretat ca si declaratie de codificare a caracterelor.
# -*- coding: utf-8 -*-
Comentariile pe mai multe linii presupun utilizarea perechilor de caractere ”’ si ”’ / “”” si “”” la incepul si la sfarsitul unui text explicativ sau a unei zone de script care se doreste a fi ignorata la interpretare.
Comentariile de documentare (docstring) se introduc la inceputul modulelor, fisierelor, claselor sau functiilor. Comentariile de documentare sunt introduse prin intermediul perechilor de caractere “”” si “””; aceste perechi de caractere se utilizeaza in general pentru a introduce siruri de caractere pe mai multe linii.
# -*- coding: utf-8 -*- | |
"""Rolul acestui modul este acela de a introduce functii pentru transmiterea de mesaje. | |
Fisier: hello.py | |
Versiune Python: 3.7 | |
""" | |
default_name = 'Zaya' # nume implicit al unei persoane | |
def hello_python(): | |
"""Afiseaza un mesaj de tipul Hello Python!""" | |
print('Hello Python!') | |
def hello_name(name=default_name): | |
"""Afiseaza un mesaj personalizat sau Hello Zaya! daca nu se transmite valoare pentru nume""" | |
print('Hello %s!' % name) | |
if __name__ == "__main__": | |
hello_name() |
Limbajul Python pune la dispozitia dezvoltatorilor un modul special (pydoc) pentru generarea de documentatie pe baza comentariilor introduse in fisierele sursa. Documentatia rezultata este in format text disponibil pe consola sau format HTML, si descrie module, clase, metode, etc.
>>> import hello >>> hello.hello_name() Hello Zaya! >>> hello.hello_python() Hello Python!
Comentariile de documentare corespunzatoare unei functii sau modul sunt disponibile prin intermediul atributului __doc__.
>>> print(hello.hello_python.__doc__) Afiseaza un mesaj de tipul Hello Python! >>> print(hello.hello_name.__doc__) Afiseaza un mesaj personalizat sau Hello Ghita! daca nu se transmite valoare pentru nume
>>> print(hello.__doc__) Rolul acestui modul este acela de a introduce functii pentru transmiterea de mesaje. Fisier: hello.py Versiune Python: 3.7
Tipuri de date
Un tip de date defineste domeniul de valori posibile si operatiile permise asupra valorilor din domeniu. Limbajul Python pune la dispozitie urmatoarele tipuri de date: numerice (int, float), logice (bool), secvente (siruri, liste, tupluri), tabele asociative (dictionary), multimi (set), clase, instante si exceptii.
Limbajul Python este un limbaj orientat pe obiecte. Toate elementele de la nivelul unei surse, inclusiv functiile si valorile primitive predefinite, sunt reprezentate ca si obiecte sau relatii intre obiecte. Toate obiectele detin o identitate, un tip de date si o valoare.
>>> a = 13 >>> print(a, " are tipul ", type(a)) # type() returneaza tipul unui obiect <class 'int'> >>> id(a) # id() returneaza identitatea corespunzatoare unui obiect 1350423792 >>> a 13
Identitatea unui obiect nu se modifica niciodata. Reprezentarea numerica a identitatii unui obiect este disponibila prin intermediul functiei id(). Identitatea a doua obiecte poate fi comparata folosind operatorul is. Tipul unui obiect determina operatiile posibile, precum si valorile pe care le poate lua obiectul.
Limbajul Python este un limbaj cu tipizare dinamica (dynamically typed), adica tipul de date pentru o valoare este stabilit in timpul executiei, nu in avans. Din acest motiv, nu este necesara specificarea tipului de date pentru o variabila la declarare.
>>> a = 13 >>> b = 3.14 >>> c = 'Casandra'
De asemenea, limbajul Python prezinta o tipizarea puternica (strongly typed), adica nu sunt permise operatii cu obiecte avand tipuri de date diferite (cu exceptia utilizarii unor conversii explicite).
>>> a + b 16.14 >>> a + c ... TypeError: unsupported operand type(s) for +: 'int' and 'str'
Variabile
Variabilele reprezinta nume pentru obiecte, in diferite domenii de utilizare ale acestora. Variabilele pastreaza referinte catre obiecte. Daca este utilizata o variabila, tipul acesteia este dat de tipul obiectului cu care este asociata.
>>> a = 3 >>> type(a) <class 'int'> >>> a = 3.14 >>> type(a) <class 'float'> >>> a = 'Zaya' >>> type(a) <class 'str'>
Este gresita folosirea intr-o expresie a unei variabile care nu a fost asociata cu un obiect. Alocarea si dezalocarea memoriei se face automat in limbajul Python, fiind implementata prin intermediul unui mecanism de tip garbage collection.
>>> a + 5 Traceback (most recent call last): File "", line 1, in NameError: name 'a' is not defined
Datorita faptului ca partea dreapta a unei expresii este evaluata inainte de a face atribuirea, valorile a doua variabile pot fi foarte usor interschimbate.
>>> a = 13 >>> b = 20 >>> a, b = b, a >>> print(a, b) 20 13
Identificatorii (denumirile) sunt termeni care denota entitati dintr-un program. Exemple de identificatori sunt numele de functii, de variabile, de constante sau de clase. Pentru identificatori, in limbajul Python, sunt valabile urmatoarele reguli:
• identificatorii pot avea orice lungime;
• identificatorii pot contine litere, numere sau caracterul _ (underscore);
• identificatorii nu pot incepe cu o cifra;
• identificatorii sunt case sensitive (se face distinctie intre literele mari si literele mici).
Spatii de nume
Un spatiu de nume sau context reprezinta o colectie de denumiri mapate catre obiecte. Intr-o aplicatie Python sunt disponibile mai multe spatii de nume, create in momente de timp diferite:
• spatiul de nume implicit contine totalitatea identificatorilor predefiniti (ex. print(), id());
• spatiul de nume global corespunde numelor disponibile la nivelul unui modul;
• spatiul de nume local are in vedere denumirile introduse la nivelul unei functii.
Inspectarea spatiilor de nume global si local se poate realiza prin intermediul functiilor predefinite globals(), respectiv locals().
Variabilele declarate la nivelul unei functii, precum si argumentele acesteia beneficiaza de o vizibilitate locala. Variabilele definite la nivel global sunt denumite variabile globale; ele pot fi utilizate si la nivelul functiilor. Variabila nume din interiorul functiei are un scop local, adica este vizibila doar in interiorul functiei in care este definita.
>>> nume = "Popescu" >>> def modifica_nume(): ... nume = "Ionescu" ... >>> modifica_nume() >>> print(nume) Popescu
Variabilele declarate in afara functiei au un scop global. Variabilele globale pot fi modificate din orice zona a programului, cu exceptia functiilor. Pentru a modifica o variabila globala din interiorul unei functii este necesara plasarea lui global inaintea variabilei.
>>> nume = "Popescu" >>> def modifica_nume(): ... global nume ... nume = "Ionescu" ... >>> modifica_nume() >>> print(nume) Ionescu
Operatori
Operatorii sunt elemente ale limbajelor de programare care acţioneaza asupra unuia sau mai multor operanzi pentru a produce o valoare. La nivelul limbjului Python pot fi intalnite urmatoarele categorii de operatori:
• operatori aritmetici: +, -, *, /, %, **, //;
• operatori de comparare: ==, !=, <>, <, >, <=, >=;
• operatori de atribuire: =, +=, -=, *=, /=, %=, **=, //=;
• operatori logici: and, or, not ;
• operatori pe biti: &, |, ^, ~, <<, >>;
• operatori pentru verificarea apartenentei: in, not in;
• operatori pentru verificare a identitatii: is, is not.
>>> 9.0 // 2.0 4.0 >>> 9.0 / 2.0 4.5
Operatorii de verificare a apartenentei verifica daca un element apartine sau nu unei secvente.
>>> 'ab' in 'abecedar' True >>> 1 not in [1, 2, 3] False
>>> a = "Hello Python!" >>> 'hello' not in a True >>> 'Java' in a False
>>> b = (23, 14, 6, 15) >>> 23 in b True >>> c = ['X', 'Y', 'Z'] >>> 'T' not in c True
Operatori pentru verificarea identitatii verifica daca doua valori refera acelasi obiect (locatie de memorie).
>>> x = 'Hello' >>> y = 'hello' >>> x is y False
>>> a = 3 >>> b = 3 >>> a is b True >>> id(a) 1694880848 >>> id(b) 1694880848