生成器与迭代器

发布时间:2026/7/18 7:11:52

生成器与迭代器
迭代器Iterator直观解释迭代器就是能够将一堆数据一个个吐出来的对象而不是一次性输出。比如nums [1, 2, 3] it iter(nums) # 获取迭代器 print(next(it)) # 1 print(next(it)) # 2 print(next(it)) # 3本质定义任何一个对象要想成为迭代器需要满足以下两个方法__iter__() # 返回自身 __next__() # 返回容器的下一个元素。如果没有元素了则抛出 StopIteration 异常。自定义生成器class MyIterator: def __init__(self, n): self.n n self.cur 0 def __iter__(self): return self def __next__(self): if self.cur self.n: self.cur 1 return self.cur else: raise StopIteration if __name__ __main__: it MyIterator(3) for i in it: print(i)结果特点惰性计算用一个取一个节省内存只能往前走不能回退生成器Generator直观理解生成器是“自动帮你写好的迭代器”。不用写nextPython帮你做。因此生成器也是一种特殊的迭代器。定义方式使用yield关键字def gen(): yield 1 yield 2 yield 3 if __name__ __main__: g gen() print(g) print(next(g)) print(next(g)) print(next(g))结果执行过程函数执行到 yield 关键字暂停返回当前值下次从暂停位置继续生成器表达式类似列表推导式g (x*x for x in range(5))对比[x*x for x in range(5)] # 列表一次性全部生成 (x*x for x in range(5)) # 生成器按需生成两者对比对比点迭代器生成器定义方式类实现yield / 表达式实现难度高非常简单本质手写迭代逻辑自动生成迭代器是否惰性是是是否是迭代器✔✔生成器本身就是迭代器总结生成器 更高级、更方便的迭代器可迭代对象 (Iterable)可迭代对象 (Iterable): 像 list, dict, str 这种可以用 for 循环遍历的都是可迭代对象但它们不是迭代器。Python 规定一个对象内部实现了iter() 方法就是可迭代对象。转换: 可以用 iter() 函数把可迭代对象转成迭代器。三者之间的关系可迭代对象 Iterable ↓ 调用 __iter__() 可以得到 迭代器 Iterator ↓ 生成器是它的子类 生成器 Generatoryield和return的区别特性returnyield函数性质普通函数生成器函数 (Generator)退出机制彻底结束函数执行完毕销毁局部变量暂停执行挂起函数保存当前所有状态返回值次数只能返回 1 次或者返回一个包含多数据的元组可以返回多次每次调用返回一个值状态保存不保存状态下次调用从头开始自动保存下次调用从上次停止的地方继续内存占用高一次性返回所有数据低按需生成一次只占一个值的空间举例当你调用一个带 return 的函数时它会从第一行开始运行直到遇到 return。一旦 return 执行函数就把结果扔给调用者然后原地解散内存中的局部变量全部回收。def normal_func(): return 第一步 return 第二步 # 永远不会被执行 print(normal_func()) # 输出: 第一步当你调用带 yield 的函数时它并不会立即执行代码而是返回一个生成器对象。每次你对这个对象执行 next()它就运行到下一个 yield 处把值交给你然后原地休眠。它会记住所有的变量、当前的循环进度和执行行数。def generator_func(): yield 第一步 yield 第二步 yield 第三步 gen generator_func() print(next(gen)) # 输出: 第一步 (函数在此处暂停) print(next(gen)) # 输出: 第二步 (函数从刚才暂停的地方恢复)

相关新闻

金融业钓鱼邮件防御实战:从技术到管理的三重防护体系

金融业钓鱼邮件防御实战:从技术到管理的三重防护体系

2026/7/18 7:15:21

1. 项目概述:当钓鱼邮件成为金融业的“精准鱼叉”在金融行业干了十几年安全,我见过太多因为一封邮件引发的“血案”。从表面看,钓鱼邮件似乎是个老生常谈的话题,无非是“别点陌生链接”、“别下可疑附件”。但如果你真这么想&…

基于RFID技术的固定资产批量识别与快速盘点算法优化研究

基于RFID技术的固定资产批量识别与快速盘点算法优化研究

2026/7/18 7:41:36

针对当前企业固定资产RFID盘点过程中存在的多标签碰撞、密集资产识别准确率低、盘点时延高、复杂环境适配性差等问题,本文开展固定资产批量识别与快速盘点算法优化研究。首先分析传统RFID防碰撞盘点算法在高密度固定资产场景下的应用缺陷,结合企业机房、…

1990–2026年中国甲烷CH4栅格数据|1km分辨率逐年栅格|温室气体科研专用TIF数据集

1990–2026年中国甲烷CH4栅格数据|1km分辨率逐年栅格|温室气体科研专用TIF数据集

2026/7/18 9:43:01

🔍 数据简介 本次更新1990–2026年全国1km分辨率甲烷(CH4)栅格数据集,是目前国内时序最长、精度最高、适配性最强的网格化甲烷排放空间数据。 甲烷(CH₄)是仅次于CO₂的重要温室气体,温室效应潜…

DeepSeek-R1本地化开发环境搭建与优化指南

DeepSeek-R1本地化开发环境搭建与优化指南

2026/7/19 1:13:51

1. 项目概述:DeepSeek-R1本地化开发环境搭建去年在帮某金融团队优化量化交易系统时,我第一次接触到DeepSeek-R1这个70亿参数的开源模型。当时最头疼的问题是如何在严格隔离的内网环境中实现智能代码补全,经过两周的折腾终于摸索出这套基于VSC…

英语学习系统方法论:输入输出与反馈的闭环实践

英语学习系统方法论:输入输出与反馈的闭环实践

2026/7/19 1:13:51

1. 英语学习方法的个人实践总结作为一名从初中开始就痴迷英语学习的老鸟,我至今仍清晰记得自己最初接触英语时的笨拙模样。那些年踩过的坑、走过的弯路,最终都化作了今天这套经过实战检验的学习方法论。不同于市面上那些"30天速成"的营销套路&…

SpringBoot整合JavaMail实现邮件发送全解析

SpringBoot整合JavaMail实现邮件发送全解析

2026/7/19 1:13:51

1. SpringBoot整合JavaMail核心原理与配置SpringBoot通过自动配置机制简化了JavaMail的集成过程。当我们在项目中引入spring-boot-starter-mail依赖后,SpringBoot会自动配置JavaMailSenderbean,这是Spring对JavaMail API的封装。底层使用的是Jakarta Mai…

Bottom Sheet 操作菜单:@Builder + 遮罩 + 动画实现

Bottom Sheet 操作菜单:@Builder + 遮罩 + 动画实现

2026/7/19 1:13:51

前言 Bottom Sheet(底部操作菜单)是移动应用中常见的交互模式,用于显示一组操作选项。“海风日记“的日记详情页通过 Bottom Sheet 提供了编辑、分享、设为私密、复制文本和删除等操作。 本文将从 DiaryDetailPage.ets 源码出发&#xff0c…

EventBus原理与应用:Android高效通信解决方案

EventBus原理与应用:Android高效通信解决方案

2026/7/19 1:13:51

1. 什么是EventBus及其核心价值EventBus是Android和Java平台上的一款开源事件总线库,由greenrobot团队开发维护。它的核心设计理念是简化组件间的通信,特别是在Android开发中Activity、Fragment、Service等组件之间的消息传递。我第一次接触EventBus是在…

Linux Shell编程实战:需求驱动与自动化测试

Linux Shell编程实战:需求驱动与自动化测试

2026/7/19 1:03:51

1. 需求驱动的Linux Shell编程概述在Linux系统管理和自动化任务处理中,Shell脚本是最直接有效的工具之一。不同于传统的教程式学习,需求驱动(Requirement-Driven)的Shell编程方法更注重从实际项目需求出发,通过解决具体问题来掌握核心技能。这…

微服务进阶:服务网格与Istio

微服务进阶:服务网格与Istio

2026/7/19 0:03:49

541|微服务进阶:服务网格与Istio 上篇文章我们聊了微服务的基本概念和拆分方法。 但微服务多了,问题也多了: 服务之间怎么通信? 怎么监控每个服务的调用链路? 熔断、限流、重试怎么做? 安全认证怎么统一? 以前这些都靠SDK库(比如Hystrix、Feign),每个服务都要集成…

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

2026/7/19 0:03:49

一、零售门店全域协同业务背景与行业痛点 1.1 门店超级终端设备矩阵(连锁便利店/商超标准配置) 自助收银Kiosk一体机:顾客结算、自助核销优惠券、商品素材预览;运营折叠平板:店长后台商品上新、图片录入、活动配置、…

噗叽短视频界面分析

噗叽短视频界面分析

2026/7/19 0:03:49

1 和小红书类似,可以采用类似判断方法------------其实他比小红书好判断,因为他没有图片,控件位置几乎是固定的,都不用判断------------2 因为他没有点赞按钮------------而且几乎所有控件位置都是完全一样的,所以我就…

微服务进阶:服务网格与Istio

微服务进阶:服务网格与Istio

2026/7/19 0:03:49

541|微服务进阶:服务网格与Istio 上篇文章我们聊了微服务的基本概念和拆分方法。 但微服务多了,问题也多了: 服务之间怎么通信? 怎么监控每个服务的调用链路? 熔断、限流、重试怎么做? 安全认证怎么统一? 以前这些都靠SDK库(比如Hystrix、Feign),每个服务都要集成…

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

2026/7/19 0:03:49

一、零售门店全域协同业务背景与行业痛点 1.1 门店超级终端设备矩阵(连锁便利店/商超标准配置) 自助收银Kiosk一体机:顾客结算、自助核销优惠券、商品素材预览;运营折叠平板:店长后台商品上新、图片录入、活动配置、…

噗叽短视频界面分析

噗叽短视频界面分析

2026/7/19 0:03:49

1 和小红书类似,可以采用类似判断方法------------其实他比小红书好判断,因为他没有图片,控件位置几乎是固定的,都不用判断------------2 因为他没有点赞按钮------------而且几乎所有控件位置都是完全一样的,所以我就…