当前位置: 首页 > news >正文

Python基础语法:生成器 generator(yield)

一、简介根据指定的规则循环生成数据当条件不成立时则生成数据结束。数据不是一次性全部生成出来而是使用一个再生成一个好处是可以节约大量的内存。就像设计模式中的懒汉式。适合处理大数据或流数。生成器是一种特殊的迭代器使用 yield 关键字而不是 return 来返回值。它可以在迭代过程中动态生成值而不是一次性生成所有值。创建生成器的方式: ① 生成器推导式 ② yield 关键字生成器函数使用关键字yield来返回值。yield return next()调用一个生成器函数返回的是一个迭代器对象, 而不会执行函数体。生成器函数同时具有迭代器的特性通过next(gen)方法来获取下一个值。每次执行next(gen)函数时遇到yield关键字就会return, 并且在下一次执行next(gen)时会从yield关键字的下一行代码开始执行。二、生成器推导式元组没有推导式元组的推导式是gen(iforiinrange(1,11)ifi%20)# class generatorprint(type(gen))print(next(gen))# 2print(next(gen))# 4 for i6 for i8 for i10 foriingen:print(ffor i{i})generator 比 list 占用内存更小。importsys my_list[iforiinrange(10000000)]my_gen(iforiinrange(10000000))print(type(my_list),type(my_gen))# getsizeof查看变量占用的内存大小print(sys.getsizeof(my_list))# 89095160print(sys.getsizeof(my_gen))# 200三、yield 关键字示例1循环listdefget_list():my_list[]foriinrange(1,11):my_list.append(i)returnmy_listforiinget_list():print(i)循环生成器defget_gen():foriinrange(1,11):yieldiforiinget_gen():print(i)示例2defgenerate(n):print(初始化代码只执行一次...)i1whileTrue:print(f循环体{i})ifin:breakyieldi i1print(fyield i{i})print(**10)gengenerate(3)print(**10)print(result,next(gen))print(**10)forxingenerate(5):print(x)send(value) 函数可以将参数值传递到生成器内来引用。调用send(value)方法时第一次必须传None参数或者在调用send(value)方法前调用next(gen)gen.send(None)next(gen)defgenerate():print(初始化代码只执行一次...)i1whileTrue:print(f循环体{i})ifi5:raiseStopIteration# send_value 并不影响i的值send_valueyieldi i1print(fyield i{i}send_value{send_value})gengenerate()# 初始化代码只执行一次...# 循环体1# result 1print(result,next(gen))# yield i2 send_value4# 循环体2# result 2print(result,gen.send(4))# yield i3 send_valueNone# 循环体3# result 3print(result,next(gen))四、应用场景deffibonacci():无限斐波那契数列生成器a,b0,1whileTrue:yielda a,bb,ab fibfibonacci()print(next(fib))# 0print(next(fib))# 1print(next(fib))# 1print(next(fib))# 2print(next(fib))# 3importmathdefget_page_data(page_size): 读取文件中的歌词,一次读取page_size条 :param page_size: 每页数量 :return: 每页歌词条数 #1 读歌词withopen(./data/bye,r)asfile:linesfile.readlines()#2 总条数total_numlen(lines)#3 总页数total_pagemath.ceil(total_num/page_size)print(ftotal_num{total_num}, page_size{page_size}, total_page{total_page})#4 遍历每页forpage_noinrange(total_page):yieldlines[page_no*page_size:page_no*page_sizepage_size]data_genget_page_data(5)print(type(data_gen))# class generatorforpage_dataindata_gen:print(page_data)
http://www.rkmt.cn/news/1385959.html

相关文章:

  • Claude Code、Codex、Cursor 与 MCP 协议深度解析:AI 编程工具到底怎么选?
  • leetcode思路-回溯相关(46.全排列、78.子集、17.电话号码的字母组合)
  • 第2章:AI辅助Solidity语法精讲——变量、函数与修饰器
  • MQTT协议:物联网通信的核心利器
  • 2026年,揭秘那些真正安全的原生态食材厂家你不可不知的秘密
  • OmenSuperHub:惠普OMEN游戏本性能控制的终极开源解决方案
  • Unity编辑器黑屏崩溃?Windows TDR超时机制详解与安全调优
  • 腾讯字节“短视频猪食论”争执再现?抖音副总裁李亮:我没说过,其他高管也没有
  • 国内环保涂料供应商排行 四大权威品牌综合实力测评
  • 思源宋体完全配置指南:5分钟掌握免费商用中文排版方案
  • 2026年DPAK:200VMOS、300VMOS、60VMOS、DPAKMOS、MOSFET、N沟道MOS、P沟道MOS选择指南 - 优质品牌商家
  • AI中医为什么总“不准”?知医邦6个开关打通AI中医诊断行业堵点
  • 用python处理excel数据,将打印日志整理成表格并比较数据
  • 伺服驱动器全解析:核心作用、工作原理与前沿应用
  • 2026年当下广西护栏网批发厂家选哪家?资深行业分析师的专业推荐指南 - 2026年企业推荐榜
  • 终极Hyper-V设备直通解决方案:DiscreteDeviceAssigner图形化工具完整指南
  • 聊聊2026年的账号防封:别再只拿代理IP当背锅侠了
  • Google发布A2A协议v1.2:AI Agent互联网的TCP/IP之争正式打响
  • NY448固态MT29F32T08GSLBHL8-36QB:B
  • STM32定时器输入捕获测频原理详解:从555电路到LCD显示的完整信号链分析
  • Stagehand 框架入门:原生 Playwright 与 AI 自然语言操作的完美混合
  • 电子负载散热改造:双面散热方案让TO-247 MOSFET功率提升50%
  • 新型高性能钢框架-支撑结构体系理论及试验优化算法【附代码】
  • Unity 2022安装深度解析:模块依赖、Hub配置与离线部署实战
  • 开源自动驾驶系统openpilot:从机器人操作系统到300+车型支持的深度技术解析
  • 枚举状态码,统一返回码和策略模式的初步学习
  • 国家软考中级·信息安全工程师:全网最硬核备考拆解
  • 翡翠工厂直销靠谱吗?和传统实体珠宝店有什么区别?
  • Onekey终极指南:如何5分钟快速获取Steam游戏清单的免费神器
  • 录音会议纪要整理不同使用场景,实用口碑选择建议