Выход в Python Руководство: Generator Пример доходности и доходности

Что такое Python урожай?

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

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

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

Синтаксис

yield expression

Описание

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

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

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

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

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

Вывод:

<generator object testyield at 0x00000028265EB9A8>

Выдаваемые выходные данные — это объект-генератор, который имеет значение, которое мы указали в методе доходности.

Но мы не получаем сообщения, которое должны дать, чтобы получить результат!

Чтобы напечатать сообщение, переданное выходу, придется выполнить итерацию объекта-генератора, как показано в примере ниже:

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 функция

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

Функция-генератор похожа на обычную функцию: вместо возвращаемого значения она имеет ключевое слово доходность.

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

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

Разница между нормальной функцией и/с Generator функции.

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

Есть 2 функцииnormal_test() иgenerator_test().

Предполагается, что обе функции возвращают строку «Hello World». Normal_test() использует возврат, а генератор_test() использует выход.

# 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. Для функции-генератора с ключевым словом доходность она возвращает а не строка.

В этом основное отличие генераторной функции от обычной функции. Теперь, чтобы получить значение из объекта-генератора, нам нужно либо использовать объект внутри цикла for, либо использовать метод next(), либо использовать list().

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

Еще одно отличие, которое следует добавить к обычной функции и функции-генератору, заключается в том, что когда вы вызываете обычную функцию, ее выполнение начнется и остановится, когда она достигнет возвращают и значение возвращается вызывающему абоненту. Поэтому, когда начинается выполнение, вы не можете остановить обычную функцию между ними, и она остановится только тогда, когда встретит ключевое слово return.

Но в случае функции-генератора, как только выполнение начинается, когда она получает первый выход, она останавливает выполнение и возвращает объект-генератор. Вы можете использовать объект-генератор для получения значений, а также приостанавливать и возобновлять работу в соответствии с вашими требованиями.

Как прочитать значения из генератора?

Вы можете прочитать значения из объекта-генератора, используя list(), цикл for и метод next().

Использование: список()

Список — это повторяемый объект, элементы которого заключены в скобки. Использование 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(), она вернет ошибку с сигналом 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

Generatorявляются одноразовыми.

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

Например:

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 в 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

Когда использовать доходность вместо доходности Python

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

A возвращают в функции — это конец выполнения функции, и вызывающей стороне возвращается одно значение.

Вот ситуация, когда вам следует использовать Yield вместо Return.

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

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

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

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

Резюме

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