Совместное использование Return и Yield в генераторах Python
В Python 2 оператор return внутри функции-генератора, которая также использовала доходность, приведет к ошибка. Однако в Python 3.3 произошло небольшое изменение.
Демонстрация кода
Рассмотрим следующий код Python 3.3:
def f():
return 3
yield 2
x = f()
print(x.__next__())
Объяснение
В этом коде функция f включает в себя как оператор возврата, так и оператор выхода. При вызове функции сначала выполняется оператор return и возвращается значение 3. В результате оператор урожайности не выполняется.
Когда генератор x повторяется путем вызова его метода next, возникает исключение StopIteration со значением 3. Это означает, что итератор генератора исчерпан, и значение, возвращаемое оператором return, доступно как атрибут value исключения.
Новый механизм в Python 3.3
Согласно PEP 380 , такое поведение — новая функция, представленная в Python 3.3. Это эквивалентно записи:
def f():
yield 3
raise StopIteration
Пример с Yield from
Следующий пример демонстрирует, как это поведение влияет на генераторы, делегированные с использованием синтаксиса Yield from:
def f():
return 1
yield 2
def g():
x = yield from f()
print(x)
# g is still a generator so we need to iterate to run it:
for _ in g():
pass
В этом случае выход из инструкции делегируется генератору f. Поскольку f возвращает значение, но больше не имеет операторов доходности, выводится значение 1. Однако оператор доходности 2 в f не выполняется.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3