Що таке вихід Python?
Ключове слово yield у python працює як return з єдиним
різниця полягає в тому, що замість повернення значення він повертає об'єкт генератора абоненту.
Коли функція викликається, і потік виконання знаходить ключове слово yield у функції, виконання функції зупиняється на цьому самому рядку, і вона повертає об'єкт генератора назад абоненту.
У цьому підручнику з Python ви дізнаєтесь:
- Що таке вихід Python?
- Синтаксис
- Що таке генератори в Python?
- Різниця між нормальною функцією v / s функцією генератора.
- Як зчитувати значення з генератора?
- Генератори одноразового використання
- Приклад: Генератори та вихід для серії Фібоначчі
- Приклад: Виклик функції з Yield
- Коли використовувати Yield замість Return у Python
- Урожайність проти повернення
Синтаксис
yield expression
Опис
Python yield повертає об'єкт генератора. Генератори - це спеціальні функції, які потрібно повторити, щоб отримати значення.
Ключове слово 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, використовуючи метод 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 вона повертає <об'єкт генератора_тест на 0x00000012F2F5BA20>, а не рядок.
Це основна різниця між функцією генератора та нормальною функцією. Тепер, щоб отримати значення з об'єкта генератора, нам потрібно або використовувати об'єкт всередині for циклу, або використовувати метод next () або використовувати list ().
print(next(generator_test())) # will output Hello World
Ще одна відмінність, яку слід додати до нормальної функції v / s генератор функції, полягає в тому, що коли ви викликаєте нормальну функцію, виконання почнеться і зупиниться, коли вона повернеться і значення повернеться абоненту. Отже, коли розпочинається виконання, ви не можете зупинити нормальну функцію між ними, і вона зупиниться лише тоді, коли натрапить на ключове слово return.
Але у випадку функції генератора, як тільки виконання починається, коли воно отримує перший вихід, воно зупиняє виконання і повертає об'єкт генератора. Ви можете використовувати об’єкт генератора, щоб отримати значення, а також зробити паузу та відновити назад відповідно до ваших вимог.
Як зчитувати значення з генератора?
Ви можете прочитати значення з об'єкта генератора, використовуючи list (), 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: []
Якщо ви хочете, щоб вихідні дані використовувались знову, вам доведеться зателефонувати, щоб функціонувати знову.
Приклад: Генератори та вихід для серії Фібоначчі
Наступний приклад показує, як використовувати генератори та yield в 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 не зберігає жодне зі значень у пам'яті, і перевага полягає в тому, що це корисно, коли обсяг даних великий, оскільки жодне зі значень не зберігається в пам'яті.
- Продуктивність краща, якщо ключове слово yield використовується порівняно для повернення для великого обсягу даних.