|
© 2006 Ciprian Pungila Toate drepturile rezervate.
| |
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
|
|
|