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

news2024/11/17 21:44:16

简而言之:迭代器是一个抽象化的概念,在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 = data
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index < len(self.data):
            value = self.data[self.index]
            self.index += 1
            return value
        else:
            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, 1

    while(i < n):
        print(i, end=' ')
        i, j = j, i + j

fibonacci(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.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/837886.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

应急响应-主机后门webshell的排查思路(webshell,启动项,隐藏账户,映像劫持,rootkit后门)

0x00 windows主机后门排查思路 针对主机后门windows&#xff0c;linux&#xff0c;在对方植入webshell后&#xff0c;需要立即响应&#xff0c;排查出后门位置&#xff0c;以及排查对外连接&#xff0c;端口使用情况等等 排查对外连接状态&#xff1a; 借助工具&#xff1a;p…

T31开发笔记:librtmp拉流测试

若该文为原创文章&#xff0c;转载请注明原文出处。 T31使用librtmp拉流并保存成FLV文件或H264和AAC文件。 librtmp编译在前面有教程&#xff0c;自行编译。 实现的目的是想要获取获取rtmp的AAC流并播放&#xff0c;实时双向对讲功能。 一、硬件和开发环境 1、硬件&#xff1…

Linux6.31 Kubernetes 二进制部署

文章目录 计算机系统5G云计算第二章 LINUX Kubernetes 部署一、二进制搭建 Kubernetes v1.201.操作系统初始化配置2.部署 etcd 集群3.Kubernetes 集群架构与组件4.部署 Master 组件5.部署 Worker Node 组件6.部署 CNI 网络组件——部署 flannel1&#xff09;K8S 中 Pod 网络通信…

Android 版本 对应的 API版本

Android 14&#xff08;开发者预览版&#xff09; 如需详细了解平台变更&#xff0c;请参阅 Android 14 文档。 Android 13&#xff08;API 级别 33&#xff09; 如需详细了解平台变更&#xff0c;请参阅 Android 13 文档。 Android 12&#xff08;API 级别 31、32&#xf…

《每天5分钟玩转kubernetes》读书笔记

笔记 概念 Pod是脆弱的&#xff0c;但应用是健壮的。 kubelet运行在Cluster所有节点上&#xff0c;负责启动Pod和容器。kubeadm用于初始化Cluster。kubectl是k8s命令行工具。通过kubectl可以部署和管理应用&#xff0c;查看各种资源&#xff0c;创建、删除和更新各种组件。 …

推荐一款非常简单实用的数据库连接工具Navicat Premium

Navicat Premium是一款非常实用的数据库连接工具&#xff0c;别再用HeidiSQL和idea自带的数据库连接了&#xff0c;看完这篇文章&#xff0c;赶紧把Navicat Premium用起来吧。 首先&#xff0c;需要获取Navicat Premium的安装包&#xff0c;可以通过以下网盘链接下载&#xff0…

谷歌联合CMU提出全新语义金字塔概念,无需额外训练使LLMs学会执行视觉任务

​ 论文链接&#xff1a;https://arxiv.org/abs/2306.17842 代码仓库&#xff1a;https://github.com/google-research/magvit/ 在目前的大模型社区中&#xff0c;发展较为成熟的当属以ChatGPT为代表的纯语言模型&#xff08;LLMs&#xff09;&#xff0c;以GPT-4为代表的多模态…

【大数据】ELK最简入门案例(带你进入ELK世界)

文章目录 1. 前言2. 安装3. 启动ELK启动Elasticsearch启动Kibana启动Logstash 4. 测试ELK环境 本文通过最简单纯正的案例带你入门ELK世界。 1. 前言 ELK是Elasticsearch、Logstash、Kibana的缩写&#xff0c;如果对Elasticsearch、Logstash、Kibana不是很了解&#xff0c;可以…

2023华数杯C题完整模型代码

华数杯C题完整论文模型代码已经完成&#xff0c;文末获取&#xff01; 母亲的心理健康状况对婴儿的成长和发展有重要的影响。本研究使用大数据分析方法&#xff0c;探索了母亲的心理健康状况、婴儿的行为特征以及婴儿的睡眠质量之间的相关性。我们采集了大量的数据&#xff0c;…

Python零基础入门(十一)——异常处理

系列文章目录 个人简介&#xff1a;机电专业在读研究生&#xff0c;CSDN内容合伙人&#xff0c;博主个人首页 Python入门专栏&#xff1a;《Python入门》欢迎阅读&#xff0c;一起进步&#xff01;&#x1f31f;&#x1f31f;&#x1f31f; 码字不易&#xff0c;如果觉得文章不…

MS5182N/MS5189N——16bit、4/8 通道、200KSPS、 SAR 型 ADC

产品简述 MS5182N/MS5189N 是 4/8 通道、 16bit 、电荷再分配逐次 逼近型模数转换器。采用单电源供电。 MS5182N/MS5189N 内 部集成无失码的 16 位 SAR ADC 、低串扰多路复用器、内部低 漂移基准电压源 ( 可以选择 2.5 或 4.096 V) 、温度传感器、可选 择的单极…

Java 之LocalDateTime的介绍和使用

LocalDateTime是Java的日期和时间类之一&#xff0c;用于表示不带时区信息的日期时间。 LocalDateTime 没有时区&#xff0c; 所以也就不能用来直接获取时间戳LocalDateTime 是一个基于值得类&#xff0c; 所以该类的示例不是通过构造函数的方式进行创建 以下是一些关于Loca…

华为推出手机系统云翻新服务:什么是云翻新?如何使用?

华为手机系统云翻新是华为推出的一项功能&#xff0c;旨在通过云服务提供系统翻新的服务。它可以帮助用户对手机的系统进行优化和更新&#xff0c;以提高手机的性能和流畅度。具体而言&#xff0c;华为手机系统云翻新功能提供了免费的云空间&#xff0c;用户可以将手机中的系统…

【学习笔记】生成式AI(ChatGPT原理,大型语言模型)

ChatGPT原理剖析 语言模型 文字接龙 ChatGPT在测试阶段是不联网的。 ChatGPT背后的关键技术&#xff1a;预训练&#xff08;Pre-train&#xff09; 又叫自监督式学习&#xff08;Self-supervised Learning&#xff09;&#xff0c;得到的模型叫做基石模型&#xff08;Founda…

JavaScript【静态方法、实例方法/to类、实例方法/get类、实例方法/set类、Math与Date实操、 JS时间戳、日期互相转换】(九)

目录 Math对象_静态方法三 Date对象 Date对象_静态方法 Date对象_实例方法/to类 Date对象_实例方法/get类 Date对象_实例方法/set类 Math与Date实操 JS时间戳、日期互相转换 Math对象_静态方法三 Math.random() Math.random() 返回0到1之间的一个伪随机数&#xff0c;可…

python中几个有趣的函数和推导式

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 一、range()函数 1、range()通常用来做循环。 2、range()生成器的特性。 例子&#xff1a;假如range&#xff08;&#xff09;中使用的数值特别大&#xff0c;为100000000000000000000000000000&#xff1f; python解释…

同比增长50%!W/AR HUD赛道持续向好背后的变化

在智能座舱进入域控制器时代的同时&#xff0c;带来人机交互体验升级的HUD赛道&#xff0c;同样持续火热。 高工智能汽车研究院监测数据显示&#xff0c;2023年1-6月中国市场&#xff08;不含进出口&#xff09;乘用车前装标配W/AR HUD交付90.49万台&#xff0c;潜在选装规模6…

【深度学习_TensorFlow】梯度下降

写在前面 一直不太理解梯度下降算法是什么意思&#xff0c;今天我们就解开它神秘的面纱 写在中间 线性回归方程 如果要求出一条直线&#xff0c;我们只需知道直线上的两个不重合的点&#xff0c;就可以通过解方程组来求出直线 但是&#xff0c;如果我们选取的这两个点不在直…

使用 Amazon ECS Anywhere 在边缘部署 Amazon IoT Greengrass

1.概述 亚马逊云科技提供了完备的IoT服务能力&#xff0c;涵盖设备服务、连接和控制服务以及云端分析服务&#xff0c;是快速构建安全可靠、可扩展的 IoT 平台的常见选择。Amazon IoT Greengrass 边缘运行时和云服务&#xff0c;可帮助您在设备上构建、部署和管理 IoT 应用。A…

中小企业如何做好私域运营呢?

​通过在公域平台上进行引流到私域平台&#xff0c;流量一旦进来&#xff0c;后面再做活动就不需要进行推广的成本&#xff0c;从而进行多次复购。而在于公域平台&#xff0c;流量进来只是一次性&#xff0c;当它出去后可能就不会再记得你的这个产品或者这个店&#xff0c;即当…