what does yield as assignment do? myVar = (yield)

后端 未结 3 1058
滥情空心
滥情空心 2020-12-29 20:13

I\'m familiar with yield to return a value thanks mostly to this question

but what does yield do when it is on the right side of an assignment?

@cor         


        
相关标签:
3条回答
  • 2020-12-29 20:37

    The yield statement used in a function turns that function into a "generator" (a function that creates an iterator). The resulting iterator is normally resumed by calling next(). However it is possible to send values to the function by calling the method send() instead of next() to resume it:

    cr.send(1)
    

    In your example this would assign the value 1 to c each time.

    cr.next() is effectively equivalent to cr.send(None)

    0 讨论(0)
  • 2020-12-29 20:46
    • yield returns a stream of data as per the logic defined within the generator function.
    • However, send(val) is a way to pass a desired value from outside the generator function.

    p.next() doesn't work in python3, next(p) works (built-in) for both python 2,3

    p.next() doesn't work with python 3, gives the following error,however it still works in python 2.

    Error: 'generator' object has no attribute 'next'
    

    Here's a demonstration:

    def fun(li):
      if len(li):
        val = yield len(li)
        print(val)
        yield None
        
    
    g = fun([1,2,3,4,5,6])
    next(g) # len(li) i.e. 6 is assigned to val
    g.send(8) #  8 is assigned to val
    
    
    0 讨论(0)
  • 2020-12-29 21:03

    You can send values to the generator using the send function.

    If you execute:

    p = protocol()
    p.next() # advance to the yield statement, otherwise I can't call send
    p.send(5)
    

    then yield will return 5, so inside the generator c will be 5.

    Also, if you call p.next(), yield will return None.

    You can find more information here.

    0 讨论(0)
提交回复
热议问题