刚开始接触python的同学在各种参考书或者网上资料中经常看到迭代器,生成器,可迭代等字眼,并且可能对此感到迷惑。那么今天我们就来仔细梳理一下这几个概念的关系,经过这次梳理,大家应该就可以比较清晰地区分了。

首先,看一下“可迭代”。

可迭代,是指一个对象的属性。python中的对象,可以分为可迭代对象,不可迭代对象。当我们说一个对象是“可迭代”的时候,这个可迭代对象会具有一些特定的特点和属性。

1、直观来看,可迭代对象可以通过for循环去遍历,比如list,str等:

>>> a = [1,2,3]
>>> for i in a:
        print(i)      
1 2 3

>>> a = "hello"
>>> for i in a:
print(i)

h e l l o

2、可迭代对象,都会具有一个__iter__方法

>>> a = [1]
>>> dir(a)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

实际上,可迭代对象之所以能够迭代,或者说可以通过for去遍历,就是因为其具有这个方法。以list列表举例,当我们for遍历这个列表对象时,实际上这个对象调用了其__iter__方法,该方法返回另一个特殊的对象,这个特殊的对象用于下一步的遍历!

看到这里,大家会问,这个__iter__返回的是什么特殊的对象呢?对,这个对象就是我们接下来要说的迭代器。我们可以先调用__iter__方法产生一个迭代器看看:

>>> a=[1,2,3]
>>> b = a.__iter__()
>>> b

<list_iterator object at 0x10592eb00>

这里b就是一个迭代器,由于是通过列表得到的,所以它是一个列表迭代器。

现在我们具体看看迭代器是什么

迭代器是python中一类对象,这类对象有这几个特点:

1、迭代器都会有一个__next__方法,通过这个方法可以逐个得到其每一个元素:

我们以上一步产生的迭代器b举例

>>> b.__next__()

1
>>> b.__next__()
2
>>> b.__next__()
3
>>> b.__next__()
Traceback (most recent call last):
  File "<pyshell#42>", line 1, in <module>
    b.__next__()

StopIteration

每次执行__next__方法,都会得到一个元素,直到所有元素得到后,抛出一个StopIteration错误,表示迭代结束。

2、迭代器都是可迭代的,也就是说,可以用for去遍历,比如上面的b,可以这样去实现:

>>> for i in b:
print(i)

1 2 3

其实在介绍“可迭代”这个概念时,我们也提到,可迭代对象for遍历时,其实最后也是返回一个迭代器,对迭代器遍历。

3、细心的同学会说,迭代器既然可以迭代,那它一定也有一个__iter__方法了?确实是的,只不过,迭代器这个方法返回的是它本身:

>>> a = iter([1,2,3])
>>> a
<list_iterator object at 0x10592eb38>
>>> b = a.__iter__()
>>> b

<list_iterator object at 0x10592eb38>

我们看到a,b是同一个对象

到这里,可以对迭代器和可迭代对象做一个总结,一句话:迭代器都是可迭代对象,可迭代对象不一定是迭代器。

了解了这些,我们就可以自己定义一个可迭代对象了。要想自己定义一个可迭代对象,只要给这个对象一个__iter__方法,并在这个方法中返回一个迭代器,就可以了,下面是一个例子:

>>> class MyIterableObj(object):
def __iter__(self):
return iter([1,2,3])
>>> test = MyIterableObj()
>>> [i for i in test]

[1, 2, 3]

这里我们使用iter函数得到一个迭代器。

那生成器又是什么呢?

其实可以这样简单理解,一个函数中出现yield,那么它就不是一个普通的函数,而是一个生成器。

>>> def test():
for i in [1,2,3]:
yield i
>>> a = test()
>>> a
<generator object test at 0x105914308>

这里a就是一个生成器。生成器的作用是什么呢?

最常见的是,我们可以使用生成器实现一个迭代模式。前面我们看到,通过iter函数,可以得到一个迭代器,从而得到一个可迭代对象,用于迭代操作。其实,通过生成器,也可以达到相同的目的。我们看下面的例子:

>>> def my_generator():
for i in [1,2,3]:

yield i>>> def my_generator():

>>> class MyIterableObj(object):
def __iter__():

return my_generator()

>>> test = MyIterableObj()
>>> [i for i in test]
[1, 2, 3]

这次,我们在自定义类的__iter__方法中,没有返回iter函数,而是返回我们自己定义的一个生成器函数,但是效果是一样的。

其实如果我们看一下一个生成器的属性,它和迭代器一样,也有__next__, __iter__方法,同样可以使用__next__去得到其中每一个元素,这样看来,用生成器去替代iter函数,就很好理解了:

>>> def my_generator():
for i in [1,2,3]:
yield i
>>> a = my_generator()
>>> a
<generator object my_generator at 0x105928518>
>>> dir(a)
['__class__', '__del__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__lt__', '__name__', '__ne__', '__new__', '__next__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'gi_code', 'gi_frame', 'gi_running', 'gi_yieldfrom', 'send', 'throw']
>>> a.__next__()
1
>>> a.__next__()
2
a.__next__()
>>> a.__next__()
3
>>> a.__next__()
Traceback (most recent call last):
  File "<pyshell#125>", line 1, in <module>
    a.__next__()
StopIteration

python中可迭代对象,迭代器,生成器的区别和联系相关推荐

  1. python中迭代器和可迭代对象的区别_Python 可迭代对象迭代器生成器的区别

    生成器是一种特殊的迭代器,生成器自动实现了"迭代器协议"(即__iter__和next方法),不需要再手动实现两方法. 首先从字面意思来解释Iterable和Iterator的区别 ...

  2. python中可迭代对象,迭代器,生成器,协程

    可迭代对象 创建对象的类中有__iter__方法. 它就是可迭代对象. 所谓的可迭代对象,就是可以被遍历的对象. 如果希望遍历能够获取到值,需要让这个__iter__方法返回一个迭代器对象 迭代器 创 ...

  3. python可迭代对象 迭代器生成器_Python可迭代对象、迭代器和生成器

    8.1 可迭代对象(Iterable) 大部分对象都是可迭代,只要实现了__iter__方法的对象就是可迭代的. __iter__方法会返回迭代器(iterator)本身,例如: >>&g ...

  4. Python要想学得好,【容器/可迭代对象/迭代器/生成器】少不了,稳扎稳打学Python!

    在刚开始学Python的时候,是不是经常会听到大佬们在讲容器.可迭代对象.迭代器.生成器.列表/集合/字典推导式等等众多概念,其实这不是大佬们没事就搁那扯专业术语来装B,而是这些东西都得要明白的,光知 ...

  5. 【Python】【容器 | 迭代对象 | 迭代器 | 生成器 | 生成器表达式 | 协程 | 期物 | 任务】...

    Python 的 asyncio 类似于 C++ 的 Boost.Asio. 所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知. Asyn ...

  6. Python中的装饰器,迭代器,生成器

    1. 装饰器 装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象. 强调装饰器的原则:1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式 装饰器的目标:在遵循1和2的 ...

  7. python中不可迭代对象有哪些_python可迭代对象

    本身实现了迭代方法的对象称之为可迭代对象,可迭代对象特点: 支持每次返回自己所包含的一个成员的对象: 对象实现了 __iter__ 方法: 所有数据结构都是可迭代对象: for 循环要求对象必须是一个 ...

  8. python中可迭代对象拆包时、怎么赋值给占位符_python3-数据结构和算法 » 1.2 解压可迭代对象赋值给多个变量...

    1.2 解压可迭代对象赋值给多个变量 问题 如果一个可迭代对象的元素个数超过变量个数时,会抛出一个 ValueError . 那么怎样才能从这个可迭代对象中解压出 N 个元素出来? 解决方案 Pyth ...

  9. python中可迭代对象_什么是python中的可迭代对象(iterable object)?

    我们经常在打印报错信息中和英文的文档中看到iter这个词根,可以组合成iterable/iterate等派生词.这个iter可以翻译成"迭代",这样iterable object的 ...

  10. python中——可迭代对象

    迭代是访问集合元素的⼀种⽅式.迭代器是⼀个可以记住遍历的位置的对象.迭代器对象从集合的第⼀个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 1. 可迭代对象 我们已经知道可以对li ...

最新文章

  1. c# lock (obj) 与 lock (this) 区别
  2. php内容管理系统开源源码,fcontex 开源内容管理系统 php版 v1.0.3
  3. 阅读笔记:基础知识(Java篇)
  4. mysql replace update_mysql的replace,存在更新,不存在插入
  5. 学习python的第五天
  6. 当前页面excel导出_系统地学习Excel第03课,Excel的工作界面
  7. 集成应用|契约锁与100+管理软件实现集成应用
  8. 九款好看的后台管理系统登录模板
  9. caffe face 实现人脸相似度识别 c++版本
  10. office2010 错误1706 解决办法
  11. java回溯_java实现回溯算法
  12. python太阳花画法_Python——教你画朵太阳花
  13. 网络、域名、DNS、A记录以及MX记录的基本概念
  14. 杨辉三角(案例演示)
  15. 网络安全为啥要学Linux系统
  16. 干货福利分享:pdf怎么去水印 如何在线去除PDF水印
  17. 特殊注释标记todo的有关信息
  18. 智能时代的轴承与齿轮:工业互联网如何真正“工业化”?
  19. 「深度神经网络」(deepamp;nbs…
  20. 关于javascript的调试

热门文章

  1. Java基础知识拾遗--IO篇
  2. CentOS7 Docker 安装 PHP,Mysql,phpmyadmin
  3. Debian 8 Jessie desktop on arm
  4. 第二十九篇、UICollectionView瀑布流
  5. BGP AS过滤列表
  6. 459B Pashmak and Flowers
  7. 如何在 Mac 上的“地图”中自定地图视图?
  8. iOS开发之二维码生成(错误问题小记,微信扫描,长按不识别)
  9. iOS开发Assertion failure in -[AFJSONRequestSerializer requestWithMethod:URLString:parameters:error:]
  10. 修图必备:Photosho 2022 for Mac