yield生成器理解
第一步:执行第一个next(gen),执行到语句value = (yield 1)后,执行被挂起,直接返回yield关键字后面表达式的值即为1,所以next(gen)结果为1;注意此时并没有执行value的赋值
第二步:执行第二个next(gen)时,从上一个挂起位置的下一行开始,也就是从 print("the value is:"+str(value))这句开始,因为上一个挂起时并没有执行赋值语句,所以value的值是None, 执行到 val2 = (yield 4) 后,执行再被挂起,直接返回yield关键字后面表达式的值即为4,所以第二个next(gen)结果为4;注意此时也没有执行val2的赋值
第三步:调用send()方法时,python首先恢复MyGenerator方法的运行环境。同时将表达式(yield 4)的返回值定义为send方法参数的值即为2。这样,接下来val2 = (yield 4)这一赋值语句会将val2的值置为2。继续运行会遇到val3 = (yield 6)语句,然后执行被挂起,同时返回yield关键字后面表达式的值即为6,所以gen.send(2))的执行结果为6;注意此时并没有执行val3 的赋值。
第四步:执行第三个next(gen)时,从上一个挂起位置的下一行开始,也就是从 print("the val3 is:" + str(val3))这句开始,因为上一个挂起时并没有执行赋值语句,所以val3的值是None。
send():send方法先将上一次被挂起的yield语句的返回值清空,并赋值为send方法里面的参数值,如果send()方法没有传参,默认参数值为None,然后执行的是赋值语句。
调用send()方法与next(gen)方法的区别是,如果上次挂起的语句是个赋值语句,send()先执行赋值,再执行下面的语句,而next(gen)方法,直接从赋值语句的下一个语句开始执行
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)