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

一语道破 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.htmlhttps://www.runoob.com/python3/python3-iterator-generator.html

https://blog.csdn.net/be5yond/article/details/119344030https://blog.csdn.net/be5yond/article/details/119344030

https://pythonhowto.readthedocs.io/zh_CN/latest/iterator.html#id10https://pythonhowto.readthedocs.io/zh_CN/latest/iterator.html#id10部分代码和文章来源ChatGPT.

相关文章:

一语道破 python 迭代器和生成器

简而言之&#xff1a;迭代器是一个抽象化的概念&#xff0c;在python中表示访问数据集合中元素的一种方式&#xff1b;生成器也是一个抽象化的概念&#xff0c;在python 中&#xff0c;边循环边生成所需数据&#xff0c;是一种时间换空间的方法。从访问数据方式上来看&#xff…...

有哪些开源和非开源的项目管理工具?

开源和非开源项目管理工具各有其特点和优势。下面是一些常见的开源和非开源项目管理工具以及它们的简要介绍。 开源项目管理工具&#xff1a; OpenProject&#xff1a;OpenProject 是一个功能强大、易于使用的开源项目管理工具。它提供了项目计划、任务管理、团队协作、文档管…...

实战 01|「编写互动式界面」

前言 实践是最好的学习方式&#xff0c;技术也如此。 文章目录 前言一、功能需求&#xff08;一&#xff09;1、功能需求描述2、知识点3、布局与程序设计 二、功能需求&#xff08;二&#xff09;1、功能需求描述2、知识点1&#xff09;LinearLayout2&#xff09;RelativeLayou…...

开源社区寻找八月创作之星!你准备好了吗~

活动页面&#xff1a;https://openlab.cosmoplat.com/createStarCampaign-202308​​​​​​卡奥斯开源社区定位打造工业互联网行业顶级开源社区生态平台&#xff0c;为开发者、企业等用户提供代码托管、技术交流/共享、硬件认证/接入、培训认证、大赛活动等服务&#xff0c;目…...

appuploader不是开发者账号

Appuploader是一款可以帮助开发者上传iOS应用到Apple App Store的工具。很多开发者都知道&#xff0c;在上传应用到App Store之前&#xff0c;需要创建开发者账号并获得苹果官方的认证才能进行上传。但是&#xff0c;有些开发者可能并不想去注册开发者账号&#xff0c;或者遇到…...

MySQL - 10、其他命令

描述表结构、使用数据库、设置变量、更改分隔符、导入SQL脚本、退出MySQL的操作&#xff1a; -- 描述表结构 DESCRIBE table_name;-- 使用特定数据库 USE database_name;-- 设置变量 SET variable_name value;-- 更改分隔符 DELIMITER //-- 执行SQL脚本文件 SOURCE /path/to/…...

输入框长度在XSS测试中如何绕过字符长度限制

大家好&#xff0c;这是我编写的第一篇文章&#xff0c;之所以会分享这个故事&#xff0c;是因为我花了几个晚上的时间&#xff0c;终于找到了解决某个问题的方法。故事如下&#xff1a; 几个月前&#xff0c;我被邀请参加一个非公共的漏洞悬赏项目&#xff0c;在初期发现了一些…...

JVM基础篇-直接内存

JVM基础篇-直接内存 什么是直接内存? 直接内存( 堆外内存 ) 指的是 Java 应用程序通过直接方式从操作系统中申请的内存,这块内存不属于jvm 传统方式读取文件 首先会从用户态切换到内核态&#xff0c;调用操作系统函数从磁盘读取文件&#xff0c;读取一部分到操作系统缓冲区…...

【Java可执行命令】(十四)脚本执行工具jrunscript :在命令行环境下交互式执行一些简单的脚本或测试代码片段~

Java可执行命令之jrunscript 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式3.2 启动 jrunscript 直接执行脚本3.3 可选参数&#xff1a;-l < language>3.4 可选参数&#xff1a;-e < script>3.5 可选参数&#xff1a;-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

出现原因&#xff1a;两个类头文件相互包含 使用声明类代替头文件包含...

Embedding入门介绍以及为什么Embedding在大语言模型中很重要

Embeddings技术简介及其历史概要 在机器学习和自然语言处理中&#xff0c;embedding是指将高维度的数据&#xff08;例如文字、图片、音频&#xff09;映射到低维度空间的过程。embedding向量通常是一个由实数构成的向量&#xff0c;它将输入的数据表示成一个连续的数值空间中…...

暑假刷题第20天--8/3

B-序列的与和_2023河南萌新联赛第&#xff08;四&#xff09;场&#xff1a;河南大学 (nowcoder.com)&#xff08;dfs&#xff09; #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&#xff1a; celery任务队列一般要使用redis&#xff0c;但是容器内的django要访问本机的redis是十分麻烦的 解决2&#xff1a; 在容器内安装redis&#xff0c;或者单独启动一个redis的容器&#xff0c;我是单独启动一个redis容器 安装redis镜像docker pull redis启动…...

linux文件描述符fd

文件描述符 fd是一个>0 的整数 每打开一个文件&#xff0c;就创建一个文件描述符&#xff0c;通过文件描述符来操作文件 预定义的文件描述符: 0:标准输入&#xff0c;对应于已打开的标准输入设备(键盘) 1:标准输出&#xff0c;对应于已打开的标准输出设备(控制台) 2.标准错误…...

【深度学习】各个开源库总结及实战-总目录

前言 此专栏主要是用MMCV和PaddlePaddle,它们都是优秀的开源库,用于计算机视觉和深度学习任务。MMCV提供了丰富的计算机视觉工具和算法,基于PyTorch框架,适合对PyTorch熟悉的用户。PaddlePaddle是百度开发的深度学习平台,提供易用且高性能的深度学习框架。 此专栏主要包括…...

Unity Shader:闪烁

还是一样的分为UI闪烁和物体闪烁&#xff0c;其中具体可分为&#xff1a;UI闪烁、物体闪烁与半透明闪烁 1&#xff0c;UI闪烁 对于UI 还是一样的&#xff0c;改写UI本身的shader&#xff1a; Shader "UI/YydUIShanShder" {Properties{[PerRendererData] _MainTex(…...

c++开发模式桥接模式

将抽象部分与它的实现部分分离&#xff0c;使它们都可以独立地变化。它是一种对象结构型模式&#xff0c;又称为柄体(Handle and Body)模式或接口(Interface)模式。 #include <iostream> using namespace std;// Abstractionclass Abstraction { public:virtual void Op…...

javaScript 树形结构 递归查询方法。

1. 函数递归定义 程序调用自身的编程技巧称为递归&#xff08; recursion&#xff09;。 2.使用条件 1.存在限制条件&#xff0c;当满足这个限制条件的时候&#xff0c;递归便不再继续。 2.每次递归调用之后越来越接近这个限制条件。 3.既然是自己调用自己&#xff0c;那么整个…...

SpringBoot使用Redis缓存

耗时一月收集的学习资料,强烈建议学习一下&#xff1a; https://pan.quark.cn/s/b5638e1405d7 正文开始&#xff1a; &#xff08;1&#xff09;pom.xml引入jar包&#xff0c;如下&#xff1a; <dependency><groupId>org.springframework.boot</groupId>&l…...

Pi0智能教育助手:个性化学习路径推荐

Pi0智能教育助手&#xff1a;个性化学习路径推荐 教育不是填鸭式的灌输&#xff0c;而是点燃学生内心的火焰。每个学生都有独特的学习节奏和方式&#xff0c;而传统教育往往难以满足这种个性化需求。 1. 为什么教育需要个性化&#xff1f; 你有没有遇到过这样的情况&#xff1…...

人工智能音乐创作平台版权授权纷争背后的监管隐忧

【人工智能音乐分享权&#xff1a;环球与 Suno 的分歧焦点】据英国《金融时报》报道&#xff0c;人工智能驱动的音乐创作平台 Suno 与环球音乐集团、索尼音乐娱乐公司在授权协议上陷入僵局&#xff0c;核心分歧在于用户是否能分享人工智能生成歌曲。环球音乐希望曲目仅能在 Sun…...

LS-PrePost后处理技巧:如何让你的小球打靶仿真结果更直观

LS-PrePost后处理高阶技巧&#xff1a;让小球打靶仿真结果跃然屏上 仿真工程师们常说&#xff1a;"前处理是体力活&#xff0c;后处理才是艺术。"这句话在小球打靶这类显式动力学仿真中尤为贴切。当你在LS-DYNA中完成了复杂的计算后&#xff0c;如何通过LS-PrePost将…...

【WORD】【域】论文排版

自动目录&#xff08;TOC&#xff09;{ TOC \o "1-3" \h \z \u }\o "1-3"&#xff1a;提取样式 1~3 级标题\h&#xff1a;点击跳转\z&#xff1a;不显示隐藏文字\u&#xff1a;同时读取自定义大纲级别标题总页数当前节总页数 { SECTIONPAGES }全文总…...

芯驰X9车规级芯片实战:如何用6核Cortex-A55打造智能座舱(附开发板评测)

芯驰X9车规级芯片开发实战&#xff1a;从选型到多屏异显的智能座舱全流程解析 在智能汽车快速普及的今天&#xff0c;座舱系统的智能化程度已成为消费者购车的重要考量因素。作为国内领先的车规级芯片解决方案&#xff0c;芯驰X9凭借其6核Cortex-A55架构和丰富的接口资源&#…...

Windows安卓开发终极指南:一键安装ADB Fastboot驱动工具

Windows安卓开发终极指南&#xff1a;一键安装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开发时&#xff0c;面对琳琅满目的框架选择可能会感到困惑。我刚开始做Web开发时&#xff0c;花了整整两周时间才搞明白Django和Flask的区别。现在回头看&#xff0c;其实每个框架都有自己鲜明的性格特征&#xff0c;就像不…...

知识的基本特性:相对正确性、不确定性与可表示性

“知识”并不是对客观世界的简单照搬&#xff0c;也不是永远不变的绝对真理。它是在认识、概括、组织和应用过程中形成的结果&#xff0c;因此既具有稳定性&#xff0c;也具有条件性。理解知识的基本特性&#xff0c;有助于进一步理解&#xff1a;为什么知识需要表示&#xff0…...

Vibe Coding:用“氛围感”重塑编程

Vibe Coding&#xff08;氛围编程&#xff09;是由OpenAI联合创始人Andrej Karpathy于2025年初提出的编程新范式&#xff0c;核心是通过自然语言描述需求&#xff0c;由AI生成代码&#xff0c;开发者角色从"编码者"转变为"需求引导者"和"结果优化者&q…...