Сазнајте како вам овај алтернативни тип функције може помоћи да смањите меморијски отисак.
Ако читате редове из датотеке евиденције или обрађујете дугачку листу ставки, једна од опција је да учитате читаве податке у меморију. Међутим, овај приступ може да користи много меморије и омета перформансе. Генератори нуде вредно решење.
Генератори елиминишу потребу да се сви подаци учитавају у меморију истовремено. Они су корисни када рукујете великим скуповима података, бесконачним низовима или било којим сценаријем где је ефикасност меморије најважнија.
Шта су генератори?
Генератор је посебна функција која вам омогућава да понављате низ вредности. Уместо да враћају комплетан скуп података, они генеришу – или дају – једну по једну вредност. То их чини ефикасним за рад са великим или неограниченим низовима података.
А редовна Питхон функција обично израчунава вредност и враћа је. Али генератори раде другачије. Они могу дати вишеструке вредности током времена паузирањем и настављањем извршења између сваког приноса.
Кључна разлика између регуларних функција и генератора је у томе што уместо коришћења повратак кључну реч за производњу резултата, користе генератори принос.
Како направити генератор
Да бисте направили генератор, уместо повратак изјаву, користите а принос изјава у оквиру функције. Тхе принос кључна реч не само да даје инструкције функцији да врати вредност, већ јој такође дозвољава да сачува своје стање, омогућавајући будући наставак.
Ево примера једноставне функције генератора:
defnumeric_generator():
yield1
yield2
yield3
gen = numeric_generator()
Ова функција генератора даје нумеричке вредности од 1 до 3.
Тхе принос изјава чува стање функције, чувајући локалне променљиве између позива, да би се наставила када затражите следећу вредност.
Додељивање функције генератора променљивој ствара објекат генератора са којим можете да радите.
Рад са генераторима
Генератори имају више апликација. Можете их користити ин фор петље или у оквиру схватања листе, као и друге итеративне структуре. Генератори могу послужити и као аргументи за функције.
Када направите генератор, можете га понављати користећи фор петљу:
for i in numeric_generator():
print(i)
Такође можете користити следећи функција за преузимање вредности једну по једну:
print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3
Ово вам даје већу контролу над објектом генератора.
Генератори могу да прате своје стање. Сваки израз приноса у функцији делује као контролна тачка. Када позовете следећи() функцију на објекту генератора, извршење се наставља са претходне тачке приноса.
Такође можете пренети вредности у генератор користећи послати():
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)
Тхе послати() метода вам омогућава да преузмете вредности из генератора и пошаљете вредности назад у функцију генератора, ефективно паузирајући је и омогућавајући вам да контролишете њено извршавање. Тхе послати() метод је згодан када пишете корутине или користите генераторе за напредне сврхе.
Коришћење израза генератора
Изрази генератора пружају сажет начин за креирање једноставног и анонимног генератора. Они су слични разумевању листе, али користе заграде уместо заграда.
Ево примера:
gen = (i**2for i in range(10))
for x in gen:
print(x)
Код креира израз генератора који даје квадрате бројева од 0 до 9. Генераторски изрази су идеални за лењо генерисање низа вредности.
Коришћење генератора за обраду података
Питхон генератори су згодан начин за описивање токова података и прављење итератора без држања свега у меморији. Можете значајно побољшати своје програмирање тако што ћете научити да користите генераторе, што вам олакшава руковање изазовним задацима обраде података.
Следећи пут када будете радили са великим скуповима података, имајте на уму генераторе и делегирајте им радно интензивне задатке, тако да ваш код остане брз и ефикасан.