Kas ir Python ienesīgums?
Ienesīguma atslēgvārds pitonā darbojas kā atdeve ar vienīgo
atšķirība ir tā, ka tā vietā, lai atgrieztu vērtību, tā zvanītājam atdod ģeneratora objektu.
Kad funkcija tiek izsaukta un izpildes pavediens funkcijā atrod ienesīguma atslēgvārdu, funkcijas izpilde apstājas pie šīs līnijas un tā atgriež ģeneratora objektu zvanītājam.
Šajā Python apmācībā jūs uzzināsiet:
- Kas ir Python ienesīgums?
- Sintakse
- Kas ir ģeneratori Python?
- Atšķirība starp parasto funkciju v / s ģeneratora funkciju.
- Kā nolasīt vērtības no ģeneratora?
- Ģeneratori ir vienreizēji
- Piemērs: ģeneratori un raža Fibonači sērijai
- Piemērs: Zvanīšanas funkcija ar ienesīgumu
- Kad Python lietot Return, nevis Return
- Ienesīgums pret atdevi
Sintakse
yield expression
Apraksts
Python ienesīgums atgriež ģeneratora objektu. Ģeneratori ir īpašas funkcijas, kuras jāpārkārto, lai iegūtu vērtības.
Ienesīguma atslēgvārds pārveido izteikto izteiksmi ģeneratora funkcijā, kas atdod ģeneratora objektu. Lai iegūtu objekta vērtības, tas ir jāatkārto, lai nolasītu vērtības, kas piešķirtas ražai.
Piemērs: ienesīguma metode
Šeit ir vienkāršs ienesīguma piemērs. Funkcijai testyield () ir ienesīguma atslēgvārds ar virkni “Welcome to Guru99 Python Tutorials”. Kad funkcija tiek izsaukta, izeja tiek izdrukāta, un faktiskās vērtības vietā tā dod ģeneratora objektu.
def testyield():yield "Welcome to Guru99 Python Tutorials"output = testyield()print(output)
Izeja:
Dotā izeja ir ģeneratora objekts, kura vērtību mēs esam devuši, lai iegūtu.
Bet mēs nesaņemam ziņojumu, kas mums jādod, lai iegūtu produkciju!
Lai izdrukātu ziņojumu, kas tiek dots, būs atkārtot ģeneratora objektu, kā parādīts zemāk esošajā piemērā:
def testyield():yield "Welcome to Guru99 Python Tutorials"output = testyield()for i in output:print(i)
Rezultāts
Welcome to Guru99 Python Tutorials
Kas ir ģeneratori Python?
Ģeneratori ir funkcijas, kas atgriež iterējamu ģeneratora objektu. Vērtības no ģeneratora objekta tiek paņemtas pa vienam, nevis pilns saraksts kopā, tādējādi iegūstot faktiskās vērtības, kuras varat izmantot for-loop, izmantojot metodi next () vai list ().
Izmantojot ģeneratora funkciju
Jūs varat izveidot ģeneratorus, izmantojot ģeneratora funkciju un izmantojot ģeneratora izteiksmi.
Ģeneratora funkcija ir kā normāla funkcija, tā vietā, lai būtu atgriešanās vērtība, tai būs ienesīguma atslēgvārds.
Lai izveidotu ģeneratora funkciju, jums būs jāpievieno ienesīguma atslēgvārds. Šie piemēri parāda, kā izveidot ģeneratora funkciju.
def generator():yield "H"yield "E"yield "L"yield "L"yield "O"test = generator()for i in test:print(i)
Izeja:
HELLO
Atšķirība starp parasto funkciju v / s ģeneratora funkciju.
Ļaujiet mums saprast, kā ģeneratora funkcija atšķiras no parastās funkcijas.
Ir 2 funkcijas: normal_test () un generator_test ().
Abas funkcijas ir domātas, lai atgrieztu virkni "Hello World". Normālais_tests () izmanto atdevi, bet ģenerators_tests () - ienesīgumu.
# 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
Izeja:
Hello World
Rezultāts parāda, ka, izsaucot normālo funkciju normal_test (), tā atgriež virkni Hello World. Ģeneratora funkcijai ar ienesīguma atslēgvārdu tā atgriež <ģeneratora objekta ģeneratora_tests pie 0x0000001212F2F5BA20>, nevis virkni.
Šī ir galvenā atšķirība starp ģeneratora funkciju un normālu funkciju. Tagad, lai iegūtu vērtību no ģeneratora objekta, mums ir vai nu jāizmanto objekts iekšpusē ciklam, vai arī jāizmanto next () metode vai jāizmanto saraksts ().
print(next(generator_test())) # will output Hello World
Vēl viena atšķirība, kas jāpievieno normālai funkcijai v / s ģeneratora funkcija, ir tāda, ka, izsaucot normālu funkciju, izpilde sāksies un apstāsies, kad tā atgriezīsies, un vērtība tiks atgriezta zvanītājam. Tātad, kad sākas izpilde, jūs nevarat pārtraukt parasto funkciju starplaikā, un tā tiks pārtraukta tikai tad, kad tā atradīs atgriešanās atslēgvārdu.
Bet ģeneratora funkcijas gadījumā, kad izpilde sākas, kad tā iegūst pirmo ienesīgumu, tā pārtrauc izpildi un atdod ģeneratora objektu. Varat izmantot ģeneratora objektu, lai iegūtu vērtības, kā arī apturēt un atsākt darbību atbilstoši jūsu prasībām.
Kā nolasīt vērtības no ģeneratora?
Vērtības no ģeneratora objekta var nolasīt, izmantojot sarakstu (), for-loop un metodi next ().
Izmantojot: saraksts ()
Saraksts ir iterējams objekts, kura elementi ir iekavās. Izmantojot ģeneratora objekta sarakstu (), tiks iegūtas visas ģeneratora turētās vērtības.
def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)print(list(num))
Izeja:
[0, 2, 4, 6, 8]
Izmantojot: for-in
Šajā piemērā ir funkcija, kas definēta pāra_numuri (), kas jums sniegs visus definētos n pāra skaitļus. Izsaucot funkciju even_numbers (), tiks atgriezts ģeneratora objekts, kas tiek izmantots for-loop.
Piemērs:
def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)for i in num:print(i)
Izeja:
02468
Izmantojot nākamo ()
Nākamā () metode dos jums nākamo vienumu sarakstā, masīvā vai objektā. Kad saraksts ir tukšs un, ja tiek izsaukts next (), tas atgriezīs kļūdu ar stopIteration signālu. Šī kļūda no nākamā () norāda, ka sarakstā vairs nav neviena vienuma.
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))
Izeja:
02468Traceback (most recent call last):File "main.py", line 11, inprint(next(num))StopIteration
Ģeneratori ir vienreizēji
Tie ir pieejami tikai vienu reizi. Ja mēģināsiet tos izmantot vēlreiz, tas būs tukšs.
Piemēram:
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))
Izeja:
02468Calling the generator again: []
Gadījumā, ja vēlaties, lai izvadi izmantotu vēlreiz, jums būs jāveic zvans, lai tas atkal darbotos.
Piemērs: ģeneratori un raža Fibonači sērijai
Šis piemērs parāda, kā izmantot ģeneratorus un ienesīgumu Python. Piemērs ģenerēs Fibonači sēriju.
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)
Izeja:
0112358
Piemērs: Zvanīšanas funkcija ar ienesīgumu
Šajā piemērā būs redzams, kā izsaukt funkciju ar ienesīgumu.
Šajā piemērā ir funkcija, ko sauc par test (), kas atgriež norādītā skaitļa kvadrātu. Ir vēl viena funkcija, saukta getSquare (), kas izmanto testu () ar ienesīguma atslēgvārdu. Rezultāts norāda kvadrāta vērtību dotajam skaitļu diapazonam.
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)
Izeja:
0149162536496481
Kad Python lietot Return, nevis Return
Atslēgvārds Python3 Yield atgriež zvanītājam ģeneratoru, un koda izpilde sākas tikai tad, kad ģenerators ir atkārtots.
Atgriešanās kādā funkcija ir beigas funkciju izpildi, un viena vērtība tiek dota atpakaļ zvanītājam.
Šeit ir situācija, kad Return vietā jāizmanto Yield
- Izmantojiet ienesīgumu, nevis atdevi, ja datu lielums ir liels
- Ienesīgums ir labākā izvēle, ja jums nepieciešama ātrāka izpilde lielās datu kopās
- Izmantojiet ienesīgumu, ja vēlaties atgriezt lielu vērtību kopu izsaukšanas funkcijai
- Ienesīgums ir efektīvs lielo vai bezgalīgo datu iegūšanas veids.
Ienesīgums pret atdevi
Šeit ir atšķirības starp ienesīgumu un atdevi
Ienesīgums | Atgriezties |
Ienesīgums atgriež zvanītājam ģeneratora objektu, un koda izpilde sākas tikai tad, kad ģenerators ir atkārtots. | Funkcijas atgriešanās ir funkcijas izpildes beigas, un zvanītājam tiek atdota viena vērtība. |
Kad funkcija tiek izsaukta un tā sastopas ar ienesīguma atslēgvārdu, funkcijas izpilde tiek pārtraukta. Tas atgriež ģeneratora objektu zvanītājam. Funkcijas izpilde tiks sākta tikai tad, kad tiks izpildīts ģeneratora objekts. | Izsaucot funkciju, izpilde sākas un vērtība tiek atgriezta zvanītājam, ja ir atgriešanās atslēgvārds. Atgriešanās funkcijas iekšpusē iezīmē funkcijas izpildes beigas. |
ražas izteiksme | atgriešanās izteiksme |
Ja tiek izmantots ienesīguma atslēgvārds, atmiņa netiek izmantota. | Atmiņa tiek piešķirta atgrieztajai vērtībai. |
Ļoti noderīgi, ja jums jātiek galā ar milzīgu datu apjomu, jo atmiņa netiek izmantota. | Ērts ļoti mazam datu lielumam. |
Veiktspēja ir labāka, ja peļņas atslēgvārds tiek izmantots lieliem datu lielumiem. | Liela atmiņa tiek izmantota, ja datu apjoms ir milzīgs, kas kavēs veiktspēju. |
Izpildes laiks ir ātrāks, ja tiek iegūts liels datu lielums. | Izmantotais izpildes laiks ir vairāk, jo tiek veikta papildu apstrāde, ja jūsu datu lielums ir milzīgs, tas darbosies labi, ja ir mazs datu lielums. |
Kopsavilkums:
- Ienesīguma atslēgvārds pitonā darbojas kā atdeve ar vienīgo atšķirību ir tā, ka vērtības atdošanas vietā zvanītājam tiek atdota ģeneratora funkcija.
- Ģenerators ir īpašs iteratora veids, kas pēc lietošanas vairs nebūs pieejams. Vērtības netiek saglabātas atmiņā un ir pieejamas tikai tad, kad tās tiek izsauktas.
- Ģeneratora vērtības var nolasīt, izmantojot metodi for-in, list () un next ().
- Galvenā atšķirība starp ienesīgumu un atdevi ir tāda, ka ienesīgums atgriež zvanītājam ģeneratora funkciju un atgriešanās dod zvanītājam vienu vērtību.
- Ienesīgums neglabā nevienu no vērtībām atmiņā, un priekšrocība ir tā, ka tā ir noderīga, ja datu lielums ir liels, jo neviena no vērtībām netiek saglabāta atmiņā.
- Veiktspēja ir labāka, ja salīdzinājumā tiek izmantots ienesīguma atslēgvārds, lai atgrieztos pie liela datu apjoma.