Discuss / Python / 用断点很容易看到执行过程

用断点很容易看到执行过程

Topic source

Mr_RightMen

#1 Created at ... [Delete] [Delete and Lock User]

只要注意两点 1.遇到yield就跳出 2.生成器本身也会有值返回,不指定,默认就是None,这里循环到最后,yield返回的值就是200 OK

def consumer():
    r = None
    while True:
        # 2.consumer通过yield拿到传递的None,yield跳出
        n = yield r
        # 4.从上次跳出的位置,接着往下执行
        if not n:
            return
        print('[CONSUMER] Consuming %s ...' % n )
        r = '200 OK'
        # 6.从这里开始循环,到yield的时候,再跳出来

def produce(c):
    # 1.启动生成器,会跳到consumer
    c.send(None)
    # 3.接着往下执行,产生数据,通过c.send(n),再切换到consumer
    n = 0
    while n < 5:
        n = n + 1
        print('[PRODUCER] Producing %s ...' % n )
        r = c.send(n)
        # 7.跳出来后,函数返回值是200 OK,所以往下执行,print出200 OK
        print('[PRODUCER Consumer return: %s' % r)
        # 8.从这里开始循环前面的步骤,直到最后
    c.close()

c = consumer()
produce(c)

n=yield r 如何理解?n是一个值,而yield r 是生成器出来的一个状态,如何能等值?哪位大神知道?

侠骨闻香

#3 Created at ... [Delete] [Delete and Lock User]

首先,‘=’不是等值,是赋值哈。

yield可以返回值,yield语句本身也是有值的,可以通过send()函数的参数指定~

consumer()中的 n = yield r 语句,可以分开2步理解: 1、yiled r,即向调用方返回r 2、赋值语句n = xxxx,等待调用方send()函数指定的yield r语句的值,将该值赋值给n

produce()中的 r = c.send(1)语句,这一步的操作可以分开2步理解:

1、将生成器上一次挂起的yield语句的值指定为1,则consumer()中的n = xxxx就是n=1了; 2、相当于执行r = next(c),consumer从上次挂起的yield语句处继续往下执行,再次执行到n = yield r就挂起,将r返回给produce(),n则等待调用方指定的yield r的值

边看边说,感觉也不是很清楚,可以自己查找下生成器send()哈。


  • 1

Reply