Randament în Python Tutorial: Generator & Exemplu de randament vs returnare

Cuprins:

Anonim

Ce este randamentul Python?

Cuvântul cheie randament în python funcționează ca o returnare cu singurul

diferența este că, în loc să returneze o valoare, acesta redă apelantului un obiect generator.

Când se apelează o funcție și firul de execuție găsește un cuvânt cheie randament în funcție, execuția funcției se oprește la linia respectivă și returnează un obiect generator înapoi către apelant.

În acest tutorial Python, veți învăța:

  • Ce este randamentul Python?
  • Sintaxă
  • Ce sunt generatoarele din Python?
  • Diferența dintre funcția Normal v / s Funcția Generator.
  • Cum se citesc valorile de la generator?
  • Generatoarele sunt utilizate o singură dată
  • Exemplu: Generatoare și randament pentru seria Fibonacci
  • Exemplu: Funcție de apelare cu randament
  • Când se folosește Yield în loc de Return în Python
  • Randament vs. Întoarcere

Sintaxă

yield expression

Descriere

Randamentul Python returnează un obiect generator. Generatoarele sunt funcții speciale care trebuie repetate pentru a obține valorile.

Cuvântul cheie randament convertește expresia dată într-o funcție generator care redă un obiect generator. Pentru a obține valorile obiectului, trebuie iterat să se citească valorile date randamentului.

Exemplu: Metoda de randament

Iată un exemplu simplu de randament. Funcția testyield () are un cuvânt cheie randament cu șirul „Bine ați venit la Guru99 Python Tutorials”. Când funcția este apelată, ieșirea este tipărită și dă un obiect generator în loc de valoarea reală.

def testyield():yield "Welcome to Guru99 Python Tutorials"output = testyield()print(output)

Ieșire:

Ieșirea dată este un obiect generator, care are valoarea pe care am dat-o pentru a produce.

Dar nu primim mesajul pe care trebuie să-l dăm pentru a produce randament!

Pentru a imprima mesajul dat la randament va trebui să iterați obiectul generator așa cum se arată în exemplul de mai jos:

def testyield():yield "Welcome to Guru99 Python Tutorials"output = testyield()for i in output:print(i)

Ieșire

Welcome to Guru99 Python Tutorials

Ce sunt generatoarele din Python?

Generatoarele sunt funcții care returnează un obiect generator iterabil. Valorile din obiectul generator sunt preluate pe rând în loc de lista completă împreună și, prin urmare, pentru a obține valorile reale, puteți utiliza o buclă for, utilizând metoda next () sau list ().

Folosind funcția Generator

Puteți crea generatoare folosind funcția generator și folosind expresia generatorului.

O funcție generator este ca o funcție normală, în loc să aibă o valoare returnată va avea un cuvânt cheie randament.

Pentru a crea o funcție generator va trebui să adăugați un cuvânt cheie randament. Următoarele exemple arată cum să creați o funcție generator.

def generator():yield "H"yield "E"yield "L"yield "L"yield "O"test = generator()for i in test:print(i)

Ieșire:

HELLO

Diferența dintre funcția Normal v / s Funcția Generator.

Să înțelegem cum o funcție generator este diferită de o funcție normală.

Există 2 funcții normal_test () și generator_test ().

Ambele funcții ar trebui să returneze șirul „Hello World”. Normal_test () folosește return și generator_test () folosește randament.

# Normal functiondef normal_test():return "Hello World"#Generator functiondef generator_test():yield "Hello World"print(normal_test()) #call to normal functionprint(generator_test()) # call to generator function

Ieșire:

Hello World

Ieșirea arată că atunci când apelați funcția normală normal_test () returnează șirul Hello World. Pentru o funcție generator cu cuvânt cheie randament returnează și nu șirul.

Aceasta este principala diferență între o funcție generator și o funcție normală. Acum, pentru a obține valoarea de la obiectul generator, trebuie fie să folosim obiectul din interior pentru buclă, fie să folosim metoda next () sau să folosim list ().

print(next(generator_test())) # will output Hello World

Încă o diferență de adăugat la funcția normală funcția generator v / s este că atunci când apelați o funcție normală, execuția va începe și se va opri când va reveni și valoarea va fi returnată apelantului. Deci, când începe execuția, nu puteți opri funcția normală între ele și se va opri numai atunci când se întâlnește cuvânt cheie return.

Dar în cazul funcției generatorului odată ce începe execuția când obține primul randament, oprește execuția și redă obiectul generator. Puteți utiliza obiectul generator pentru a obține valorile și, de asemenea, întrerupeți și reluați înapoi conform cerințelor dvs.

Cum se citesc valorile de la generator?

Puteți citi valorile dintr-un obiect generator folosind o listă (), pentru buclă și folosind metoda next ().

Folosind: list ()

O listă este un obiect iterabil care are elementele sale între paranteze. Utilizarea listei () pe un obiect generator va da toate valorile pe care generatorul le deține.

def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)print(list(num))

Ieșire:

[0, 2, 4, 6, 8]

Folosind: for-in

În exemplu, există o funcție definită even_numbers () care vă va oferi toate numerele pare pentru n definite. Apelul la funcția even_numbers () va returna un obiect generator, care este folosit în interiorul for-loop.

Exemplu:

def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)for i in num:print(i)

Ieșire:

02468

Folosind next ()

Metoda next () vă va oferi următorul element din listă, matrice sau obiect. Odată ce lista este goală și dacă este apelat next (), va reda o eroare cu semnalul stopIteration. Această eroare, din next () indică faptul că nu mai sunt articole în listă.

def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)print(next(num))print(next(num))print(next(num))print(next(num))print(next(num))print(next(num))

Ieșire:

02468Traceback (most recent call last):File "main.py", line 11, in print(next(num))StopIteration

Generatoarele sunt utilizate o singură dată

În caz de generatoare, acestea sunt disponibile pentru utilizare o singură dată. Dacă încercați să le utilizați din nou, acesta va fi gol.

De exemplu:

def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)for i in num:print(i)print("\n")print("Calling the generator again: ", list(num))

Ieșire:

02468Calling the generator again: []

În cazul în care doriți ca ieșirea să fie utilizată din nou, va trebui să efectuați apelul pentru a funcționa din nou.

Exemplu: Generatoare și randament pentru seria Fibonacci

Următorul exemplu arată cum să utilizați generatoare și să obțineți randament în Python. Exemplul va genera seria Fibonacci.

def getFibonnaciSeries(num):c1, c2 = 0, 1count = 0while count < num:yield c1c3 = c1 + c2c1 = c2c2 = c3count += 1fin = getFibonnaciSeries(7)print(fin)for i in fin:print(i)

Ieșire:

0112358

Exemplu: Funcție de apelare cu randament

În acest exemplu, veți vedea cum să apelați o funcție cu randament.

Exemplul de mai jos are o funcție numită test () care returnează pătratul numărului dat. Există o altă funcție numită getSquare () care folosește test () cu cuvânt cheie randament. Ieșirea dă valoarea pătrată pentru intervalul de numere dat.

def test(n):return n*ndef getSquare(n):for i in range(n):yield test(i)sq = getSquare(10)for i in sq:print(i)

Ieșire:

0149162536496481

Când se folosește Yield în loc de Return în Python

Cuvântul cheie Python3 Yield returnează un generator apelantului și executarea codului începe numai atunci când generatorul este iterat.

O revenire într-o funcție este sfârșitul executării funcției și o singură valoare este redată apelantului.

Iată situația în care ar trebui să utilizați Yield în loc de Return

  • Utilizați randamentul în loc de returnare atunci când dimensiunea datelor este mare
  • Randamentul este cea mai bună alegere atunci când aveți nevoie ca executarea dvs. să fie mai rapidă pe seturi de date mari
  • Utilizați randamentul atunci când doriți să returnați un set mare de valori funcției de apelare
  • Randamentul este un mod eficient de a produce date mari sau infinite.

Randament vs. Întoarcere

Iată diferențele dintre randament și rentabilitate

Randament Întoarcere
Yield returnează un obiect generator către apelant, iar executarea codului începe numai atunci când generatorul este iterat. O revenire într-o funcție este sfârșitul executării funcției și o singură valoare este redată apelantului.
Când funcția este apelată și întâlnește cuvântul cheie randament, executarea funcției se oprește. Întoarce obiectul generator înapoi către apelant. Executarea funcției va începe numai când se execută obiectul generator. Când funcția este apelată, începe executarea și valoarea este redată apelantului dacă există un cuvânt cheie returnat. Revenirea în interiorul funcției marchează sfârșitul executării funcției.
exprimare de randament expresie de întoarcere
Nu se folosește memorie când se folosește cuvântul cheie randament. Memoria este alocată pentru valoarea returnată.
Foarte util dacă trebuie să vă confruntați cu o dimensiune imensă a datelor, deoarece memoria nu este utilizată. Convenabil pentru dimensiuni foarte mici ale datelor.
Performanța este mai bună dacă cuvântul cheie randament este utilizat pentru dimensiuni mari de date. O mulțime de memorie este utilizată dacă dimensiunea datelor este imensă, ceea ce va împiedica performanța.
Timpul de execuție este mai rapid în cazul randamentului pentru dimensiuni mari de date. Timpul de execuție utilizat este mai mare, deoarece se efectuează o prelucrare suplimentară în cazul în care, dacă dimensiunea datelor dvs. este imensă, va funcționa bine pentru dimensiuni mici ale datelor.

Rezumat:

  • Cuvântul cheie randament în python funcționează ca o întoarcere cu singura diferență este că, în loc să returneze o valoare, redă apelantului o funcție generator.
  • Un generator este un tip special de iterator care, odată utilizat, nu va mai fi disponibil din nou. Valorile nu sunt stocate în memorie și sunt disponibile numai la apelare.
  • Valorile din generator pot fi citite folosind metoda for-in, list () și next ().
  • Principala diferență între randament și returnare este că randamentul returnează o funcție generator către apelant și returnează oferă o singură valoare apelantului.
  • Randamentul nu stochează niciuna dintre valori în memorie și avantajul este că este util atunci când dimensiunea datelor este mare, deoarece niciuna dintre valori nu este stocată în memorie.
  • Performanța este mai bună dacă cuvântul cheie randament este utilizat în comparație pentru a reveni la dimensiuni mari de date.