应该先想想m.send执行的过程,主要m.send会从上一次暂停的地方继续执行到下一个yield语句暂停,但是m.send(None)执行后, sales_num和middle都执行完了,那么m.send(None)找不到下一个yield语句,证明生成器执行结束,那么就会抛出StopIteration提醒调用方,生成器执行结束。我也是想了很久, while True主要是为了引导m.send(None)不会抛出StopIteration的错误,但是在middle最后一行添加yield,或者直接try...except m.send(None)抛出的StopIteration会更加好理解一点