恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

重新认识生成器generator

  • 首页
  • 资讯中心
  • /
  • 重新认识生成器generator

相关资讯

科学智能体基础模型:从工具调用到闭环的科研新范式 2026/9/4 18:53:34
谈谈你了解的最常见的几种设计模式,说说他们的应用场景 2026/9/4 18:53:34
Web Audio API声控游戏开发:从音频处理到肺活量测试实战 2026/9/4 18:53:34

最新资讯

Python实战:从微博爬虫到情感分析的舆情系统构建
扫描数据进UE:从点云到流式传输的开源管线全解析
从扫描数据到UE流式加载:开源3D数据管线完整实战指南
ESP32-S3 N16R8模组深度解析:从选型到量产实践
FPGA测控程序框架设计:模块化拆分与数据流实战指南
Visual C++原生XML解析器实现:从零构建无依赖DOM树与状态机解析

今日推荐

爬虫防护实操:出海网站拦截恶意采集、垃圾爬虫、无效刷量,CDN 精准防护落地指南
STM32H743 SPI从机DMA双缓冲通信实战
CPU开盖降温教程:20元成本让温度直降30度的原理与实践

本周热门

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析
数字电路时序基石:深入理解建立时间与保持时间
蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

重新认识生成器generator

发布时间:2026/9/4 18:53:34
重新认识生成器generator 基本用法我们清楚, 函数体之中含有yield关键字的函数并非是一个平常的函数, 这一种函数被称作生成器, 通常是用来进行循环处理结构的, 要是应用得恰当的话能够极大程度地优化内存使用效率, 比如说, 去设计一个函数, 将文件打开并且把每一行都转变成大写之后还返还回来:123456defread_file_upper(path):lines []withopen(path)asf:forlineinf:lines.append(line.upper())returnlines这个版本的函数于内部构建了一个 list 对象, 此对象是用来存放转换结果的, for 循环会对文件当中的每一行进行遍历, 把每一行转变成大写之后追加至列表里, 如此这般, 文件里的每一行都得保存在列表中, 而要是文件规模很大, 那么内存开销的情况便可想而知了。我们能够借助yield关键字, 把函数转变为生成器版本, 函数主体的逻辑不存在任何改变, 仅仅是将每行数据的处理结果借助yield逐个予以返回, 并非是在收集到list对象之后再进行返还。1234defiter_file_upper(path):withopen(path)asf:forlineinf:yieldline.upper()要是当下存在一个文本文件data.txt, 其里面涵盖着如下内容:hello, world life is short, use python my wechat id is: coding-fan bye用 生成器我们可以这样对它进行处理123456forlineiniter_file_upper(text.txt): ...print(line.strip())HELLO,WORLDLIFEISSHORT,USEPYTHONMYWECHATIDIS:CODING-FANBYE大致来说, 生成器用法跟函数是差不多一样的, 然而它不会一下子就把文件里所有的数据行都给拿住, 反而是一行一行地去做处理一个一个地返回, 如此一来, 便能把内存的使用量降低到最低限度。行为观察那么生成器为什么会有这样的奇效呢我们接着观察123giter_file_upper(text.txt) ggeneratorobjectiter_file_upperat0x103becd68经过我们进行调用之后, 所得到的是一个生成器对象, 并非是文件处理的结果, 在这个时候, 它还尚未开始执行。在咱们调用 next 函数以便从生成器那里接收紧接着的那个数据之际, 便会着手开始执行, 而后在 yield 所处的那个位置停下来, 并且还会把处于第一行的处理之后所得到的结果返还给咱们:12next(g)HELLO, WORLD\n在这个时候, 生成器所处的状态是暂停, 要是没有我们所给出的指令, 那么它是不会紧接着去处理第二行数据的。当我们再度去执行next函数之时, 生成器又一次恢复进行执行, 去处理下一行的数据, 并且在yield此处又一次暂停:12next(g)LIFE IS SHORT, USE PYTHON\n生成器记住了自身的执行进度, 每当调用next函数时, 它总会去处理并产出下一个数据, 根本无需我们费尽心思去留意操心:1234next(g)MY WECHAT ID IS: CODING-FAN\nnext(g)BYE\n在那代码逻辑执行完结以后, 它会朝着next抛出一个异常, 利用这样的方式去告知调用者它已然结束了:1234next(g)Traceback(mostrecentcalllast):File,line1,inmoduleStopIteration所以, 我们能够将其简单地认定为, for-in循环于虚拟机的内部是按照这样的方式来达成的:在经典的线程模型里, 每个线程有着一个独立的执行流, 且仅能执行一项任务。要是一个程序需要同时去处理多个任务, 那么能够借助多进程或者多线程技术。假定一个站点需要同时为多个客户端连接提供服务, 那样可以为每个连接创建一个独立的线程来予以处理。不管是线程, 还是进程, 在进行切换的时候, 都会带来巨大的开销, 比如说用户态与内核态的切换, 执行上下文的保存以及恢复, 还有CPU缓存的刷新等等。所以说, 利用线程或者进程来驱动小任务的执行, 明显不是一个理想的选择。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号