Što je prinos Pythona?
Ključna riječ yield u pythonu djeluje kao return s jedinicom
razlika je u tome što umjesto vraćanja vrijednosti pozivatelju vraća objekt generacije.
Kada se funkcija pozove i nit izvršenja pronađe ključnu riječ yield u funkciji, izvršavanje funkcije zaustavlja se na toj samoj liniji i vraća objekt generatora natrag pozivatelju.
U ovom vodiču za Python naučit ćete:
- Što je prinos Pythona?
- Sintaksa
- Što su generatori u Pythonu?
- Razlika između normalne funkcije v / s funkcije generatora.
- Kako očitati vrijednosti iz generatora?
- Generatori se koriste jednokratno
- Primjer: Generatori i prinos za Fibonaccijevu seriju
- Primjer: Pozivanje funkcije s prinosom
- Kada koristiti Yield umjesto Return u Pythonu
- Prinos nasuprot povratku
Sintaksa
yield expression
Opis
Python yield vraća objekt generatora. Generatori su posebne funkcije koje se moraju iterirati da bi se dobile vrijednosti.
Ključna riječ yield pretvara izraz dani u funkciju generatora koja vraća objekt generatora. Da bi se dobile vrijednosti objekta, mora se ponoviti kako bi se očitale vrijednosti dane prinosu.
Primjer: Metoda prinosa
Evo jednostavnog primjera prinosa. Funkcija testyield () ima ključnu riječ yield sa nizom "Dobrodošli u Guru99 Python Tutorials". Kada se funkcija pozove, ispis se ispisuje i daje objekt generatora umjesto stvarne vrijednosti.
def testyield():yield "Welcome to Guru99 Python Tutorials"output = testyield()print(output)
Izlaz:
Izlaz je generatorski objekt koji ima vrijednost koju smo dali da daje.
Ali mi ne dobivamo poruku koju smo trebali dati da bismo urodili plodom!
Da bi se ispisala poruka dana yield moraće se ponoviti objekt generatora kao što je prikazano u donjem primjeru:
def testyield():yield "Welcome to Guru99 Python Tutorials"output = testyield()for i in output:print(i)
Izlaz
Welcome to Guru99 Python Tutorials
Što su generatori u Pythonu?
Generatori su funkcije koje vraćaju iterabilni objekt generatora. Vrijednosti iz objekta generatora dohvaćaju se jedna po jedna umjesto cijelog popisa zajedno, a time i za dobivanje stvarnih vrijednosti možete koristiti for-loop pomoću metode next () ili list ().
Korištenje funkcije Generator
Generatore možete stvoriti pomoću funkcije generatora i pomoću izraza generatora.
Generatorska funkcija je poput normalne funkcije, umjesto povratne vrijednosti imat će ključnu riječ yield.
Da biste stvorili funkciju generatora, morat ćete dodati ključnu riječ yield. Sljedeći primjeri pokazuju kako stvoriti funkciju generatora.
def generator():yield "H"yield "E"yield "L"yield "L"yield "O"test = generator()for i in test:print(i)
Izlaz:
HELLO
Razlika između normalne funkcije v / s funkcije generatora.
Shvatimo kako se funkcija generatora razlikuje od normalne funkcije.
Postoje 2 funkcije normal_test () i generator_test ().
Obje funkcije trebaju vratiti niz "Hello World". Normalni test () koristi return, a generator_test () koristi yield.
# 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
Izlaz:
Hello World
Izlaz pokazuje da kada pozovete normalnu funkciju normal_test (), ona vraća niz Hello World. Za funkciju generatora s ključnom riječi yield vraća
To je glavna razlika između funkcije generatora i normalne funkcije. Sada da bismo dobili vrijednost iz objekta generatora, trebamo ili koristiti objekt unutar for petlje ili koristiti metodu next () ili koristiti list ().
print(next(generator_test())) # will output Hello World
Još jedna razlika koju treba dodati normalnoj funkciji v / s funkcija generatora je ta da kada pozovete normalnu funkciju izvršenje će započeti i zaustaviti se kad se vrati i vrijednost se vrati pozivaču. Dakle, kada započinje izvršavanje, ne možete zaustaviti normalnu funkciju između njih i ona će se zaustaviti samo kada dođe do ključne riječi return.
Ali u slučaju funkcije generatora, kada izvršavanje započne kad dobije prvi prinos, zaustavlja se izvršavanje i vraća objekt generatora. Objekt generatora možete koristiti za dobivanje vrijednosti, a također i pauzu i nastavak prema vašem zahtjevu.
Kako očitati vrijednosti iz generatora?
Vrijednosti iz objekta generatora možete pročitati pomoću liste (), for-loop i pomoću metode next ().
Korištenje: list ()
Popis je iterabilni objekt koji ima svoje elemente unutar zagrada. Korištenje liste () na objektu generatora dat će sve vrijednosti koje generator sadrži.
def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)print(list(num))
Izlaz:
[0, 2, 4, 6, 8]
Korištenje: za-u
U primjeru postoji funkcija definirana parni_brojevi () koja će vam dati sve parne brojeve za definirano n. Poziv funkcije even_numbers () vratit će generator objekt koji se koristi unutar for-loop.
Primjer:
def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)for i in num:print(i)
Izlaz:
02468
Korištenje next ()
Sljedeća () metoda dat će vam sljedeću stavku na popisu, nizu ili objektu. Jednom kada je popis prazan i ako se pozove next (), vratit će se pogreška sa signalom stopIteration. Ova pogreška od next () znači da na popisu više nema stavki.
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))
Izlaz:
02468Traceback (most recent call last):File "main.py", line 11, inprint(next(num))StopIteration
Generatori se koriste jednokratno
U slučaju generatora dostupni su za upotrebu samo jednom. Ako ih ponovno pokušate koristiti, bit će prazni.
Na primjer:
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))
Izlaz:
02468Calling the generator again: []
U slučaju da želite da se izlaz ponovno koristi, morat ćete ponovno uputiti poziv za funkcioniranje.
Primjer: Generatori i prinos za Fibonaccijevu seriju
Sljedeći primjer pokazuje kako koristiti generatore i yield u Pythonu. Primjer će generirati Fibonaccijevu seriju.
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)
Izlaz:
0112358
Primjer: Pozivanje funkcije s prinosom
U ovom primjeru vidjet ćemo kako pozvati funkciju s yield.
Sljedeći primjer ima funkciju koja se naziva test () koja vraća kvadrat zadanog broja. Postoji još jedna funkcija koja se naziva getSquare () koja koristi test () s ključnom riječi yield. Izlaz daje kvadratnu vrijednost za zadani brojčani raspon.
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)
Izlaz:
0149162536496481
Kada koristiti Yield umjesto Return u Pythonu
Ključna riječ Python3 Yield vraća generator pozivatelju i izvršenje koda započinje tek kad je generator ponovljen.
Povratak u funkciji je kraj izvršavanja funkcija, a jedna vrijednost vraća pozivatelju.
Evo situacije u kojoj biste trebali koristiti Yield umjesto Return
- Koristite yield umjesto povrata kada je veličina podataka velika
- Prinos je najbolji izbor kada vam je potrebno da vaše izvršavanje bude brže na velikim skupovima podataka
- Koristite yield kada želite pozvati funkciju vratiti veliki skup vrijednosti
- Prinos je učinkovit način stvaranja podataka koji su veliki ili beskonačni.
Prinos nasuprot povratku
Evo razlika između prinosa i povrata
Prinos | Povratak |
Yield vraća objekt generatora pozivatelju, a izvršavanje koda započinje tek kad se generator ponavlja. | Povratak u funkciji kraj je izvršavanja funkcije, a pojedinačna vrijednost vraća se pozivatelju. |
Kada se funkcija pozove i naiđe na ključnu riječ yield, izvršavanje funkcije se zaustavlja. Vraća objekt generatora natrag pozivatelju. Izvršenje funkcije započet će tek kad se izvrši objekt generatora. | Kada se funkcija pozove, izvršavanje započinje i vrijednost se vraća pozivatelju ako postoji ključna riječ return. Povratak unutar funkcije označava kraj izvršenja funkcije. |
izraz prinosa | povratni izraz |
Ne koristi se memorija kada se koristi ključna riječ yield. | Memorija se dodjeljuje za vraćenu vrijednost. |
Vrlo korisno ako imate posla s velikom veličinom podataka jer se memorija ne koristi. | Prikladno za vrlo malu veličinu podataka. |
Izvedba je bolja ako se ključna riječ yield koristi za velike podatke. | Puno se memorije koristi ako je veličina podataka velika što će otežati izvedbu. |
Vrijeme izvršavanja je brže u slučaju prinosa za veliku veličinu podataka. | Korišteno je vrijeme izvršenja jer se vrši dodatna obrada u slučaju da ako je veličina podataka velika, dobro će raditi za male veličine podataka. |
Sažetak:
- Ključna riječ yield u pythonu djeluje kao povrat s jedinom razlikom u tome što umjesto vraćanja vrijednosti pozivatelju vraća funkciju generatora.
- Generator je posebna vrsta iteratora koji, nakon što se upotrijebi, više neće biti dostupan. Vrijednosti se ne pohranjuju u memoriju i dostupne su samo kada ih se pozove.
- Vrijednosti iz generatora mogu se pročitati metodom for-in, list () i next ().
- Glavna razlika između prinosa i povrata je u tome što prinos pozivatelju vraća funkciju generatora, a povrat pozivatelju daje jednu vrijednost.
- Prinos ne pohranjuje niti jednu vrijednost u memoriju, a prednost je u tome što je korisno kada je veličina podataka velika, jer niti jedna od vrijednosti nije pohranjena u memoriji.
- Izvedba je bolja ako se ključna riječ yield koristi u usporedbi s povratkom za veliku veličinu podataka.