Sužinokite, kaip šis alternatyvus funkcijos tipas gali padėti sumažinti atminties kiekį.

Jei skaitote eilutes iš žurnalo failo arba apdorojate ilgą elementų sąrašą, viena galimybė yra įkelti visus duomenis į atmintį. Tačiau šis metodas gali sunaudoti daug atminties ir trukdyti našumui. Generatoriai siūlo vertingą sprendimą.

Generatoriai pašalina būtinybę įkelti visus duomenis į atmintį vienu metu. Jie naudingi tvarkant didelius duomenų rinkinius, begalines sekas ar bet kokius atvejus, kai atminties efektyvumas yra svarbiausias.

Kas yra generatoriai?

Generatorius yra speciali funkcija, leidžianti kartoti reikšmių seką. Užuot grąžinę visą duomenų rinkinį, jie generuoja arba duoda vieną vertę vienu metu. Dėl to jie yra veiksmingi dirbant su didelėmis arba neapribotomis duomenų sekomis.

A įprastą Python funkciją paprastai apskaičiuoja vertę ir ją grąžina. Tačiau generatoriai veikia skirtingai. Laikui bėgant jie gali duoti kelias vertes, pristabdydami ir atnaujindami vykdymą tarp kiekvienos išeigos.

instagram viewer

Pagrindinis skirtumas tarp įprastų funkcijų ir generatorių yra tas, kad užuot naudoję grąžinti generatoriai naudoja raktažodį rezultatui gauti derlius.

Kaip sukurti generatorių

Norėdami sukurti generatorių, o ne grąžinti pareiškimą, naudokite a derlius teiginys funkcijoje. The derlius raktinis žodis ne tik nurodo funkcijai grąžinti reikšmę, bet ir leidžia išsaugoti jos būseną, kad būtų galima atnaujinti ateityje.

Štai paprastos generatoriaus funkcijos pavyzdys:

defnumeric_generator():
yield1
yield2
yield3

gen = numeric_generator()

Ši generatoriaus funkcija pateikia skaitines reikšmes nuo 1 iki 3.

The derlius pareiškimas išsaugo funkcijos būseną, išsaugodamas vietinius kintamuosius tarp iškvietimų, kad būtų atnaujintas, kai paprašysite kitos reikšmės.

Kintamajam priskyrus generatoriaus funkciją, sukuriamas generatoriaus objektas, su kuriuo galite dirbti.

Darbas su generatoriais

Generatoriai turi keletą programų. Galite juos naudoti į kilpas arba sąrašo supratimo ribose, taip pat kitos kartojamos struktūros. Generatoriai taip pat gali būti funkcijų argumentai.

Sukūrę generatorių, galite jį kartoti naudodami for kilpą:

for i in numeric_generator():
print(i)

Taip pat galite naudoti Kitas funkcija, leidžianti gauti reikšmes po vieną:

print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3

Tai suteikia jums daugiau galimybių valdyti generatoriaus objektą.

Generatoriai gali sekti savo būseną. Kiekvienas funkcijos derliaus teiginys veikia kaip kontrolinis taškas. Kai skambinate Kitas() funkcija generatoriaus objekte, vykdymas paimamas iš ankstesnio našumo taško.

Taip pat galite perduoti reikšmes į generatorių naudodami siųsti ():

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 + y

gen = 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 siųsti () Metodas leidžia gauti reikšmes iš generatoriaus ir nusiųsti reikšmes atgal į generatoriaus funkciją, efektyviai ją pristabdydamas ir leisdamas valdyti jos vykdymą. The siųsti () metodas yra patogus rašant korutinas arba naudojant generatorius pažangiems tikslams.

Naudojant generatoriaus išraiškas

Generatoriaus išraiškos suteikia glaustą būdą sukurti paprastą ir anoniminį generatorių. Jie panašūs į sąrašo supratimą, tačiau vietoj skliaustų naudojami skliaustai.

Štai pavyzdys:

gen = (i**2for i in range(10))

for x in gen:
print(x)

Kodas sukuria generatoriaus išraišką, kuri duoda skaičių kvadratus nuo 0 iki 9. Generatoriaus išraiškos idealiai tinka tingiai generuoti reikšmių seką.

Generatorių naudojimas duomenų apdorojimui

Python generatoriai yra patogus būdas apibūdinti duomenų srautus ir kurti iteratorius nelaikant visko atmintyje. Galite žymiai patobulinti savo programavimą išmokę naudotis generatoriais ir lengviau atlikti sudėtingas duomenų apdorojimo užduotis.

Kitą kartą dirbdami su dideliais duomenų rinkiniais, nepamirškite generatorių ir paveskite jiems daug darbo reikalaujančias užduotis, kad jūsų kodas išliktų jautrus ir efektyvus.