Ключевое слово yield
Пауза Функция генератора.Когда вы звоните .next()
в первый раз, интерпретатор проходит через генератор, пока не встретит первый yield
.Генератор остановится и вернет выражение, которое следует за yield
, вызывающему .next()
.Таким образом, поскольку result
начинается с 2, yield result
приводит к тому, что первый вызов .next()
возвращает 2.
Когда вы вызываете .next()
с выражением, это выражение подставляется в функцию генератора, гдепоследняя пауза yield
была.Итак, когда вызывается .next(10)
, эта строка здесь:
return 20 + (yield result)
превращается в
return 20 + (10)
, потому что 10
- это то, что было передано .next()
.Итак, в конце возвращается 20 + 10
, что составляет 30.
Как видите, генераторы сильно отличаются от async
/ await
, хотя они оба имеют делос управлением асинхронным потоком программ.