Sunteți pe pagina 1din 12

TEHNOLOGIA PYTHON

Continut

Python este un limbaj introdus in 1991 de creatorul lui, Guido Van Rossum, in timp ce lucra pentru Stichting Mathematisch Centrum. Multe dintre caracteristicile Python au originea dintr-un limbaj interpretat, ABC. Rossum a vrut sa corecteze cateva din problemele ABC si sa pastreze caracteristicile acestuia. La momentul respectiv lucra pe un sistem distribuit Amoeba si cauta un limbaj de scripting similar cu ABC, dar cu acces la apelurile sistem Amoeba, asa ca a decis crearea unui limbaj care sa fie general extensibil. In urma experientei pe care Rossum a dobandit-o cu Modula-2+, a decis sa discute cu designerii Modula-3. Modula-3 este originea sintaxei si semanticii folosite pentru exceptii, dar si a altor caracteristici Python. Numele de "Python" a fost adoptat de la serialul de comedie de pe BBC, "Monty Python's Flying Circus", un nume scurt, unic si usor misterios. Python este un limbaj interpretat, interactiv, orientat pe obiect. Incorporeaza module, exceptii, dynamic typing, tipuri de date dinamice de nivel foarte inalt si clase. Python combina o putere remarcabila cu o sintaxa foarte clara. Este de asemenea util ca limbaj extensie pentru aplicatiile care au nevoie de o interfata de programare. In cele din urma, Python este portabil pe toate platformele hardware si software majore. Python este un limbaj dinamic orientat pe obiect care poate fi utilizat cu succes pentru mai multe genuri de dezvoltare de produse software. Ofera suport puternic pentru integrarea cu alte limbaje si utilitare, vine cu multe librarii standard si poate fi invatat cu usurinta in cateva zile. Din punctul de vedere al programatorului, Python este un limbaj elegant. Din experienta mea personala cu acesta, limbajul ofera un suport pentru programare orientata obiect deosebit, permitand realizarea cu usurinta de aplicatii Windows (spre exemplu) folosind doar librariile standard. Python este un limbaj de programare de nivel foarte inalt, dispune de tipuri de date de nivel inalt (precum tablourile sau dictionarele foarte flexibile, a caror implementare ar lua cateva zile unui programator C). Python este ideal pentru prototipizarea rapida a aplicatiilor complexe. Este de asemenea folosit ca un limbaj "glue language", pentru conectarea pieselor unei solutii complexe, precum paginile Web, bazele de date si socket-urile Internet. Limbajul are un rol esential nu doar in computer science, dar si in filmele animate, bioinformatica, si website-uri.

In plus, interpretorul Python (care este disponibil gratuit, sub forma de surse sau binare, pe site-ul www.python.org) este usor de extins prin adaugarea de noi functii si tipuri de date implementate in C, C++ sau orice alt limbaj apelabil din C. Python este un limbaj ce inglobeaza conceptul de "dynamic typing" (sau, altfel spus, verificarea tipurilor se produce la runtime, pentru ca variabilele pot obtine diferite tipuri in functie de calea de executie) si foloseste gestiunea automata a memoriei. Este prin urmare similar cu Perl, Ruby, Scheme, Smalltalk si Tcl. Cu toate ca design-ul limbajului este usor ostil programarii functionale si traditiei LISP, exista numeroase articole despre filozofia Python si aceea a unor limbaje minimaliste din familia LISP, precum Scheme. Multi programatori LISP au gasit Python atragator din aceasta privinta. In momentul de fata exista disponibil Python 2 (in 2000, Guido si echipa de dezvoltare Python au format BeOpen PythonLabs, ei lansand prima si singura versiune de Python 2; dupa lansarea Python 2, Guido si ceilalti membri s-au alaturat Digital Creations, Python 2.1 fiind o munca derivata din Python 1.6.1 si Python 2.0, licenta acestei versiuni fiind redenumita in Python Software Foundation License). Exista discutii intre grupurile de dezvoltatori despre lansarea unei versiuni Python 3.0 (Python 3000 sau Py3K) care nu va mai fi compatibil cu versiunile anterioare ale limbajului. Desi nu exista inca o certitudine in ceea ce priveste dezvoltarea noii versiuni de Python, exista un plan de imbunatatire al limbajului, care include, printre altele: suport pentru declaratii de tip optionale, unificarea tipurilor str/unicode, introducerea unui tip mutant separat byte, conversia built-ins in iteratori (in loc de liste) acolo unde este posibil, inlaturarea compatibilitatii cu versiunile anterioare (clasele clasice, impartirea clasica, exceptiile la string-uri, importurile relative implicite). Cele mai populare (si prin urmare si cele cu suportul cel mai bun pentru limbaj) platforme pe care ruleaza Python sunt Linux, BSD, Mac OS X si Windows. Exista implementari separate pentru Java (Jython) si pentru platforma .NET sau Mono (IronPython). Concluzionand, limbajul asigura programatorului o flexibilitate deosebita, un suport foarte bun pentru realizarea de progame din cele mai diversificate, si o sintaxa deosebit de clara.

Tehnologia Python

Python este folosit cu succes intr-o multitudine de domenii, plecand de la programarea aplicatiilor pentru diverse sisteme de operare si platforme hardware, la

generarea dinamica de continut (in paginile Web), bioinformatica si marile motoare de cautare (Google). Limbajul a fost folosit pentru dezvoltarea unor proiecte software de mare amploare, precum serverul de aplicatii Zope si sistemele de file-sharing Mnet si BitTorrent. Spre exemplu, un studiu arata ca traficul efectuat pe Internet este in proportie de 35% realizat de traficul BitTorrent. Pe de alta parte, motorul de cautare Google este la ora actuala numarul 1 in lume in ceea ce priveste accesele zilnice, iar acest motor foloseste de asemenea tehnologia Python. Python a fost integrat in limbajul Java in cadrul proiectului Jython, o implementare in Java a acestui limbaj, care permite rularea programelor Python pe orice platforma Java. Exista si conferinte de genul EuroPython pentru dezvoltatorii de software, designeri si oameni de afaceri din comunitatile Python si Zope, in diferite locuri din Europa, conferinte unde se discuta despre acest limbaj si despre serverul Zope. Python este un limbaj multi-paradigma, ceea ce inseamna ca in loc sa adopte un singur stil de programare, permite mai multe stiluri: programare functionala, orientata obiect, structurata si orientata-aspect. Alte paradigme pot fi de asemenea suportate prin extensii, precum PyDBC sau Contracts for Python. este un limbaj de nivel foarte inalt, dispunand de un shell pentru depanarea programelor mari precum si de un mecanism de tratare a erorilor superior multor limbaje, spre exemplu limbajului C. Datorita caracterului general al tipurilor de date, Python poate fi aplicat intr-o arie mult mai larga de probleme decat limbaje precum AWK sau Perl. Programele scrise in Python sunt mult mai mici decat cele scrise in C++ (sau alte limbaje orientate obiect), pentru ca tipurile de date de nivel inalt permit realizarea de operatii complexe intr-o singura instructiune, gruparea instructiunilor este data de paragrafare in loc de blocuri de begin/end sau de acolade, si nu este necesara declararea variabilelor. In plus, limbajul este complet extensibil, interpretorul Python putand de exemplu fi adaugat intr-o aplicatie C si folosit ca limbaj de comanda sau de extensie pentru acea aplicatie. Limbajul a fost astfel structurat incat sa fie foarte usor lizibil. Se indreapta sper un layout vizual neconventional, foloseste cuvinte cheie in limba engleza acolo unde alte limbaje folosesc punctuatia, si are mult mai putine constructii sintactice decat alte limbaje (de genul C, Perl sau Pascal). Interpretorul standard Python suporta de asemenea un mod interactiv in care se comporta ca un shell: pot fi introduse expresii pe rand, iar rezultatul evaluarii lor este imediat. Este inclus de asemena un framework extensiv pentru testare, ceea ce face limbajul usor de depanat.

In sfarsit, Python este un limbaj cu multiple utilizari: de la programarea structurata, producerea de programe pentru o multime de sisteme de operare (ruland pe cele mai diversificate platforme hardware), programarea functionala pentru inteligenta artificiala, bioinformatica (analiza genelor umane si decodarea genomului uman) la programarea orientata obiect pentru realizarea de aplicatii de mare stabilitate si fiabilitate (servere de aplicatii, sisteme de file-sharing) si generarea dinamica de continut (integrarea in paginile Web), limbajul asigura o flexibilitate sporita pentru oricine doreste sa-si dezvolte propria aplicatie, in propriul stil de programare, folosind propriile resurse.

Facilitatile limbajului Python

Limbajul are o librarie standard foarte bogata, ceea ce il face potrivit pentru multe task-uri, idee provenita din sloganul "batteries included" pentru modulele Python. Libraria este in mod deosebit axata pe partea de Web, cu un numar mare de standarde si protocoale (precum MIME sau HTTP) suportate. Exista de asemenea module pentru crearea interfetelor grafice, conectarea la bazele de date relationale, aritmetica in virgula flotanta de inalta precizie, precum si suport complet pentru manipularea expresiilor regulate. Limbajul a fost astfel structurat incat sa fie foarte usor lizibil. Se indreapta sper un layout vizual neconventional, foloseste cuvinte cheie in limba engleza acolo unde alte limbaje folosesc punctuatia, si are mult mai putine constructii sintactice decat alte limbaje (de genul C, Perl sau Pascal). Spre exemplu, in Python exista doar doua forme de looping: for name in iterable:, care trece prin continutul unei liste (sau al unei alte secvente iterabile), si while condition:, care executa o bucla atata timp cat o expresie booleana este adevarata. Indentarea este un aspect neuzual al sintaxei Python, pentru ca se folosesc spatii libere pentru delimitarea blocurilor de program (off-side rule), si pentru ca se foloseste o caracteristica imprumutata din limbajul ABC - in locul punctuatiei, Python foloseste indentarile in sine pentru a delimita blocurile de program. Spre exemplu, o functie de factorial in Python arata astfel: def factorial(x): if x == 0: return 1 else: return x * factorial(x-1)

Acest tip de indentare elimina insa ambiguitatile in codul sursa, de exemplu in cazul limbajului C o bucla for ar putea avea instructiunea de ciclare identata, dar si urmatoarea instructiune (care nu mai tine de bucla for) identata la fel ca precedenta, ceea ce in mod clar ar produce confuzii in depanarea codului. Deoarece Python este un limbaj interpretat cu tipuri dinamice de date, valorile (nu variabilele) specifica tipul. Toate variabilele detin referinte la obiecte, si aceste referinte sunt transmise functiei prin valoare; o functie nu poate schimba valoarea referita de o variabila in functia sa apelanta. Acest mod de transmitere a parametrilor a fost denumit (chiar si de Guido) "Call by object reference", sau "Apel prin referinta obiectului". Limbajul are o multime de tipuri de baza, suportand tipuri aritmetice de precizie arbitrara, dar si numere complexe. Sunt suportate multe operatii cu string-uri, dar operatiile cu string-uri in Python sunt imutabile (adica o operatie de inlocuire a unui caracter intr-un string in Python returneaza un nou string). Exista suport pentru tipurile colectie (sau container). In general o colectie este un obiect care contine alte obiecte intr-un mod usor de referit (accesat) sau indexat. Colectiile sunt fie secvente, fie mapari. Tipurile secventiale ordonate sunt listele (tablouri dinamice), tuple si string-uri. Toate secventele sunt indexate pozitional (de la 0 la Length-1) si toate (in afara de string-uri) pot contine orice tip de obiect, inclusiv tipuri multiple in aceeasi secventa. Si string-urile si tuplele sunt imutabile, ceea ce le face ideale pentru chei de dictionar. Listele sunt insa mutabile, elementele pot fi inserate, sterse, modificate sau adaugate la sfarsit, sau chiar sortate. Maparile sunt tipuri neordonate implementate sub forma dictionarelor care mapeaza un set de chei imutabile, catre elemente corespunzatoare, precum functii matematice. Un tip de date set a fost adaugat in versiunea 2.4 - o colectie neindexata, neordonata, fara duplicate, si care implementeaza operatiile teoretice posibile asupra unei multimi: reuniune, intersectie, diferenta, diferenta simetrica, si testare submultime. In Python, totul este un obiect, inclusiv clasele. Clasele, ca si obiecte, au o clasa cunoscuta sub numele de metaclasa. Este de asemenea suportata mostenirea multipla si amestecurile, precum si introspectii extinse de tipuri si clase. Tipurile pot fi citite si comparate, si sunt instante ale type. Atributele unui obiect pot fi extrase ca si dictionar. Operatorii se pot suprascrie prin definirea unor functii membre speciale. In ceea ce priveste operatorii, exista operatorii de comparatie, cu o semantica de scurt-circuit (evaluarea se opreste la prima evaluare care satisface conditia) si operatori logici (cu o evaluare minima, de exemplu x/y > 100 nu va produce niciodata o exceptie in cazul diviziunii cu zero).

Exista suport pentru programarea functionala, ceea ce face ca limbajul sa fie deosebit de flexibil in multe situatii, spre exemplu pentru implementarea unui algoritm quicksort se foloseste doar constructia: def qsort(L): if L == []: return [] pivot = L[0] return qsort([x for x in L[1:] if x < pivot]) + [pivot] + \ qsort([y for y in L[1:] if y >= pivot]) Functiile sunt obiecte de prima clasa care pot fi create si transmise dinamic. Constructia lambda din Python poate fi folosita pentru crearea de functii anonime in cadrul expresiilor (facilitate deosebit de puternica in limbajele functionale gen LISP). Exista suport pentru inchideri lexicale inca din versiunea 2.2. Introdusi in Python 2.2 ca o caracteristica optionala si finalizati in versiunea 2.3, generatorii sunt mecanismul folosit de limbaj pentru evaluarea "lazy" a unei functii care altfel ar returna o lista de un spatiu mare sau consumatoare de resurse. De exemplu, pentru generarea numerelor prime: from itertools import count def generate_primes(stop_at=None): primes = [] for n in count(2): if stop_at is not None and n > stop_at: return composite = False for p in primes: if not n % p: composite = True break elif p**2 > n: break if not composite: primes.append(n) yield n Pentru folosirea aceste functii, se apeleaza simplu: for i in generate_primes(): # iterate over ALL primes if i > 100: break print i

Definita unui generator este similara cu cea a unei functii, cu exceptia ca se foloseste yield in loc de return. Un generator este un obiect cu o stare persistenta, care poate intra si parasi acelasi scop in mod repetat. Cand bucla for necesita urmatorul element, generatorul este apelat si retine urmatorul element. Introduse in versiunea 2.4, expresiile generatoare sunt echivalentul evaluarii "lazy" a intelegerii listelor. Limbajul suporta de asemenea majoritatea tehnicilor de programare orientata obiect: permite polimorfism, nu doar in interiorul unei clase ci si prin duck typing (valoarea unei variabile in sine determina ce poate face acea variabila, iar un obiect este interschimbabil cu un obiect care implementeaza o aceeasi interfata, fie ca exista o relatie ierarhica intre cele doua obiecte sau nu). Totul este un obiect in Python, fiind suportate si mostenirea, inclusiv mostenirea multipla. In versiunea 2.2 au fost introduse clase de tipul "new-style" (stil nou), in care obiectele sunt unificate, permitand subclasarea tipurilor. Se poate de asemenea rula cod customizabil in timp ce se seteaza (sau se acceseaza) atributele, aceasta facilitate evoluand de-a lungul versiunilor limbajului. Python suporta (si foloseste extensiv) tratarea exceptiilor ca metode de testare a erorilor si alte evenimente deosebite din program. Este de asemenea posibila captarea unei exceptii generata de eroarea de sintaxa. Stilul limbajului face apel la exceptii ori de cate ori o eroare apare (asa, spre exemplu, in locul testarii existentei unui fisier, Python incearca sa il foloseasca direct, generand o exceptie in cazul unei erori). Exceptiile pot fi folosite si ca metode generale de transfer non-local sau control, chiar atunci cand problema nu consta intr-o eroare. Spre exemplu, aplicatia GNU Mailman de mailing foloseste exceptii pentru a iesi dintr-o logica complex indentata a tratarii mesajelor atunci cand s-a luat o decizie pentru a ignora un mesaj sau pentru a-l retine in vederea aprobarii de catre moderator. Exceptiile sunt dese si apar mai ales in firele de executie. Interpretorul standard Python suporta de asemenea un mod interactiv in care se comporta ca un shell: pot fi introduse expresii pe rand, iar rezultatul evaluarii lor este imediat. Este inclus de asemena un framework extensiv pentru testare, ceea ce face limbajul usor de depanat. Exemplu de aplicatie in Python In continuare am inclus pentru download o aplicatie realizata de mine in cadrul unui proiect, aplicatie pentru aproximarea functiilor neliniare cu retele neuronale. Aplicatia este realizata folosind Python 2.4.1 cu pachetele wxPython si NumericPy.

Aplicatia este interactiva, cu o interfata ergonomica si permite vizualizarea procesului de antrenare a retelei neuronale, realizand de asemenea un grafic pentru eroarea estimata de catre program. Exista doua variante ale acestei aplicatii (versiunea 1.3 si versiunea 2.0 sunt ambele disponibile pentru download), cea de a doua foloseste o retea de tip "backpropagation" cu un nivel pentru a incerca sa estimeze o functie de o singura variabila. In figura_1 este prezentata varianta 1.3, cu parametrii complet customizabili si un screenshot preluat in timpul antrenarii retelei neuronale.

Pentru dezvoltare am folosit programarea orientata obiect si facilitatile pe care Python le pune la dispozitia programatorilor in acest sens, precum si doua pachete aditionale pentru realizarea usoara a interfetei grafice, respectiv pentru a efectua anumite calcule de continut. Programul a fost dezvoltat intamplator cu Python, intr-unul din momentele in care incercam sa realizez un proiect ce implicau retelele neuronale, si aveam nevoie de un mediu vizual, ce permite grafice pentru functii (realizate cat mai usor posibil) si cu o dimensiune a codului cat mai mica. Din dorinta de a incerca un limbaj nou, am inceput dezvoltarea in Python, iar dupa cateva zile de citit documentatie, forum-uri si trial and error, am fost foarte placut surprins de rezultat. In acest mod s-a nascut versiunea 1.0 a programului, versiune care apoi a necesitat cateva imbunatatiri minore de forma, continut si aspect, rezultand in cele din urma in prima varianta de folosire, versiunea 1.3.

A urmat in curand versiunea 2.0 (un screenshot il regasiti mai jos), plecand de la codebase-ul existent, versiunea care, desi implementeaza un cu totul alt concept algoritmic decat precedentul, a fost foarte usor de dezvoltat si depanat.

In concluzie, Python este un limbaj cat se poate de actual, fiind folosit pe scara larga de marile motoare de cautare (inclusiv Google), un limbaj care este pe cat de usor de utilizat si de invatat, pe atat de usor de folosit pentru programarea aplicatiilor pe scara larga, a prototipurilor software, precum si a programelor hibrid, compuse din mai multe parti in care liantul informational il constituie unul sau mai multe mecanisme puse la dispozitie de Python.

Comparatie intre Python si alte limbaje

Limbajul Python este un limbaj de nivel foarte inalt, dispunand de un shell pentru depanarea programelor mari precum si de un mecanism de tratare a erorilor superior multor limbaje, spre exemplu limbajului C. Datorita caracterului general al tipurilor de date, Python poate fi aplicat intr-o arie mult mai larga de probleme decat limbaje precum AWK sau Perl. Programele scrise in Python sunt mult mai mici decat cele scrise in C++ (sau alte limbaje orientate obiect), pentru ca tipurile de date de nivel inalt permit realizarea de operatii complexe intr-o singura instructiune, gruparea instructiunilor este data de paragrafare in loc de blocuri de begin/end sau de acolade, si nu este necesara declararea variabilelor. In plus, limbajul este complet extensibil,

interpretorul Python putand de exemplu fi adaugat intr-o aplicatie C si folosit ca limbaj de comanda sau de extensie pentru acea aplicatie. Limbajul are mai putine constructii sintactice decat multe limbaje structurate, precum C, Perl, sau Pascal. Este de asemena un limbaj multi-paradigma, ceea ce inseamna ca in loc sa adopte un singur stil de programare, permite mai multe stiluri: programare functionala, orientata obiect, structurata si orientata-aspect. Alte paradigme pot fi de asemenea suportate prin extensii, precum PyDBC sau Contracts for Python. In figura alaturata este redat un grafic al timpurilor de executie pentru diverse limbaje disponibile astazi. Pentru testare s-a folosit un program (ce produce rezultate identice in toate limbajele) caruia i-a fost masurat timpul de executie.

In ceea ce priveste consumul de memorie, el este prezentat in figura urmatoare, Python (cu consum de 1.2MB) avand un rezultat mai bun decat Perl si Tcl, insa evident limbajele C si C++ conduc (lucru normal considerand ca cele doua limbaje produc cod nativ, pe cand Python spre exemplu este un limbaj interpretat.

Resurse online despre Python sunt disponibile gratuit, una dintre cele mai bune fiind insusi site-ul oficial al limbajului, www.python.org. Sunt de asemenea disponibile carti pe aceasta tema, una dintre ele fiind The History of Python sau Dive Into Python. O sursa valoroasa de informatii o constituie tutorialul Python realizat chiar de autorul limbajului, disponibil aici. Multe exemple, cod sursa comentat si moduri elegante de a rezolva problemele in Python gasiti si in cartea Programming Python, de la O'Reilly (una din favoritele mele). Sa nu uitam insa de Wikipedia, iar pentru cei interesati de performantele limbajelor de programare aici gasiti un studiu din 2003 (resursa folosita si pentru graficele de pe aceasta pagina) foarte util. Daca doriti sa integrati Python in paginile dumneavoastra Web, gasiti in Spyce un ajutor de incredere. Documentatia oficiala a limbajului este disponibila pe site-ul oficial.

S-ar putea să vă placă și