Two things happen on this line. Itβs easier to explain that the yield returns a value that is a sequence, so the commas take the values ββof the sequence and put them in variables, like this:
>>> def func(): ... return (1,2,3) ... >>> a,b,c = func() >>> a 1 >>> b 2 >>> c 3
Now, the yield used to create a generator that can return multiple values, not just one, returning one value each time yield 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 fact, the function stops in the yield , waiting for you to be asked for the next value.
In the above example, next() gets the next value from the generator. However, if we use send() , we can instead send the values ββback to the generator, which are returned by the yield back 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 all this 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
The generator used in this way is called a coroutine .
Dave webb
source share