There are two things going on in that line. The easier one to explain is that the yield
statement is returning a value which is a sequence, so the commas take values of the sequence and put them in the variables, much like this:
>>> def func():
... return (1,2,3)
...
>>> a,b,c = func()
>>> a
1
>>> b
2
>>> c
3
Now, the yield
statement is used to create a generator, which can return a number of values rather than just one, returning one value each time yield
is used. For example:
>>> def func():
... for a in ['one','two','three']:
... yield a
...
>>> g = func()
>>> g.next()
'one'
>>> g.next()
'two'
>>> g.next()
'three'
In effect, the function stops at the yield
statement, waiting to be asked for the next value before carrying on.
In the example above next()
gets the next value from the generator. However, if we use send()
instead we can send values back to the generator which are returned by the yield
statement back in to the function:
>>> 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
Putting this all together we get:
>>> def func():
... total = 0
... while True:
... x,y = yield total
... total = total + (x * y)
...
>>> g = func()
>>> g.next()
0
>>> g.send([6,7])
42
A generator used in this way is called a coroutine.