理解一下python中的可迭代对象,迭代器和生成器和他们的区别

可迭代对象

使用iter内置函数可以获取迭代器的对象。如果对象实现了能返回迭代器的__iter__方法,那么对象就是可迭代的。如果没有实现__iter__而实现了__getitem__方法,并且其参数是从零开始的索引,这种对象如序列也是可迭代的

当解释器需要迭代对象时,会自动调用iter(x):

若对象实现了__iter__方法,获取一个迭代器;
若对象没实现__iter__方法,但实现了__getitem__方法,Python会创建一个迭代器,尝试从索引0开始获取元素;
若尝试失败,Python抛出TypeError。

迭代器

迭代器:用于从集合中取出元素的对象。
迭代器的功能:用于支持下列操作

  • for循环
  • 构建和扩展集合类型
  • 逐行遍历文本文件
  • 列表推导、字典推导和集合推导
  • 元组拆包
  • 调用函数时,使用 * 拆包实参

迭代器特点:

  • 可迭代。由于Python中的迭代器实现了__iter__方法,因此也可以迭代。
  • 易耗损。迭代器经过一次逐次取值的循环后便耗尽了。若想再次迭代须重建迭代器。

生成器

生成器函数:拥有yield关键字的Python函数。
生成器表达式:制造生成器的工厂,支持惰性产值。
生成器工厂函数:返回生成器的函数,定义体中可以没有yield关键字。

生成器函数与生成器表达式优点比较:

  • 生成器函数:使用重复使用的情景,也可以作为协程使用。
  • 生成器表达式:代码简洁易读。

使用dir()方法来查看可迭代对象,迭代器和生成器内部实现的方法
__iter__方法: 返回自身
__next__方法: 返回下一个元素

a = [1,2,3,4,5]
print(dir(a))
print('-'*20)
a = iter(a)
print(dir(a))

输出结果:
在这里插入图片描述
可迭代对象内部实现了__iter__
迭代器内部实现__iter__和__next__
生成器的内部也实现__iter__和__next__
在这里插入图片描述
一.可迭代对象

如果对象实现了能返回迭代器的__iter__方法,那么对象就是可迭代的。如果没有实现__iter__而实现了__getitem__方法,并且其参数是从零开始的索引,这种对象如序列也是可迭代的

二.迭代器

通过iter()方法获得了list的迭代器对象,然后就可以通过next()方法来访问list中的元素了。当容器中没有可访问的元素后,next()方法将会抛出一个StopIteration异常终止迭代器。

三.生成器

如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器(Generator)

参考链接:
https://segmentfault.com/a/1190000013460584
https://blog.csdn.net/liangjisheng/article/details/79776008

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值