Шта је принос Питхона?
Кључна реч ииелд у питхону делује као ретурн са јединицом
разлика је у томе што уместо да врати вредност, враћа позивни објекат генератора.
Када се функција позове и нит извршења пронађе кључну реч ииелд у функцији, извршавање функције се зауставља на самој тој линији и враћа објекат генератора натраг позиваоцу.
У овом упутству за Питхон научићете:
- Шта је принос Питхона?
- Синтакса
- Шта су генератори у Питхону?
- Разлика између нормалне функције в / с функције генератора.
- Како очитати вредности из генератора?
- Генератори се користе једнократно
- Пример: Генератори и принос за Фибоначијеве серије
- Пример: Позивање функције са приносом
- Када користити Ииелд уместо Ретурн у Питхон-у
- Принос насупрот повратку
Синтакса
yield expression
Опис
Питхон ииелд враћа генератор објект. Генератори су посебне функције које се морају поновити да би се добиле вредности.
Кључна реч ииелд претвара израз дат у функцију генератора која враћа објект генератора. Да би се добиле вредности објекта, мора се поновити да би се прочитале вредности дате приносу.
Пример: Метода приноса
Ево једноставног примера приноса. Функција тестииелд () има кључну реч ииелд са низом „Добродошли у Гуру99 Туториали за Питхон“. Када се функција позове, излаз се исписује и даје објекат генератора уместо стварне вредности.
def testyield():yield "Welcome to Guru99 Python Tutorials"output = testyield()print(output)
Излаз:
Излаз је објекат генератора, који има вредност коју смо дали да даје.
Али ми не добијамо поруку коју смо морали да дамо да бисмо дали излаз!
Да бисте одштампали поруку дату ииелд, мораћете да поновите објекат генератора као што је приказано у примеру испод:
def testyield():yield "Welcome to Guru99 Python Tutorials"output = testyield()for i in output:print(i)
Оутпут
Welcome to Guru99 Python Tutorials
Шта су генератори у Питхону?
Генератори су функције које враћају итерализирани објект генератора. Вредности из објекта генератора преузимају се једна по једна уместо целе листе заједно, а тиме и за добијање стварних вредности можете да користите фор-лооп помоћу методе нект () или лист ().
Коришћење функције Генератор
Генераторе можете креирати помоћу функције генератора и помоћу израза генератора.
Функција генератора је попут нормалне функције, уместо да има повратну вредност, имаће кључну реч ииелд.
Да бисте креирали функцију генератора, мораћете да додате кључну реч ииелд. Следећи примери показују како се креира функција генератора.
def generator():yield "H"yield "E"yield "L"yield "L"yield "O"test = generator()for i in test:print(i)
Излаз:
HELLO
Разлика између нормалне функције в / с функције генератора.
Да схватимо како се функција генератора разликује од нормалне функције.
Постоје 2 функције нормал_тест () и генератор_тест ().
Обе функције треба да врате низ "Хелло Ворлд". Нормал_тест () користи ретурн, а генератор_тест () користи ииелд.
# 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
Излаз:
Hello World
Излаз показује да када позовете нормалну функцију нормал_тест (), она враћа стринг Хелло Ворлд. За функцију генератора са кључном речи ииелд враћа <генератор објекта генератор_тест на 0к00000012Ф2Ф5БА20>, а не низ.
То је главна разлика између функције генератора и нормалне функције. Сада да бисмо добили вредност из објекта генератора, морамо да користимо објекат унутар фор лооп или да користимо нект () методу или да користимо лист ().
print(next(generator_test())) # will output Hello World
Још једна разлика коју треба додати нормалној функцији в / с функција генератора је та што када позовете нормалну функцију извршење ће започети и зауставити се када се врати и вредност се врати позиваоцу. Дакле, када извршавање започне не можете зауставити нормалну функцију између њих и она ће се зауставити само када дође до кључне речи ретурн.
Али у случају функције генератора, када извршавање започне када добије први принос, зауставља извршење и враћа генератор. Можете да користите објекат генератора да бисте добили вредности, а такође паузирали и наставили назад према вашим захтевима.
Како очитати вредности из генератора?
Вредности можете прочитати из објекта генератора помоћу листе (), фор-лооп и помоћу методе нект ().
Коришћење: лист ()
Листа је итерабилни објекат који има своје елементе унутар заграда. Коришћење лист () на објекту генератора даће све вредности које генератор садржи.
def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)print(list(num))
Излаз:
[0, 2, 4, 6, 8]
Коришћење: фор-ин
У примеру постоји функција дефинисана евен_нумберс () која ће вам дати све парне бројеве за дефинисаних н. Позив функције евен_нумберс () вратит ће генератор, који се користи унутар фор-лооп.
Пример:
def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)for i in num:print(i)
Излаз:
02468
Коришћење нект ()
Следећа () метода ће вам дати следећу ставку на листи, низу или објекту. Једном када је листа празна и ако се позове нект (), вратиће грешку са сигналом стопИтератион. Ова грешка од нект () указује да на листи више нема ставки.
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))
Излаз:
02468Traceback (most recent call last):File "main.py", line 11, inprint(next(num))StopIteration
Генератори се користе једнократно
У случају генератора доступни су за употребу само једном. Ако поново покушате да их користите, биће празно.
На пример:
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))
Излаз:
02468Calling the generator again: []
У случају да желите да се излаз поново користи, мораћете поново да упутите позив да би функционисао.
Пример: Генератори и принос за Фибоначијеве серије
Следећи пример показује како се користе генератори и принос у Питхону. Пример ће генерисати Фибоначијеву серију.
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)
Излаз:
0112358
Пример: Позивање функције са приносом
У овом примеру ћемо видети како се позива функција са ииелд.
Пример у наставку има функцију која се назива тест () која враћа квадрат датог броја. Постоји још једна функција која се назива гетСкуаре () која користи тест () са кључном речи ииелд. Излаз даје квадратну вредност за дати опсег бројева.
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)
Излаз:
0149162536496481
Када користити Ииелд уместо Ретурн у Питхон-у
Кључна реч Питхон3 Ииелд враћа генератор позиваоцу и извршавање кода започиње тек када је генератор поновљен.
Повратак у функцији је крај извршења функције, а појединачна вредност је враћен позиваоца.
Ево ситуације у којој би требало да користите Ииелд уместо Ретурн
- Користите ииелд уместо ретурн када је величина података велика
- Принос је најбољи избор када вам је потребно да ваше извршавање буде брже на великим скуповима података
- Користите ииелд када желите да вратите велики скуп вредности позивајућој функцији
- Принос је ефикасан начин производње података који су велики или бесконачни.
Принос насупрот повратку
Овде су разлике између приноса и приноса
Принос | Повратак |
Ииелд враћа објект генератора позиваоцу, а извршавање кода започиње тек када се генератор понавља. | Повратак у функцији је крај извршења функције и позиваоцу се враћа једна вредност. |
Када се функција позове и наиђе на кључну реч ииелд, извршавање функције се зауставља. Враћа објект генератора натраг позиваоцу. Извршење функције започет ће тек када се изврши објекат генератора. | Када се функција позове, извршавање започиње и вредност се враћа позиваоцу ако постоји кључна реч ретурн. Повратак унутар функције означава крај извршења функције. |
израз приноса | повратни израз |
Не користи се меморија када се користи кључна реч ииелд. | Меморија се додељује за враћену вредност. |
Врло корисно ако имате посла са великом величином података јер се меморија не користи. | Погодно за врло малу величину података. |
Перформансе су боље ако се кључна реч ииелд користи за велику величину података. | Много се меморије користи ако је величина података велика што ће ометати перформансе. |
Време извршавања је брже у случају приноса за велику величину података. | Коришћено време извршавања је веће јер се врши додатна обрада у случају да ако је величина података велика, то ће добро функционисати за мале величине података. |
Резиме:
- Кључна реч ииелд у питхону делује као повратак са једином разликом што уместо да врати вредност, позиватељу враћа функцију генератора.
- Генератор је посебна врста итератора који једном употребљен више неће бити доступан. Вредности се не чувају у меморији и доступне су само када су позване.
- Вредности из генератора могу се прочитати методом фор-ин, лист () и нект ().
- Главна разлика између приноса и поврата је у томе што принос враћа позиваоцу функцију генератора, а поврат даје јединствену вредност позиваоцу.
- Принос не чува ниједну вредност у меморији, а предност је у томе што је корисно када је величина података велика, јер се ниједна вредност не чува у меморији.
- Перформансе су боље ако се кључна реч ииелд користи у поређењу за повратак за велику величину података.