添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
  • 1.1. 当方法中包含yield时,该方法为Generator,直接调用不会执行,只有循环或next()可行
  • 1.2. next() 会将带有yield的方法执行,并运行到第一次出现yield的部分,然后再次调用时
  • 1.3. send(self,value)与next类似,但是会传入一个值给yield表达式
  • 2. 有代码如下:
  • 2.1. 通过单步调试发现for循环调用生成器的过程为(注释代码b)(将执行顺序看做指针)
  • 2.2. 当代码b被打开时
  • 2.3. 所以在循环循环体时注意不要对循环体进行操作,如确实需要赋值等操作为保险起见手动调用next与send
  • 3. 相关链接#
  • ssy = show_send_to_yield() next(ssy) # 必须先执行这一步,将执行位置调整至yield语句部分 ssy.send(100) # 可以看到,yield的后面不论是什么,都会将yield_value的值赋为传入的值 # *但是* 当没有使用send对yield赋值时,yield的整体值就是它的参数 # x = yield 10 没有send时,x就是10 #所以如果想要传递一个函数进去,不需要注意yield后面的值,但是在调用时需要记得给参数,如: ssy.send(lamdba x : print(x)) #在调用时要注意给一个参数,如: yield_value(10) #也可以设置一个标识,来使用for循环,当在某步之后执行传递参数的工作 #例如,在某个yield使用完毕之后赋值为指定参数 def show_for_in_yield(): yield_value = yield 'send' print(yield_value) for i in ssy: if i == 'send': ssy.send(100)
    def show_for_in_yield():
        yield_value1 = yield 'send'   #1
        print("yield1  :"+str(yield_value1)) 
        yield_value2 = yield 'sen' #2
        print("yield2  :"+str(yield_value2))
    sfy = show_for_in_yield()
        for i in sfy:  #a
    	if i == 'send':
    	    #x=sfy.send(100) #b
    	print(i)
    except Exception as exp:
        print(exp)
    #因为生成器每次只生成当前使用的部分,所以在第一次进入for时只有一个,执行完毕#1后#2生成,执行2
    

    2.2 当代码b被打开时

    第一步:在a处进入生成器执行#1 并获得yield的值,此时,指针指向#1 并进入生成器,并对yield赋值 第二步:执行#2时,因为上次是跳转到生成器中的,所以直接执行上次未完成的输出语句, 输出了第一个yield的值,并进入下个循环 导致在循环体中没有执行第二个yield,只执行了半个循环体 若想输出完整的内容,需要将for改造如下

    for i in sfy:
    	if i == 'send':
    	    x=sfy.send(100)
    	    print(i)
    	    print(x)
    	else:
    	    print(i)