Сравнение операторов yield и return в Python (с примерами)

В этой статье мы расскажем про основные различия между yield и return в Python. А для лучшего понимания этих различий приведем пару примеров.

Встроенное ключевое слово yield используется для создания функций-генераторов. (Про генераторы и их отличия от функций и списков можно подробнее прочитать здесь).

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

Return также является встроенным ключевым словом в Python. Он завершает функцию, а вызывающей стороне отправляет значение.

Разница между yield и return

Начнем с того, что между yield и return есть много заметных различий. Для начала давайте обсудим их.

returnyield
Оператор 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())

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

snimok

Чтобы выполнить аналогичную задачу с несколькими операторами 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())

Запустив данный код, получим следующий результат:

snimok1

Однако мы можем выполнить эти арифметические операции внутри одной функции-генератора, используя несколько операторов 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)

Получим результат:

snimok2

Пример 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, и завершает выполнение функции.

snimok3

Теперь давайте реализуем тот же пример, используя оператор 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)

Получим следующий результат:

snimok4

Заключение

В этой статье мы провели сравнение yield и return в Python, перечислили все заметные различия между ними и разобрали это на примерах.

Давайте подытожим.

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