В этой строке происходит две вещи. Проще объяснить, что оператор yield
возвращает значение, являющееся последовательностью, поэтому запятые принимают значения последовательности и помещают их в переменные, примерно так:
>>> def func():
... return (1,2,3)
...
>>> a,b,c = func()
>>> a
1
>>> b
2
>>> c
3
Теперь оператор yield
используется для создания генератора , который может возвращать не одно, а несколько значений, возвращая одно значение каждый раз, когда используется yield
. Например:
>>> def func():
... for a in ['one','two','three']:
... yield a
...
>>> g = func()
>>> g.next()
'one'
>>> g.next()
'two'
>>> g.next()
'three'
По сути, функция останавливается на операторе yield
, ожидая, когда будет запрошено следующее значение, прежде чем продолжить.
В приведенном выше примере next()
получает следующее значение от генератора. Однако, если мы вместо этого используем send()
, мы можем отправить значения обратно в генератор, которые возвращаются оператором yield
обратно в функцию:
>>> def func():
... total = 0
... while True:
... add = yield total
... total = total + add
...
>>> g = func()
>>> g.next()
0
>>> g.send(10)
10
>>> g.send(15)
25
Собрав все это вместе, мы получим:
>>> def func():
... total = 0
... while True:
... x,y = yield total
... total = total + (x * y)
...
>>> g = func()
>>> g.next()
0
>>> g.send([6,7])
42
Генератор, используемый таким образом, называется сопрограммой .