Какво представлява доходността на Python?
Ключовата дума yield в python работи като return с единствения
разликата е, че вместо да връща стойност, тя връща обект на генератор на повикващия.
Когато се извика функция и нишката на изпълнение открие ключова дума yield във функцията, изпълнението на функцията спира на самия ред и връща обект на генератор обратно на повикващия.
В този урок за Python ще научите:
- Какво представлява доходността на Python?
- Синтаксис
- Какво представляват генераторите в Python?
- Разлика между нормална функция v / s функция генератор.
- Как да разчитаме стойностите от генератора?
- Генераторите се използват еднократно
- Пример: Генератори и добив за серия Фибоначи
- Пример: Функция за повикване с Yield
- Кога да се използва Yield вместо Return в Python
- Доходност срещу връщане
Синтаксис
yield expression
Описание
Доходността на Python връща обект на генератор. Генераторите са специални функции, които трябва да бъдат повторени, за да получат стойностите.
Ключовата дума yield преобразува дадения израз в функция генератор, която връща обект генератор. За да получите стойностите на обекта, той трябва да бъде повторен, за да прочете стойностите, дадени на добива.
Пример: Метод на добива
Ето един прост пример за добив. Функцията testyield () има ключова дума yield с низа „Добре дошли в уроци за Guru99 Python“. Когато функцията бъде извикана, изходът се отпечатва и тя дава обект на генератор вместо действителната стойност.
def testyield():yield "Welcome to Guru99 Python Tutorials"output = testyield()print(output)
Изход:
Даденият изход е обект на генератор, който има стойността, която сме дали, за да даде.
Но ние не получаваме посланието, което трябва да дадем, за да дадем резултат!
За да отпечатате съобщението, дадено на yield, ще трябва да повторите обекта на генератора, както е показано в примера по-долу:
def testyield():yield "Welcome to Guru99 Python Tutorials"output = testyield()for i in output:print(i)
Изход
Welcome to Guru99 Python Tutorials
Какво представляват генераторите в Python?
Генераторите са функции, които връщат итеративен обект на генератор. Стойностите от обекта на генератора се извличат една по една вместо пълния списък заедно и следователно, за да получите действителните стойности, можете да използвате for-loop, като използвате метода next () или list ().
Използване на функция Генератор
Можете да създавате генератори, използвайки генераторска функция и използвайки генераторски израз.
Функцията генератор е като нормална функция, вместо да има връщана стойност, тя ще има ключова дума yield.
За да създадете функция генератор, ще трябва да добавите ключова дума yield. Следващите примери показват как да създадете функция генератор.
def generator():yield "H"yield "E"yield "L"yield "L"yield "O"test = generator()for i in test:print(i)
Изход:
HELLO
Разлика между нормална функция v / s функция генератор.
Нека разберем как генераторната функция се различава от нормалната функция.
Има 2 функции normal_test () и generator_test ().
И двете функции трябва да върнат низа "Hello World". Normal_test () използва return, а generator_test () - yield.
# 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
Резултатът показва, че когато извикате нормалната функция normal_test (), тя връща низ Hello World. За функция генератор с ключова дума yield тя връща <генератор обект generator_test при 0x00000012F2F5BA20>, а не низа.
Това е основната разлика между генераторната функция и нормалната функция. Сега, за да получим стойността от обекта на генератора, трябва или да използваме обекта вътре за цикъл, или да използваме метода next () или да използваме list ().
print(next(generator_test())) # will output Hello World
Още една разлика, която да добавите към нормалната функция v / s функция генератор, е, че когато извикате нормална функция, изпълнението ще започне и спре, когато се върне и стойността се върне на повикващия. Така че, когато изпълнението започне, не можете да спрете нормалната функция между тях и тя ще спре само когато попадне на ключова дума return.
Но в случай на функция генератор, след като изпълнението започне, когато получи първия добив, спира изпълнението и връща обекта на генератора. Можете да използвате обекта на генератора, за да получите стойностите, а също и да направите пауза и да възобновите обратно според вашите изисквания.
Как да разчитаме стойностите от генератора?
Можете да прочетете стойностите от обект на генератор, като използвате списък (), for-loop и метод next ().
Използване: list ()
Списъкът е обект, който може да се итерира и има своите елементи в скоби. Използването на list () на обект на генератор ще даде всички стойности, които генераторът съдържа.
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]
Използване: за-в
В примера има функция, дефинирана even_numbers (), която ще ви даде всички четни числа за дефинираното n. Извикването на функцията even_numbers () ще върне обект на генератор, който се използва вътре в for-loop.
Пример:
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
Използване на next ()
Методът next () ще ви даде следващия елемент от списъка, масива или обекта. След като списъкът е празен и ако бъде извикан next (), той ще върне грешка със сигнал stopIteration. Тази грешка от next () показва, че в списъка няма повече елементи.
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: []
В случай, че искате изходът да се използва отново, ще трябва да осъществите повикването да функционира отново.
Пример: Генератори и добив за серия Фибоначи
Следващият пример показва как да се използват генератори и добив в Python. Примерът ще генерира поредицата на Фибоначи.
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
Пример: Функция за повикване с Yield
В този пример ще видите как да извикате функция с yield.
Примерът по-долу има функция, наречена test (), която връща квадрата на даденото число. Има и друга функция, наречена getSquare (), която използва test () с ключова дума yield. Изходът дава квадратната стойност за даден числов диапазон.
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
Кога да се използва Yield вместо Return в Python
Ключовата дума Python3 Yield връща генератор на повикващия и изпълнението на кода започва само когато генераторът е повторен.
А завръщане във функция е краят на изпълнението на функция, както и една стойност се дава обратно на обаждащия се.
Тук е ситуацията, когато трябва да използвате Yield вместо Return
- Използвайте yield вместо return, когато размерът на данните е голям
- Доходността е най-добрият избор, когато имате нужда от изпълнението си, за да бъдете по-бързи при големи набори от данни
- Използвайте yield, когато искате да върнете голям набор от стойности на извикващата функция
- Доходността е ефективен начин за генериране на данни, които са големи или безкрайни.
Доходност срещу връщане
Тук са разликите между Доходност и Възвръщаемост
Добив | Връщане |
Yield връща обект на генератор на повикващия и изпълнението на кода започва само когато генераторът е повторен. | Връщането във функция е краят на изпълнението на функцията и една стойност се връща на повикващия. |
Когато функцията се извика и тя срещне ключовата дума yield, изпълнението на функцията спира. Той връща обект на генератор обратно към повикващия. Изпълнението на функцията ще започне само когато се изпълни обектът генератор. | Когато функцията бъде извикана, изпълнението започва и стойността се връща на повикващия, ако има ключова дума return. Връщането във функцията отбелязва края на изпълнението на функцията. |
израз на добива | връщане на израз |
Не се използва памет, когато се използва ключовата дума yield. | Паметта се разпределя за върнатата стойност. |
Много полезно, ако трябва да се справите с огромен размер на данните, тъй като паметта не се използва. | Удобен за много малък размер на данните. |
Ефективността е по-добра, ако ключовата дума yield се използва за голям размер на данните. | Използва се много памет, ако размерът на данните е огромен, което ще попречи на производителността. |
Времето за изпълнение е по-бързо в случай на добив при голям размер на данните. | Използваното време за изпълнение е повече, тъй като е извършена допълнителна обработка, в случай че размерът на вашите данни е огромен, ще работи добре за малък размер на данните. |
Резюме:
- Ключовата дума yield в python работи като връщане с единствената разлика, че вместо да връща стойност, тя връща функция генератор на повикващия.
- Генераторът е специален тип итератор, който след като бъде използван, няма да бъде наличен отново. Стойностите не се съхраняват в паметта и са достъпни само при извикване.
- Стойностите от генератора могат да бъдат прочетени чрез метода for-in, list () и next ().
- Основната разлика между yield и return е, че yield връща обратно функция на генератор на повикващия и return дава единична стойност на повикващия.
- Доходността не съхранява никоя от стойностите в паметта и предимството е, че е полезно, когато размерът на данните е голям, тъй като никоя от стойностите не се съхранява в паметта.
- Ефективността е по-добра, ако ключовата дума yield се използва в сравнение за връщане при голям размер на данните.