Uzziniet, kā šis alternatīvais funkcijas veids var palīdzēt samazināt atmiņas apjomu.
Ja lasāt rindas no žurnālfaila vai apstrādājat garu vienumu sarakstu, viena iespēja ir ielādēt atmiņā visus datus. Tomēr šī pieeja var izmantot daudz atmiņas un kavēt veiktspēju. Ģeneratori piedāvā vērtīgu risinājumu.
Ģeneratori novērš nepieciešamību vienlaicīgi ielādēt visus datus atmiņā. Tie ir noderīgi, apstrādājot lielas datu kopas, bezgalīgas secības vai jebkuru scenāriju, kurā atmiņas efektivitāte ir vissvarīgākā.
Kas ir ģeneratori?
Ģenerators ir īpaša funkcija, kas ļauj atkārtot vērtību secību. Tā vietā, lai atgrieztu pilnu datu kopu, tie ģenerē vai dod vienu vērtību vienlaikus. Tas padara tos efektīvus darbam ar lielām vai neierobežotām datu sekvencēm.
A parastā Python funkcija parasti aprēķina vērtību un atgriež to. Bet ģeneratori darbojas atšķirīgi. Laika gaitā tie var iegūt vairākas vērtības, apturot un atsākot izpildi starp katru ienesīgumu.
Galvenā atšķirība starp parastajām funkcijām un ģeneratoriem ir tā, ka tā vietā, lai izmantotu
atgriezties atslēgvārdu, lai radītu rezultātu, ģeneratori izmanto raža.Kā izveidot ģeneratoru
Lai izveidotu ģeneratoru, nevis atgriezties paziņojumu, izmantojiet a raža paziņojums funkcijā. The raža atslēgvārds ne tikai uzdod funkcijai atgriezt vērtību, bet arī ļauj saglabāt tās stāvokli, ļaujot to turpināt.
Šeit ir vienkāršas ģeneratora funkcijas piemērs:
defnumeric_generator():
yield1
yield2
yield3
gen = numeric_generator()
Šī ģeneratora funkcija nodrošina skaitliskas vērtības no 1 līdz 3.
The raža paziņojums saglabā funkcijas stāvokli, saglabājot vietējos mainīgos starp izsaukumiem, lai atsāktu, kad pieprasāt nākamo vērtību.
Piešķirot mainīgajam ģeneratora funkciju, tiek izveidots ģeneratora objekts, ar kuru varat strādāt.
Darbs ar ģeneratoriem
Ģeneratoriem ir vairākas lietojumprogrammas. Jūs varat tos izmantot in for cilpas vai saraksta izpratnē, kā arī citas atkārtojamas struktūras. Ģeneratori var kalpot arī kā funkciju argumenti.
Kad esat izveidojis ģeneratoru, varat to atkārtot, izmantojot for cilpu:
for i in numeric_generator():
print(i)
Varat arī izmantot Nākamais funkcija vērtību izgūšanai pa vienai:
print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3
Tas dod jums lielāku kontroli pār ģeneratora objektu.
Ģeneratori var izsekot savam stāvoklim. Katrs ienesīguma paziņojums funkcijā darbojas kā kontrolpunkts. Kad jūs zvanāt uz Nākamais() funkcija ģeneratora objektā, izpilde sākas no iepriekšējā ienesīguma punkta.
Varat arī nodot vērtības ģeneratoram, izmantojot sūtīt ():
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 sūtīt () Metode ļauj izgūt vērtības no ģeneratora un nosūtīt vērtības atpakaļ uz ģeneratora funkciju, efektīvi apturot to un ļaujot kontrolēt tās izpildi. The sūtīt () metode ir ērta, rakstot korutīnas vai izmantojot ģeneratorus progresīviem mērķiem.
Ģeneratora izteiksmju izmantošana
Ģeneratora izteiksmes sniedz īsu veidu, kā izveidot vienkāršu un anonīmu ģeneratoru. Tie ir līdzīgi saraksta izpratnei, taču iekavas vietā tiek izmantotas iekavas.
Šeit ir piemērs:
gen = (i**2for i in range(10))
for x in gen:
print(x)
Kods izveido ģeneratora izteiksmi, kas iegūst skaitļu kvadrātus no 0 līdz 9. Ģeneratora izteiksmes ir ideāli piemērotas, lai laiski ģenerētu vērtību secību.
Ģeneratoru izmantošana datu apstrādei
Python ģeneratori ir ērts veids, kā aprakstīt datu straumes un veidot iteratorus, nepaturot visu atmiņā. Jūs varat ievērojami uzlabot savu programmēšanu, iemācoties lietot ģeneratorus, tādējādi atvieglojot sarežģītu datu apstrādes uzdevumu veikšanu.
Nākamreiz, kad strādājat ar lielām datu kopām, paturiet prātā ģeneratorus un deleģējiet tiem darbietilpīgos uzdevumus, lai jūsu kods būtu atsaucīgs un efektīvs.