一语道破 python 迭代器和生成器
简而言之:迭代器是一个抽象化的概念,在python中表示访问数据集合中元素的一种方式;生成器也是一个抽象化的概念,在python 中,边循环边生成所需数据,是一种时间换空间的方法。从访问数据方式上来看:生成器是一种特殊的迭代器。
目录
一、迭代和可迭代对象
1、 什么是迭代:
2、什么是可迭代对象:
二、迭代器
三、生成器
四 、使用场景和总结
一、迭代和可迭代对象
1、 什么是迭代:
-
迭代:迭代是通过循环结构(如
for循环、while循环等)来实现重复执行代码的方法。程序会根据条件或计数器的变化,反复执行一段代码,直到满足某个终止条件为止。 - 递归:递归是通过函数调用自身来解决问题的方法。函数在执行过程中会不断地调用自己,直到遇到终止条件才停止递归。
2、什么是可迭代对象:
如 list、tuple、dict、set、str、range、enumerate 等这些可以直接用于 for 循环的对象称为可迭代(Iterable)对象,也即它们是可迭代的。
- 可迭代对象,需要提供 __iter__()方法,否则不能被 for 语句处理。
iter() 内建方法可以把list、dict、str等可迭代对象转换成迭代器
除字典外,一个对象只要实现了 __getitem__() 方法,就认为它是序列类型,序列类型总是可迭代的。对于序列类型,字典,还有更复杂的可迭代类型如 range,Python 内建了对应的迭代器对它们进行迭代操作,它们无需实现 __next__() 方法,iter() 函数会返回对应的内建迭代器。
二、迭代器
迭代器通过类来实现,在类中需要定义两个方法 __iter__() 和 __next__()方法
__iter__() 方法返回迭代器对象自身,
__next__() 方法返回下一个元素的值,在没有更多元素可提供时引发 StopIteration 异常
class MyIterator:def __init__(self, data):self.data = dataself.index = 0def __iter__(self):return selfdef __next__(self):if self.index < len(self.data):value = self.data[self.index]self.index += 1return valueelse:raise StopIteration# 使用自定义迭代器
my_list = [1, 2, 3, 4, 5]
my_iterator = MyIterator(my_list)for num in my_iterator:print(num)
三、生成器
如果我们要处理更多元素,那么所占内存就呈线性增大,所以受到内存限制,列表容量是有限的。通常我们并不会一次处理所有元素,而只是集中在其中的某些相邻的元素上。所以如果列表元素可以用某种算法用已知量推导出来,就不必一次创建所有的元素。这种边循环边计算的机制,称为生成器(generator),生成器是用时间换空间的典型实例。
生成器通常由两种方式生成,用小括号()表示的生成器表达式(generator expression)和生成器函数(generator function)
生成器表达式和生成器函数产生生成器时,会自动生成名为 __iter__ 和 __next__ 的方法
下面关于生成器表达式和生成器函数的代码,来源于链接3
list0 = [x * x for x in range(5)]
print(list0)list_generator0 = (x * x for x in range(5))
print(list_generator0)list_generator1 = (x * x for x in range(5000000))
print(sys.getsizeof(list_generator0))
print(sys.getsizeof(list_generator1))>>>
[0, 1, 4, 9, 16]
<generator object <genexpr> at 0x000002C7B9955B48>
88
88
def fibonacci(n):i, j = 0, 1while(i < n):print(i, end=' ')i, j = j, i + jfibonacci(5)
print(type(fibonacci))
>>>
0 1 1 2 3 <class 'function'>
四 、使用场景和总结
- 迭代器通常用于对列表、元组、字典等数据结构进行遍历。它们适用于已知数据集合且数据量不太大的情况。
- 生成器适用于需要动态生成数据的情况,尤其是当数据集合非常大或是无限的时候。生成器按需生成数据,可以节省内存和提高性能
总结起来,迭代器是一种数据访问模式的抽象概念,用于按序访问集合中的元素,它可以由自定义的迭代器对象或 Python 内置的可迭代对象生成。而生成器是一种特殊的函数或表达式,用于按需生成数据,并保存状态以支持断续生成。生成器是一种特殊的迭代器,通常用于处理大数据集或无限序列,以节省内存并提高性能。
参考链接:
https://www.runoob.com/python3/python3-iterator-generator.html
https://www.runoob.com/python3/python3-iterator-generator.html
https://blog.csdn.net/be5yond/article/details/119344030
https://blog.csdn.net/be5yond/article/details/119344030
https://pythonhowto.readthedocs.io/zh_CN/latest/iterator.html#id10
https://pythonhowto.readthedocs.io/zh_CN/latest/iterator.html#id10部分代码和文章来源ChatGPT.
相关文章:
一语道破 python 迭代器和生成器
简而言之:迭代器是一个抽象化的概念,在python中表示访问数据集合中元素的一种方式;生成器也是一个抽象化的概念,在python 中,边循环边生成所需数据,是一种时间换空间的方法。从访问数据方式上来看ÿ…...
有哪些开源和非开源的项目管理工具?
开源和非开源项目管理工具各有其特点和优势。下面是一些常见的开源和非开源项目管理工具以及它们的简要介绍。 开源项目管理工具: OpenProject:OpenProject 是一个功能强大、易于使用的开源项目管理工具。它提供了项目计划、任务管理、团队协作、文档管…...
实战 01|「编写互动式界面」
前言 实践是最好的学习方式,技术也如此。 文章目录 前言一、功能需求(一)1、功能需求描述2、知识点3、布局与程序设计 二、功能需求(二)1、功能需求描述2、知识点1)LinearLayout2)RelativeLayou…...
开源社区寻找八月创作之星!你准备好了吗~
活动页面:https://openlab.cosmoplat.com/createStarCampaign-202308卡奥斯开源社区定位打造工业互联网行业顶级开源社区生态平台,为开发者、企业等用户提供代码托管、技术交流/共享、硬件认证/接入、培训认证、大赛活动等服务,目…...
appuploader不是开发者账号
Appuploader是一款可以帮助开发者上传iOS应用到Apple App Store的工具。很多开发者都知道,在上传应用到App Store之前,需要创建开发者账号并获得苹果官方的认证才能进行上传。但是,有些开发者可能并不想去注册开发者账号,或者遇到…...
MySQL - 10、其他命令
描述表结构、使用数据库、设置变量、更改分隔符、导入SQL脚本、退出MySQL的操作: -- 描述表结构 DESCRIBE table_name;-- 使用特定数据库 USE database_name;-- 设置变量 SET variable_name value;-- 更改分隔符 DELIMITER //-- 执行SQL脚本文件 SOURCE /path/to/…...
输入框长度在XSS测试中如何绕过字符长度限制
大家好,这是我编写的第一篇文章,之所以会分享这个故事,是因为我花了几个晚上的时间,终于找到了解决某个问题的方法。故事如下: 几个月前,我被邀请参加一个非公共的漏洞悬赏项目,在初期发现了一些…...
JVM基础篇-直接内存
JVM基础篇-直接内存 什么是直接内存? 直接内存( 堆外内存 ) 指的是 Java 应用程序通过直接方式从操作系统中申请的内存,这块内存不属于jvm 传统方式读取文件 首先会从用户态切换到内核态,调用操作系统函数从磁盘读取文件,读取一部分到操作系统缓冲区…...
【Java可执行命令】(十四)脚本执行工具jrunscript :在命令行环境下交互式执行一些简单的脚本或测试代码片段~
Java可执行命令之jrunscript 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式3.2 启动 jrunscript 直接执行脚本3.3 可选参数:-l < language>3.4 可选参数:-e < script>3.5 可选参数:-f < script file>3.6 注意事项 4️…...
eclipse Java Editor Templates
Window - Preferences - Java - Editor - Templates date ${currentDate:date(yyyy.MM.dd)}...
vue SKU已知sku.tree算出sku.list类目值和id
已知sku.tree算出sku.list类目值和id <van-skuref"sku"v-model"showBase":close-on-click-overlay"closeOnClickOverlay":goods"skuData.goods_info":goods-id"skuData.goods_id":hide-stock"skuData.sku.hide_stoc…...
error C4430 缺少类型说明符 - 假定为 int。注意 C++ 不支持默认 int
出现原因:两个类头文件相互包含 使用声明类代替头文件包含...
Embedding入门介绍以及为什么Embedding在大语言模型中很重要
Embeddings技术简介及其历史概要 在机器学习和自然语言处理中,embedding是指将高维度的数据(例如文字、图片、音频)映射到低维度空间的过程。embedding向量通常是一个由实数构成的向量,它将输入的数据表示成一个连续的数值空间中…...
暑假刷题第20天--8/3
B-序列的与和_2023河南萌新联赛第(四)场:河南大学 (nowcoder.com)(dfs) #include<iostream> #include<string> using namespace std; #define ull unsigned long long int n,k; ull a[21]; ull ans0; int…...
docker容器内的django启动celery任务队列
问题1: celery任务队列一般要使用redis,但是容器内的django要访问本机的redis是十分麻烦的 解决2: 在容器内安装redis,或者单独启动一个redis的容器,我是单独启动一个redis容器 安装redis镜像docker pull redis启动…...
linux文件描述符fd
文件描述符 fd是一个>0 的整数 每打开一个文件,就创建一个文件描述符,通过文件描述符来操作文件 预定义的文件描述符: 0:标准输入,对应于已打开的标准输入设备(键盘) 1:标准输出,对应于已打开的标准输出设备(控制台) 2.标准错误…...
【深度学习】各个开源库总结及实战-总目录
前言 此专栏主要是用MMCV和PaddlePaddle,它们都是优秀的开源库,用于计算机视觉和深度学习任务。MMCV提供了丰富的计算机视觉工具和算法,基于PyTorch框架,适合对PyTorch熟悉的用户。PaddlePaddle是百度开发的深度学习平台,提供易用且高性能的深度学习框架。 此专栏主要包括…...
Unity Shader:闪烁
还是一样的分为UI闪烁和物体闪烁,其中具体可分为:UI闪烁、物体闪烁与半透明闪烁 1,UI闪烁 对于UI 还是一样的,改写UI本身的shader: Shader "UI/YydUIShanShder" {Properties{[PerRendererData] _MainTex(…...
c++开发模式桥接模式
将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。 #include <iostream> using namespace std;// Abstractionclass Abstraction { public:virtual void Op…...
javaScript 树形结构 递归查询方法。
1. 函数递归定义 程序调用自身的编程技巧称为递归( recursion)。 2.使用条件 1.存在限制条件,当满足这个限制条件的时候,递归便不再继续。 2.每次递归调用之后越来越接近这个限制条件。 3.既然是自己调用自己,那么整个…...
SpringBoot使用Redis缓存
耗时一月收集的学习资料,强烈建议学习一下: https://pan.quark.cn/s/b5638e1405d7 正文开始: (1)pom.xml引入jar包,如下: <dependency><groupId>org.springframework.boot</groupId>&l…...
Pi0智能教育助手:个性化学习路径推荐
Pi0智能教育助手:个性化学习路径推荐 教育不是填鸭式的灌输,而是点燃学生内心的火焰。每个学生都有独特的学习节奏和方式,而传统教育往往难以满足这种个性化需求。 1. 为什么教育需要个性化? 你有没有遇到过这样的情况࿱…...
人工智能音乐创作平台版权授权纷争背后的监管隐忧
【人工智能音乐分享权:环球与 Suno 的分歧焦点】据英国《金融时报》报道,人工智能驱动的音乐创作平台 Suno 与环球音乐集团、索尼音乐娱乐公司在授权协议上陷入僵局,核心分歧在于用户是否能分享人工智能生成歌曲。环球音乐希望曲目仅能在 Sun…...
LS-PrePost后处理技巧:如何让你的小球打靶仿真结果更直观
LS-PrePost后处理高阶技巧:让小球打靶仿真结果跃然屏上 仿真工程师们常说:"前处理是体力活,后处理才是艺术。"这句话在小球打靶这类显式动力学仿真中尤为贴切。当你在LS-DYNA中完成了复杂的计算后,如何通过LS-PrePost将…...
【WORD】【域】论文排版
自动目录(TOC){ TOC \o "1-3" \h \z \u }\o "1-3":提取样式 1~3 级标题\h:点击跳转\z:不显示隐藏文字\u:同时读取自定义大纲级别标题总页数当前节总页数 { SECTIONPAGES }全文总…...
芯驰X9车规级芯片实战:如何用6核Cortex-A55打造智能座舱(附开发板评测)
芯驰X9车规级芯片开发实战:从选型到多屏异显的智能座舱全流程解析 在智能汽车快速普及的今天,座舱系统的智能化程度已成为消费者购车的重要考量因素。作为国内领先的车规级芯片解决方案,芯驰X9凭借其6核Cortex-A55架构和丰富的接口资源&#…...
Windows安卓开发终极指南:一键安装ADB Fastboot驱动工具
Windows安卓开发终极指南:一键安装ADB Fastboot驱动工具 【免费下载链接】Latest-adb-fastboot-installer-for-windows A Simple Android Driver installer tool for windows (Always installs the latest version) 项目地址: https://gitcode.com/gh_mirrors/la/…...
Python Web框架实战指南:从Django到FastAPI的选型与应用
1. Python Web框架全景概览 当你第一次接触Python Web开发时,面对琳琅满目的框架选择可能会感到困惑。我刚开始做Web开发时,花了整整两周时间才搞明白Django和Flask的区别。现在回头看,其实每个框架都有自己鲜明的性格特征,就像不…...
知识的基本特性:相对正确性、不确定性与可表示性
“知识”并不是对客观世界的简单照搬,也不是永远不变的绝对真理。它是在认识、概括、组织和应用过程中形成的结果,因此既具有稳定性,也具有条件性。理解知识的基本特性,有助于进一步理解:为什么知识需要表示࿰…...
Vibe Coding:用“氛围感”重塑编程
Vibe Coding(氛围编程)是由OpenAI联合创始人Andrej Karpathy于2025年初提出的编程新范式,核心是通过自然语言描述需求,由AI生成代码,开发者角色从"编码者"转变为"需求引导者"和"结果优化者&q…...
