Материалы пятой лекции.

Комментарии

  1. Если в генераторной функции встречается return, то он приводит к генерации исключения StopIteration, но куда девается значение, возвращаемое через return? Вот и ответ:

     def f():
         yield 1
         return 2
    
     def g():
         return (yield from f())
    
     def get_return(generator):
         while True:
             try:
                 next(generator)
             except StopIteration as e:
                 return e.value
    
     print(get_return(f())) # 2
     print(get_return(g())) # 2
    

Более того, yield from это значение тоже “пробрасывает”.

  1. Что на самом деле происходит, когда вы пишите в коде yield from, можно узнать в PEP 0380.