Hay dos cosas pasando en esa línea. El uno más fácil de explicar es que la declaración yield
devuelve un valor que es una secuencia, por lo que las comas tomar valores de la secuencia y los puso en las variables, muy parecido a éste:
>>> def func():
... return (1,2,3)
...
>>> a,b,c = func()
>>> a
1
>>> b
2
>>> c
3
Ahora, la declaración yield
se usa para create a generator, que puede devolver una cantidad de valores en lugar de solo uno, devolviendo un valor cada vez que se usa yield
. Por ejemplo:
>>> def func():
... for a in ['one','two','three']:
... yield a
...
>>> g = func()
>>> g.next()
'one'
>>> g.next()
'two'
>>> g.next()
'three'
En efecto, la función se detiene en la declaración yield
, esperando que se le solicite el siguiente valor antes de continuar. En el ejemplo anterior, next()
obtiene el siguiente valor del generador. Sin embargo, si utilizamos send()
lugar podemos enviar valores de vuelta al generador que son devueltos por la instrucción yield
de nuevo a la función:
>>> 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
Poniendo todo esto junto obtenemos:
>>> def func():
... total = 0
... while True:
... x,y = yield total
... total = total + (x * y)
...
>>> g = func()
>>> g.next()
0
>>> g.send([6,7])
42
Un generador utilizado de esta manera es called a coroutine.