Учебники

37) Доходность в Python

Что такое Python yield?

Ключевое слово yield в python работает как возврат с единственным

Разница в том, что вместо возврата значения он возвращает объект-генератор вызывающей стороне.

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

В этом уроке по Python вы узнаете:

Синтаксис

yield expression

Описание

Python yield возвращает объект-генератор. Генераторы — это специальные функции, которые необходимо повторять для получения значений.

Ключевое слово yield преобразует данное выражение в функцию генератора, которая возвращает объект генератора. Чтобы получить значения объекта, он должен быть повторен, чтобы прочитать значения, данные для yield.

Пример: метод доходности

Вот простой пример выхода. Функция testyield () имеет ключевое слово yield со строкой «Добро пожаловать в Guru99 Python Tutorials». Когда функция вызывается, вывод печатается, и он дает объект генератора вместо фактического значения.

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

Что такое генераторы в 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)

Вывод:

H
E
L
L
O

Разница между нормальной функцией v / s функция генератора.

Давайте разберемся, чем функция генератора отличается от нормальной функции.

Есть 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 она возвращает <генератор объекта generator_test в 0x00000012F2F5BA20>, а не строку.

Это основное различие между функцией генератора и нормальной функцией. Теперь, чтобы получить значение из объекта генератора, нам нужно либо использовать объект внутри цикла 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]

Использование: for-in

В этом примере есть функция, определенная 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. Эта ошибка from 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

Генераторы одноразовые Использование

В случае генераторов они доступны для использования только один раз. Если вы попытаетесь использовать их снова, он будет пустым.

Например:

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:  []

В случае, если вы хотите, чтобы вывод использовался снова, вам придется снова вызвать функцию.

Пример: генераторы и доходность для ряда Фибоначчи

В следующем примере показано, как использовать генераторы и yield в 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 в Python

Ключевое слово Python3 Yield возвращает генератор вызывающей стороне, и выполнение кода начинается только тогда, когда генератор повторяется.

Возвращение в функции конец выполнения функции, и одно значение возвращается к абоненту.

Здесь ситуация, когда вы должны использовать Yield вместо Return

  • Используйте yield вместо return, если размер данных большой
  • Урожайность — лучший выбор, когда вам нужно, чтобы выполнение выполнялось быстрее на больших наборах данных.
  • Используйте yield, если вы хотите вернуть большой набор значений в вызывающую функцию
  • Доходность — это эффективный способ получения больших или бесконечных данных.

Доходность против возврата

Здесь есть различия между доходностью и возвратом

Уступать Возвращение
Yield возвращает объект-генератор вызывающей стороне, и выполнение кода начинается только тогда, когда генератор повторяется. Возврат в функции — это конец выполнения функции, и вызывающей стороне возвращается одно значение.
Когда функция вызывается и встречает ключевое слово yield, выполнение функции останавливается. Он возвращает объект генератора обратно вызывающей стороне. Выполнение функции начнется только при выполнении объекта генератора. Когда вызывается функция, начинается выполнение, и значение возвращается вызывающей стороне, если есть ключевое слово return. Возврат внутри функции отмечает конец выполнения функции.
выражение выражения возвращаемое выражение
При использовании ключевого слова yield не используется память. Память выделяется для возвращаемого значения.
Очень полезно, если вам приходится иметь дело с огромным размером данных, так как память не используется. Удобно для очень маленького размера данных.
Производительность лучше, если ключевое слово yield используется для большого размера данных. Большой объем памяти используется, если объем данных огромен, что снижает производительность.
Время выполнения быстрее в случае выхода при большом размере данных. Используемое время выполнения больше, так как дополнительная обработка выполняется в случае, если ваш размер данных огромен, он будет хорошо работать при небольшом размере данных.

Резюме:

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