Что такое доходность Python?
Ключевое слово yield в python работает как return с единственным
разница в том, что вместо возврата значения он возвращает вызывающему объекту объект-генератор.
Когда функция вызывается и поток выполнения находит ключевое слово yield в функции, выполнение функции останавливается на самой строке и возвращает объект генератора обратно вызывающей стороне.
В этом руководстве по Python вы узнаете:
- Что такое доходность Python?
- Синтаксис
- Что такое генераторы в Python?
- Разница между нормальной функцией и функцией генератора.
- Как прочитать значения из генератора?
- Генераторы одноразовые.
- Пример: генераторы и доходность для рядов Фибоначчи
- Пример: вызов функции с доходностью
- Когда использовать Yield вместо Return в Python
- Доходность vs. доходность
Синтаксис
yield expression
Описание
Python yield возвращает объект-генератор. Генераторы - это специальные функции, которые необходимо повторять для получения значений.
Ключевое слово yield преобразует данное выражение в функцию генератора, которая возвращает объект генератора. Чтобы получить значения объекта, его необходимо повторить, чтобы прочитать значения, заданные для yield.
Пример: метод доходности
Вот простой пример доходности. Функция testyield () имеет ключевое слово yield со строкой «Добро пожаловать в Guru99 Python Tutorials». Когда функция вызывается, вывод выводится на печать и выдает объект-генератор вместо фактического значения.
def testyield():yield "Welcome to Guru99 Python Tutorials"output = testyield()print(output)
Выход:
На выходе получается объект-генератор, который имеет значение, которое мы дали yield.
Но мы не получаем сообщения, которое мы должны дать для вывода на выходе!
Чтобы распечатать сообщение, данное 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
Разница между нормальной функцией и функцией генератора.
Давайте поймем, чем функция генератора отличается от нормальной функции.
Есть 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>, а не строку.
Это основное различие между функцией генератора и нормальной функцией. Теперь, чтобы получить значение из объекта-генератора, нам нужно либо использовать объект внутри цикла for, либо использовать метод next (), либо использовать list ().
print(next(generator_test())) # will output Hello World
Еще одно отличие, которое следует добавить к нормальной функции v / s generator function, заключается в том, что когда вы вызываете обычную функцию, выполнение начинается и останавливается, когда оно возвращается, и значение возвращается вызывающей стороне. Поэтому, когда выполнение начинается, вы не можете остановить обычную функцию между ними, и она остановится только тогда, когда встретит ключевое слово 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]
Использование: for-in
В этом примере определена функция even_numbers (), которая выдаст вам все четные числа для заданного n. Вызов функции even_numbers () вернет объект-генератор, который используется внутри цикла for.
Пример:
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.
В приведенном ниже примере есть функция с именем 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, если вы хотите вернуть большой набор значений вызывающей функции
- Доходность - это эффективный способ получения больших или бесконечных данных.
Доходность vs. доходность
Вот разница между доходностью и доходностью.
Урожай | Возвращаться |
Yield возвращает объект генератора вызывающей стороне, и выполнение кода начинается только при итерации генератора. | Возврат в функции - это конец выполнения функции, и вызывающей стороне возвращается одно значение. |
Когда функция вызывается и встречает ключевое слово yield, выполнение функции останавливается. Он возвращает объект генератора обратно вызывающей стороне. Выполнение функции начнется только тогда, когда будет выполнен объект-генератор. | Когда функция вызывается, запускается выполнение, и значение возвращается вызывающему, если есть ключевое слово return. Возврат внутри функции отмечает конец выполнения функции. |
выражение yield | возвращаемое выражение |
При использовании ключевого слова yield память не используется. | Память выделяется для возвращаемого значения. |
Очень полезно, если вам приходится иметь дело с огромным объемом данных, поскольку память не используется. | Удобно для данных очень небольшого размера. |
Производительность лучше, если ключевое слово yield используется для данных большого размера. | Если объем данных велик, что снижает производительность, используется много памяти. |
Время выполнения меньше в случае выхода для большого размера данных. | Используемое время выполнения больше, так как выполняется дополнительная обработка в случае, если размер ваших данных огромен, он будет отлично работать для небольшого размера данных. |
Резюме:
- Ключевое слово yield в python работает как return с той лишь разницей, что вместо возврата значения оно возвращает вызывающему объекту функцию генератора.
- Генератор - это особый тип итератора, который после использования больше не будет доступен. Значения не сохраняются в памяти и доступны только при вызове.
- Значения из генератора можно прочитать с помощью методов for-in, list () и next ().
- Основное различие между yield и return заключается в том, что yield возвращает вызывающему объекту функцию генератора, а return выдает одно значение вызывающему.
- Yield не хранит какие-либо значения в памяти, и преимущество состоит в том, что это полезно при большом размере данных, поскольку ни одно из значений не хранится в памяти.
- Производительность лучше, если ключевое слово yield используется по сравнению с возвратом для большого размера данных.