28.01.2015 Views

Tutorial Python - Starship

Tutorial Python - Starship

Tutorial Python - Starship

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

9.10 Generatori<br />

Generatorii sunt instrumente simple şi puternice pentru crearea iteratorilor. Generatorii se scriu ca şi functiile<br />

obişnuite, dar se utilizează instrucţiunea yield când se doreşte o returnare de date. De fiecare dată se apelează<br />

next(), generatorul reluând din locul de întrerupere ( el memorează toate valorile datelor şi ce instrucţiune a<br />

fost executată ultima). Exemplul următor prezintă cât de simplu se poate crea un generator :<br />

def reverse(data):<br />

for index in range(len(data)-1, -1, -1):<br />

yield data[index]<br />

>>> for char in reverse(’golf’):<br />

... print char<br />

...<br />

f<br />

l<br />

o<br />

g<br />

Tot ce se poate face cu generatori se poate face şi cu clase bazate pe iteratori, descrise în secţiunea anterioară.Ce<br />

face ca generatorul să fie mai compact este faptul că metodele __iter()__ şi next() sunt create automat.<br />

O altă caracteristică importantă este aceea că între apeluri sunt salvate variabilele locale şi starea execuţiei.Acest<br />

lucru face funcţia mai uşor de scris si mai clară decât abordarea cu variabile de clasă precum self.index şi<br />

self.data.<br />

În plus, la salvarea automată a variabilelor şi a stării programului, când generatorul îşi încheie lucrul, setează<br />

automat StopIteration.Toate aceste caracteristici dau posibilitatea de a scrie iteratori la fel de uşor ca şi o<br />

funcţie obişnuită.<br />

9.11 Expresii generator<br />

Unii generatori simpli se pot scrie succint ca expresii folosind o sintaxă similară cu cea a creării listelor obişnuite,<br />

dar cu paranteze în locul acoladelor.Aceste expresii sunt create pentru situaţiile in care generatorii sunt ceruţi ca<br />

atare în corpul unei unei funcţii.Expresiile generator sunt mult mai compacte, dar şi mult mai puţin cuprinzătoare<br />

decât definirea completă a generatorilor şi tind să fie mai uşor de memorat decât datele de tip listă. De exemplu :<br />

>>> sum(i*i for i in range(10)) # suma de patrate<br />

285<br />

>>> xvec = [10, 20, 30]<br />

>>> yvec = [7, 5, 3]<br />

>>> sum(x*y for x,y in zip(xvec, yvec))<br />

260<br />

>>> from math import pi, sin<br />

>>> sine_table = dict((x, sin(x*pi/180)) for x in range(0, 91))<br />

>>> unique_words = set(word for line in page for word in line.split())<br />

>>> valedictorian = max((student.gpa, student.name) for student in graduates)<br />

>>> data = ’golf’<br />

>>> list(data[i] for i in range(len(data)-1,-1,-1))<br />

[’f’, ’l’, ’o’, ’g’]<br />

9.10. Generatori 67

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!