В этой статье мы расскажем про основные различия между yield и return в Python. А для лучшего понимания этих различий приведем пару примеров.
Встроенное ключевое слово yield используется для создания функций-генераторов. (Про генераторы и их отличия от функций и списков можно подробнее прочитать здесь).
Функция, содержащая yield, может генерировать сразу несколько результатов. Она приостанавливает выполнение программы, отправляет значение результата вызывающей стороне и возобновляет выполнение с последнего yield. Кроме того, функция, содержащая yield, отправляет сгенерированную серию результатов в виде объекта-генератора.
Return также является встроенным ключевым словом в Python. Он завершает функцию, а вызывающей стороне отправляет значение.
Разница между yield и return
Начнем с того, что между yield и return есть много заметных различий. Для начала давайте обсудим их.
return | yield |
---|---|
Оператор return возвращает только одно значение. | Оператор yield может возвращать серию результатов в виде объекта-генератора. |
Return выходит из функции, а в случае цикла он закрывает цикл. Это последний оператор, который нужно разместить внутри функции. | Не уничтожает локальные переменные функции. Выполнение программы приостанавливается, значение отправляется вызывающей стороне, после чего выполнение программы продолжается с последнего оператора yield. |
Логически, функция должна иметь только один return. | Внутри функции может быть более одного оператора yield. |
Оператор return может выполняться только один раз. | Оператор yield может выполняться несколько раз. |
Return помещается внутри обычной функции Python. | Оператор yield преобразует обычную функцию в функцию-генератор. |
Пример 1
Теперь давайте рассмотрим разницу между операторами return и yield на примерах.
В приведенном ниже коде мы использовали несколько операторов возврата. Вы можете заметить, что выполнение программы прекратится уже после первого оператора return. Весь код, идущий после, не будет выполнен.
num1 =10 num2=20 def mathOP(): return num1+num2 return num1-num2 return num1*num2 return num1/num2 print(mathOP())
В выводе видно, что функция возвращает только первое значение, после чего программа завершается.

Чтобы выполнить аналогичную задачу с несколькими операторами return, нам нужно создать четыре разные функции для каждого типа арифметической операции.
num1 =10 num2=20 def sumOP(): return num1+num2 def subtractOP(): return num1-num2 def multiplicationOP(): return num1*num2 def divisionOP(): return num1/num2 print("The sum value is: ",sumOP()) print("The difference value is: ",subtractOP()) print("The multiplication value is: ",multiplicationOP()) print("The division value is: ",divisionOP())
Запустив данный код, получим следующий результат:

Однако мы можем выполнить эти арифметические операции внутри одной функции-генератора, используя несколько операторов yield.
num1 =10 num2=20 def mathOP(): yield num1+num2 yield num1-num2 yield num1*num2 yield num1/num2 print("Printing the values:") for i in mathOP(): print(i)
Получим результат:

Пример 2
Давайте рассмотрим еще один пример использования операторов return и yield.
Создадим список чисел и передадим его в функцию mod()
в качестве аргумента. Далее, внутри функции, мы проверяем каждый элемент списка. Если он делится без остатка на 10, то мы его выводим.
Для начала давайте реализуем этот пример в нашем скрипте Python с использованием оператора return.
myList=[10,20,25,30,35,40,50] def mod(myList): for i in myList: if(i%10==0): return i print(mod(myList))
Оператор return возвращает только первое число, кратное 10, и завершает выполнение функции.

Теперь давайте реализуем тот же пример, используя оператор yield.
myList=[10,20,25,30,35,40,50] def mod(myList): for i in myList: if(i%10==0): yield i for i in mod(myList): print(i)
Получим следующий результат:

Заключение
В этой статье мы провели сравнение yield и return в Python, перечислили все заметные различия между ними и разобрали это на примерах.
Давайте подытожим.
И return, и yield являются встроенными ключевыми словами (или операторами) Python. Оператор return используется для возврата значения из функции. При этом он прекращает выполнение программы. А оператор yield создает объект-генератор и может возвращать несколько значений, не прерывая выполнение программы.