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