Выход в 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 не сохраняет никакие значения в памяти, и его преимущество состоит в том, что он полезен, когда размер данных велик, поскольку ни одно из значений не сохраняется в памяти.
- Производительность выше, если используется ключевое слово доходность по сравнению с возвратом для большого размера данных.