Поступитися в Python Підручник: Generator Приклад дохідності та прибутку

Що таке Python врожайність?

Ключове слово yield у python працює як return з єдиним

відмінність полягає в тому, що замість повернення значення він повертає об’єкт генератора викликаючому.

Коли функція викликається, і потік виконання знаходить ключове слово yield у функції, виконання функції зупиняється на самому цьому рядку та повертає генераторний об’єкт назад до викликаючого.

синтаксис

yield expression

Опис

Python yield повертає генераторний об’єкт. Generators — це спеціальні функції, які потрібно повторити, щоб отримати значення.

Ключове слово yield перетворює заданий вираз у функцію генератора, яка повертає об’єкт генератора. Щоб отримати значення об’єкта, його потрібно повторити, щоб прочитати значення, надані yield.

Приклад: метод доходності

Ось простий приклад врожайності. Функція testyield() має ключове слово yield із рядком «Ласкаво просимо до Guru99 Python Підручники“. Під час виклику функції вихідні дані друкуються, і замість фактичного значення видається об’єкт генератора.

def testyield():
  yield "Welcome to Guru99 Python Tutorials"
output = testyield()
print(output)

вихід:

<generator object testyield at 0x00000028265EB9A8>

Наданий вихід є об’єктом-генератором, який має значення, яке ми надали для виходу.

Але ми не отримуємо повідомлення, яке ми маємо надати для виведення на вихід!

Щоб надрукувати повідомлення, надане yield, потрібно повторити об’єкт генератора, як показано в прикладі нижче:

def testyield():
  yield "Welcome to Guru99 Python Tutorials"

output = testyield()
for i in output:
    print(i)

вихід:

Welcome to Guru99 Python Tutorials

Які Generatorз в Python?

Generators — це функції, які повертають ітерований об’єкт генератора. Значення з об’єкта генератора вибираються по одному замість повного списку разом, тому для отримання фактичних значень ви можете використовувати цикл for, використовуючи метод next() або list().

використання Generator функція

Ви можете створювати генератори за допомогою функції генератора та виразу генератора.

Функція генератора схожа на звичайну функцію, замість повернення значення вона матиме ключове слово yield.

Щоб створити функцію генератора, вам доведеться додати ключове слово yield. У наступних прикладах показано, як створити функцію генератора.

def generator():
    yield "H"
    yield "E"
    yield "L"
    yield "L"
    yield "O"

test = generator()
for i in test:
    print(i)

вихід:

H
E
L
L
O

Різниця між нормальною функцією v/s Generator функції.

Давайте зрозуміємо, чим функція генератора відрізняється від звичайної функції.

Є 2 функції normal_test() і generator_test().

Передбачається, що обидві функції повертають рядок «Hello World». Normal_test() використовує return, а generator_test() використовує yield.

# Normal function
def normal_test():
    return "Hello World"
	
#Generator function
def generator_test():
	yield "Hello World"
print(normal_test()) #call to normal function
print(generator_test()) # call to generator function

вихід:

Hello World
<generator object generator_test at 0x00000012F2F5BA20>

Результат показує, що коли ви викликаєте звичайну функцію normal_test(), вона повертає рядок Hello World. Для функції генератора з ключовим словом yield вона повертає а не рядок.

Це основна відмінність функції генератора від звичайної функції. Тепер, щоб отримати значення з об’єкта генератора, нам потрібно або використати об’єкт усередині циклу for, або використати метод next() або скористатися list().

print(next(generator_test()))  # will output Hello World

Ще одна відмінність, яку слід додати до функції генератора v/s, полягає в тому, що коли ви викликаєте звичайну функцію, виконання розпочинається та зупиняється, коли вона дійде до повертати і значення повертається абоненту. Отже, коли починається виконання, ви не можете зупинити звичайну функцію між ними, і вона зупиниться лише тоді, коли натрапить на ключове слово return.

Але у випадку функції генератора, коли починається виконання, коли вона отримує перший вихід, вона зупиняє виконання та повертає об’єкт генератора. Ви можете використовувати об’єкт генератора, щоб отримати значення, а також призупинити та відновити роботу відповідно до ваших вимог.

Як зчитати значення з генератора?

Ви можете зчитувати значення з об’єкта генератора за допомогою list(), циклу for і методу next().

Використання: list()

Список — це повторюваний об’єкт, елементи якого містяться в дужках. Використання list() для об’єкта-генератора дасть усі значення, які зберігає генератор.

def even_numbers(n):
    for x in range(n):
       if (x%2==0): 
           yield x       
num = even_numbers(10)
print(list(num))

вихід:

[0, 2, 4, 6, 8]

Використання : за-в

У прикладі є функція even_numbers(), яка надасть вам усі парні числа для визначеного n. Виклик функції even_numbers() поверне об’єкт генератора, який використовується в циклі for.

приклад:

def even_numbers(n):
    for x in range(n):
       if (x%2==0): 
           yield x       
num = even_numbers(10)
for i in num:
    print(i)

вихід:

0
2
4
6
8

Використання next()

Метод next() надасть вам наступний елемент у списку, масиві чи об’єкті. Якщо список порожній і викликано next(), він поверне помилку з сигналом stopIteration. Ця помилка від next() вказує на те, що в списку більше немає елементів.

def even_numbers(n):
    for x in range(n):
       if (x%2==0): 
           yield x       
num = even_numbers(10)
print(next(num))
print(next(num))
print(next(num))
print(next(num))
print(next(num))
print(next(num))

вихід:

0
2
4
6
8
Traceback (most recent call last):
  File "main.py", line 11, in <module>
    print(next(num))
StopIteration

Generators є одноразовим використанням

У випадку з генераторами вони доступні для використання лише один раз. Якщо ви спробуєте використати їх знову, він буде порожнім.

Наприклад:

def even_numbers(n):
    for x in range(n):
       if (x%2==0): 
           yield x       
num = even_numbers(10)
for i in num:
    print(i)

print("\n")
print("Calling the generator again: ", list(num))

вихід:

0
2
4
6
8
Calling the generator again:  []

Якщо ви хочете, щоб вихідні дані використовувалися знову, вам доведеться знову зробити виклик, щоб він функціонував.

приклад: Generators і дохід для ряду Фібоначчі

Наступний приклад показує, як використовувати генератори та yield in Python. Приклад створить ряд Фібоначчі.

def getFibonnaciSeries(num):
    c1, c2 = 0, 1
    count = 0
    while count < num:
        yield c1
        c3 = c1 + c2
        c1 = c2
        c2 = c3
        count += 1
fin = getFibonnaciSeries(7)
print(fin)
for i in fin:
    print(i)

вихід:

<generator object getFibonnaciSeries at 0x0000007F39C8BA20>
0
1
1
2
3
5
8

Приклад: виклик функції з прибутком

У цьому прикладі ми побачимо, як викликати функцію з yield.

У наведеному нижче прикладі є функція під назвою test(), яка повертає квадрат заданого числа. Існує ще одна функція під назвою getSquare(), яка використовує test() із ключовим словом yield. Результат дає квадратне значення для даного діапазону чисел.

def test(n):
    return n*n

def getSquare(n):
    for i in range(n):
        yield test(i)

sq = getSquare(10)
for i in sq:
    print(i)

вихід:

0
1
4
9
16
25
36
49
64
81

Коли використовувати Yield замість Return in Python

Python3 Врожайність ключове слово повертає генератор викликаючому, і виконання коду починається лише після повторення генератора.

A повертати у функції - це кінець виконання функції, і єдине значення повертається викликаючому.

Ось ситуація, коли вам слід використовувати Yield замість Return

  • Використовуйте yield замість return, якщо розмір даних великий
  • Yield — найкращий вибір, коли вам потрібно, щоб виконання було швидшим на великих наборах даних
  • Використовуйте yield, коли ви хочете повернути великий набір значень функції виклику
  • Yield — це ефективний спосіб отримання великих або нескінченних даних.

Прибуток проти повернення

Ось відмінності між доходом і прибутком

вихід Повернення
Yield повертає об’єкт генератора викликаючому, і виконання коду починається лише після повторення генератора. Повернення у функції є завершенням виконання функції, і єдине значення повертається викликаючому.
Коли функція викликається та зустрічає ключове слово yield, виконання функції припиняється. Він повертає об’єкт генератора назад абоненту. Виконання функції почнеться тільки тоді, коли буде виконано об'єкт генератора. Коли функція викликається, починається виконання, і значення повертається абоненту, якщо є ключове слово return. Повернення всередину функції означає кінець виконання функції.
вираз дохідності вираз повернення
Під час використання ключового слова yield пам’ять не використовується. Пам'ять виділяється для поверненого значення.
Дуже корисно, якщо вам доводиться мати справу з великим обсягом даних, оскільки пам'ять не використовується. Зручно для дуже малого обсягу даних.
Продуктивність краща, якщо ключове слово yield використовується для великого розміру даних. Використовується багато пам’яті, якщо розмір даних великий, що заважає продуктивності.
Час виконання швидший у разі виходу для великого розміру даних. Використовується більше часу виконання, оскільки виконується додаткова обробка у випадку, якщо розмір ваших даних величезний, він добре працюватиме для невеликих даних.

Резюме

  • Ключове слово yield у python працює як повернення з тією лише різницею, що замість повернення значення воно повертає функцію генератора викликаючому.
  • Генератор — це особливий тип ітератора, який після використання більше не буде доступним. Значення не зберігаються в пам'яті і доступні лише під час виклику.
  • Значення з генератора можна прочитати за допомогою методів for-in, list() і next().
  • Основна відмінність між yield і return полягає в тому, що yield повертає функцію генератора викликаючому, а return дає єдине значення викликаючому.
  • Yield не зберігає жодних значень у пам’яті, і перевага полягає в тому, що це корисно, коли розмір даних великий, оскільки жодне зі значень не зберігається в пам’яті.
  • Продуктивність є кращою, якщо використовується ключове слово yield, а не для повернення даних великого розміру.

Підсумуйте цей пост за допомогою: