Aflați cum acest tip alternativ de funcție vă poate ajuta să reduceți amprenta memoriei.
Dacă citiți rânduri dintr-un fișier jurnal sau procesați o listă lungă de articole, o opțiune este să încărcați toate datele în memorie. Cu toate acestea, această abordare poate folosi multă memorie și poate împiedica performanța. Generatoarele oferă o soluție valoroasă.
Generatoarele elimină nevoia de a încărca toate datele în memorie simultan. Sunt utile atunci când se manipulează seturi mari de date, secvențe infinite sau orice scenariu în care eficiența memoriei este primordială.
Ce sunt generatoarele?
Un generator este o funcție specială care vă permite să repetați o secvență de valori. În loc să returneze un set complet de date, ele generează – sau produc – câte o valoare. Acest lucru le face eficiente pentru lucrul cu secvențe mari sau nelimitate de date.
A funcția obișnuită Python de obicei calculează o valoare și o returnează. Dar generatoarele funcționează diferit. Ele pot genera mai multe valori în timp, întrerupând și reluând execuția între fiecare randament.
Distincția cheie între funcțiile obișnuite și generatoare este aceea că, în loc de a utiliza întoarcere cuvânt cheie pentru a produce un rezultat, îl folosesc generatorii Randament.
Cum se creează un generator
Pentru a crea un generator, în loc de întoarcere declarație, folosiți a Randament declarație în cadrul funcției. The Randament cuvântul cheie nu numai că instruiește funcția să returneze o valoare, dar îi permite și să-și salveze starea, permițând reluarea în viitor.
Iată un exemplu de funcție generatoare simplă:
defnumeric_generator():
yield1
yield2
yield3
gen = numeric_generator()
Această funcție de generator generează valori numerice de la 1 la 3.
The Randament instrucțiunea salvează starea funcției, păstrând variabilele locale între apeluri, pentru a relua atunci când solicitați următoarea valoare.
Atribuirea unei funcții de generator unei variabile creează un obiect generator cu care puteți lucra.
Lucrul cu generatoarele
Generatoarele au mai multe aplicații. Le poți folosi în bucle pentru sau în cadrul listelor de înțelegere, precum și alte structuri iterabile. Generatoarele pot servi și ca argumente pentru funcții.
Odată ce ați creat un generator, puteți repeta peste el folosind o buclă for:
for i in numeric_generator():
print(i)
De asemenea, puteți utiliza Următorul funcția de a prelua valorile una câte una:
print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3
Acest lucru vă oferă mai mult control asupra obiectului generator.
Generatorii pot urmări starea lor. Fiecare declarație de randament dintr-o funcție acționează ca un punct de control. Când suni la Următorul() funcția pe obiectul generator, execuția începe de la punctul de curgere anterior.
De asemenea, puteți trece valori într-un generator folosind trimite():
defgenerator_with_send():
# First yield: Receive a value
x = yield
print(f"Received: {x}")# Second yield: Receive another value
y = yield
print(f"Received: {y}")# Third yield: Yield the sum
yield x + ygen = generator_with_send()
# Start generator and reach first yield
next(gen)# Send 10 into generator, received at first yield
result = gen.send(10)# Send 5 into generator, received at second yield
result = gen.send(5)
# Print result of third yield
print(result)
The trimite() metoda vă permite să preluați valori din generator și să trimiteți valori înapoi în funcția generator, întrerupând-o efectiv și permițându-vă să controlați execuția acesteia. The trimite() metoda este la îndemână atunci când scrieți corutine sau folosiți generatoare în scopuri avansate.
Utilizarea expresiilor generatoare
Expresiile generatoare oferă o modalitate concisă de a crea un generator simplu și anonim. Sunt similare listelor de înțelegere, dar folosesc paranteze în loc de paranteze.
Iată un exemplu:
gen = (i**2for i in range(10))
for x in gen:
print(x)
Codul creează o expresie generatoare care dă pătratele numerelor de la 0 la 9. Expresiile generatoare sunt ideale pentru a genera leneș o secvență de valori.
Utilizarea generatoarelor pentru prelucrarea datelor
Generatoarele Python sunt o modalitate convenabilă de a descrie fluxurile de date și de a construi iteratoare fără a păstra totul în memorie. Vă puteți îmbunătăți semnificativ programarea învățând să utilizați generatoare, făcând mai ușor să gestionați sarcinile dificile de procesare a datelor.
Data viitoare când lucrați cu seturi mari de date, țineți cont de generatori și delegați-le sarcinile care necesită multă muncă, astfel încât codul dvs. să rămână receptiv și eficient.