感谢博主 :
https://blog.csdn.net/u011318077/article/details/93749143
https://www.cnblogs.com/skings/p/10339866.html
1、yeild原理:
如果一个函数中包含了yield关键字,该函数就变成了生成器函数。当一条语句调用该生成器函数时,并不会真的执行该函数,而是生成一个生成器,直到对该生成器调用next()时,函数体才会真正的执行。执行函数体时,每执行到一个yield语句时,生成器函数就会中断,生成器函数的“状态”会被冻结,所有的变量的值会被保留下来,下一次要执行的代码的位置会被记录下来,并返回给调用者一个当前的迭代值。下一次调用next()时,从yield记录的断点处继续执行。因此,该生成器函数就好像一个函数在正常执行的过程中,被yield中断了数次,每次中断都会通过yield返回当前的迭代值。当所有的值都被访问完成后,会抛出stopIteration异常,表示迭代完成。
在for循环里面,无需处理StopIteration异常,循环会正常结束。生成器函数一般都是通过for循环来调用,for循环自带next()
2、yield的好处是:把一个函数改写成一个generator,该函数就获得了迭代能力,比起用类的实例保存状态,来计算下一个next()的值,不仅代码简洁,而且流程异常清晰。利用迭代,减少内存消耗。
3、除next()函数外,yield生成器函数中另外一个重要的函数就是send(x),调用者可以通过该函数向生成器函数中传入一个值x。