Facilitatile limbajului Python (2/4)

<< Pagina precedenta

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.

Continuare >>

Generalitati despre limbaj si istoricul lui
Facilitatile pe care le ofera limbajul Python
Comparatie intre Python si alte limbaje

Pagina dedicata tehnologiei Python va prezinta modurile de folosinta ale acestui limbaj si incearca sa va introduca pas cu pas in modul de organizare a limbajului, structurile sale de control si cateva trucuri care pot fi folosite pentru dezvoltarea aplicatiilor. Detalii...

Aflati detalii despre istoricul limbajului Python, creatorii lui, versiunile existente in momentul de fata, cat de puternic este si pentru ce anume este recomandat, toate in pagina de continut. Detalii...

Spre final, vom compara tehnologia Python cu alte tehnologii similare, vom incerca sa evidentiem punctele forte si punctele slabe ale acesteia, si vom oferi cateva resurse online pentru cei care doresc sa inceapa sa programeze in Python, sau sa isi imbunatateasca cunostintele in acest domeniu. Detalii...