【Python生成器与迭代器的区别】

目录

一、迭代

二、迭代器

1)创建迭代器——两种方法

iter()方法

利用()和range结合使用

2)具体案例

3、生成器

4、二者的异同

1)、共同点

2)、不同点

a、语法上

b、用法上


一、迭代

首先理解一下迭代,迭代简单地理解就是通过循环的方式遍历一个多元素容器,这个容器可以是列表可以是元组等序列数据类型。迭代遍历容器每一个元素,对每一个元素进行操作,比如打印。

# 1、普通迭代
print("--------------------------普通迭代--------------------------")
for i in [1, 2, 3, 4, 5]:print(i)

--------------------------普通迭代--------------------------
1
2
3
4
5

二、迭代器

迭代器其实就是将一个特殊的类实例化后得到的类对象,这个特殊的类特殊之处就在于一定含有两个方法分别是__iter__()和__next__()方法。__iter__()方法是返回类对象自身,__next__()方法则是根据函数和上一个元素计算出下一个元素值并且通过return的方法返回值

首先__iter__()方法只会调用一次,通过iter()方法得到函数的迭代器(其实就是先将所有的元素计算出来了,然后将),然后__next__()则会被调用n次,用于遍历所有的元素,这个遍历只能往前而不能向后

1)创建迭代器——两种方法

iter()方法

print("创建迭代器")
l = [1,2,3,4]
print(iter(l))

创建迭代器
<list_iterator object at 0x00000288A3300C88>

利用()和range结合使用

2)具体案例

class Fib(object):def __init__(self, max):super(Fib, self).__init__()self.max = maxdef __iter__(self):self.a = 0self.b = 1# __iter__()方法返回自身return selfdef __next__(self): # __next__()方法则是根据当前元素的值和设定的运算函数计算得到下一个函数fib = self.aif fib > self.max:raise StopIterationself.a, self.b = self.b, self.a + self.breturn fib# 定义一个main函数,循环遍历每一个菲波那切数
def main1():# 20以内的数fib = Fib(20)for i in fib: #print(i)# 定义一个main2函数,循环遍历每一个菲波那切数
def main2():# 20以内的数fib = Fib(20)try:print(next(fib))except:print("所有元素迭代完毕!!!")# 测试
if __name__ == '__main__':print("---------------------------------for 遍历迭代器所有元素值-------------------------")main1()print("---------------------------------next方法 遍历迭代器所有元素值-------------------------")main1()

解释说明:

在本类的实现中,定义了一个_iter_(self)方法,这个方法是在for循环遍历时被iter()调用,返回一个迭代器。因为在遍历的时候,是直接调用的python内置函数iter() ,由iter()通过调用_iter_(self)获得对象的迭代器。有了迭代器,就可以逐个遍历元素了。而逐个遍历的时候,也是使用内置的next()函数通过调用对象的_next_(self)方法对迭代器对象进行遍历。所以要实现_iter_(self)_next_(self)这两个方法。

而且因为实现了_next_(self)方法,所以在实现_iter_(self)的时候,直接返回self就可以。

总结一句话就是:

在循环遍历自定义容器对象时,会使用python内置函数iter()调用遍历对象的_iter_(self)获得一个迭代器,之后再循环对这个迭代器使用next()调用迭代器对象的_next_(self)

---------------------------------for 遍历迭代器所有元素值-------------------------
0
1
1
2
3
5
8
13
---------------------------------next方法 遍历迭代器所有元素值-------------------------
0
1
1
2
3
5
8
13

3、生成器

生成器其实就是一个特殊的迭代器。主要的特点是通过yield来返回值,边计算边返回值,大大减少了内存。生成器可以理解为是一个函数

# 菲波那切数列
def Fib(max):n, a, b = 0, 0, 1while n < max:yield ba, b = b, a + bn = n + 1return '亲!没有数据了...'# 调用方法,生成出10个数来
f = Fib(10)
# 使用一个循环捕获最后return 返回的值,保存在异常StopIteration的value中
while True:try:x = next(f)print("f:", x)except StopIteration as e:print("生成器最后的返回值是:", e.value)break

----------------------生成器---------------
f: 1
f: 1
f: 2
f: 3
f: 5
f: 8
f: 13
f: 21
f: 34
f: 55
生成器最后的返回值是: 亲!没有数据了...

4、二者的异同

1)、共同点

  • 生成器是一种特殊的迭代器

2)、不同点

a、语法上

  • 生成器是通过函数的形式中调用 yield 或()的形式创建的
  • 迭代器可以通过 iter() 内置函数创建

b、用法上

  • 生成器在调用next()函数或for循环中,所有过程被执行,且返回值,边计算边返回
  • 迭代器在调用next()函数或for循环中,所有值被返回,没有其他过程或说动作。

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

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

相关文章

BZOJ4426 : [Nwerc2015]Better Productivity最大生产率

如果一个区间包含另一个区间&#xff0c;那么这两个区间是否在一起的生产率是一样的。 将所有这种包含了其他区间的区间放入数组$b$&#xff0c;其余的放入数组$c$&#xff0c;有多个相同的时候则从$b$移一个到$c$。 那么$c$里所有区间左端点递增&#xff0c;右端点也递增&…

[codevs1105][COJ0183][NOIP2005]过河

[codevs1105][COJ0183][NOIP2005]过河 试题描述 在河上有一座独木桥&#xff0c;一只青蛙想沿着独木桥从河的一侧跳到另一侧。在桥上有一些石子&#xff0c;青蛙很讨厌踩在这些石子上。由于桥的长度和青蛙一次跳过的距离都是正整数&#xff0c;我们可以把独木桥上青蛙可能到达的…

ABB机器人套接口通信 机器人部分

ABB机器人套接口通信 机器人部分 文章机器人部分&#xff0c;描述如何运行机器人从机程序&#xff0c;使机器人根据上位机节点发送的命令&#xff0c;执行具体运动。 ABB机器人执行3个任务。这些任务都配置为SEMISTATIC(背景程序)的任务,第三任务是正常动作任务。下文描述如…

CRM项目总结

CRM项目总结 一&#xff1a;开发背景 在公司日益扩大的过程中&#xff0c;不可避免的会伴随着更多问题出现。 对外 &#xff1a; 如何更好的管理客户与公司的关系&#xff1f;如何更及时的了解客户日益发展的需求变化&#xff1f;公司的产品是否真的符合客户需求&#xff1f;以…

【面经——《速腾聚创科技有限公司——深度学习算法工程师》】

自我介绍 实习项目 1&#xff09;项目主要应用的领域&#xff1f; 2&#xff09;难点在哪&#xff1f;——机械臂吸盘大小和目标大小之间坐标的协调 3&#xff09;难点不在于算法&#xff0c;在于数据的处理和均衡性&#xff1f;对于数据均衡方面有什么理解&#xf…

js变量和数据类型

转载于:https://www.cnblogs.com/songyinan/p/6181421.html

offline .net3.5

1.加载虚拟光驱 2.dism.exe /online /enable-feature /featurename:netfx3 /Source:D:\sources\sxs转载于:https://www.cnblogs.com/BillLei/p/5294082.html

(九)模板方法模式详解(包含与类加载器不得不说的故事)

作者&#xff1a;zuoxiaolong8810&#xff08;左潇龙&#xff09;&#xff0c;转载请注明出处&#xff0c;特别说明&#xff1a;本博文来自博主原博客&#xff0c;为保证新博客中博文的完整性&#xff0c;特复制到此留存&#xff0c;如需转载请注明新博客地址即可。 模板方法模…

阿里云openapi接口使用,PHP,视频直播

1.下载sdk放入项目文件夹中 核心就是aliyun-php-sdk-core&#xff0c;它的配置文件会自动加载相应的类 2.引入文件 include_once LIB_PATH . ORG/aliyun-openapi/aliyun-php-sdk-core/Config.php; 3.配置客户端对象,需要Access Key ID,Access Key Secret $iClientProfile Defa…

【面经——《广州敏视数码科技有限公司》——图像处理算法工程师-深度学习方向】

目录 笔试 HR面 专业面——60多分钟 主管面 反问&#xff1a; 笔试 8道题——简答题 1道编程 苹果、香蕉、梨、菠萝&#xff0c;彩色图像如何进行分类&#xff1f;一辆带车牌的汽车&#xff0c;图像亮度整体呈现偏亮状态&#xff0c;如何…

Android之网络编程利用PHP操作MySql插入数据(四)

因为最近在更新我的项目&#xff0c;就想着把自己在项目中用到的一些的简单的与网络交互的方法总结一下&#xff0c;所以最近Android网络编程方面的博文会比较多一些&#xff0c;我尽量以最简单的方法给大家分享&#xff0c;让大家明白易懂。如果有什么不对的地方&#xff0c;还…

RAPID 信号的互锁和同步 WaitTestAndSet 和 TestAndSet

RAPID 信号的互锁和同步 WaitTestAndSet 指令等待指定的持久型 BOOL 变量变成 FALSE.当变量值变为 FALSE, 该指令将设置变量为 TRUE 并继续执行. 该持久型变量可被作为同步或者互斥时的一个 BOOL 信号量。 这个指令与 TestAndSet 有着同样的基本功能。但是 WaitTestAnd…

【常用网址】——opencv等

opencv官网Releases - OpenCVhttps://opencv.org/releases/

(五):C++分布式实时应用框架——微服务架构的演进

C分布式实时应用框架——微服务架构的演进 技术交流合作QQ群&#xff1a;436466587 欢迎讨论交流 上一篇&#xff1a;(四)&#xff1a;C分布式实时应用框架——状态中心模块 版权声明:本文版权及所用技术归属smartguys团队所有&#xff0c;对于抄袭&#xff0c;非经同意转载等…

如何通过软件项目开发来提高自身的实力。

在我们这个专业&#xff0c;大多数人都不会将软件开发当作自己的事业&#xff0c;因为若要在这个行业上能够立足&#xff0c;得需要一个好的基础&#xff0c;但是由于这个东西并不是可以通过书本能够彻底的理解和 掌握的&#xff0c;随着时间的变化&#xff0c;我们身边的科技也…

梦回JavaScript--数据类型之undefined

undefined类型只有一个值&#xff0c;即undefined。在使用var声明变量但未对其加以初始化时&#xff0c;这个变量的值就是undefined&#xff1b; var mes; alert(mes undefined) //true如果变量没有声明就会出现错误 var mes; alert(mes) //undefined alert(a)//error 然而有一…

Robot Application Builder

软件开发工具包 Robot Application Builder是安装在PC机&#xff08;Windows 2000或Windows XP操作系统&#xff09;上的一种独立开发工具&#xff0c;可用于创建运行于ABB FlexPendant示教器或PC机上的定制化操作界面。为此&#xff0c;该软件包由以下两部分组成&#xff1a;…

asp.net model 验证和取出 ErrorMessage 信息

为什么80%的码农都做不了架构师&#xff1f;>>> public class Users{public int Id { get; set; }public string Name { get; set; }[Required(ErrorMessage "邮箱不能为空")][EmailAddressAttribute(ErrorMessage "邮箱格式不正确")]public…

this

作者&#xff1a;李挺链接&#xff1a;https://www.zhihu.com/question/19636194/answer/123274198来源&#xff1a;知乎著作权归作者所有&#xff0c;转载请联系作者获得授权。关于 this 的描述&#xff0c;曾经在 stackoverflow 上看到了一篇回答写的非常详尽&#xff0c;下面…