在python中,可迭代对象&迭代器&生成器的关系如下图:

即:生成器是一种特殊的迭代器,迭代器是一种特殊的可迭代对象。

可迭代对象

如上图,这里x是一个列表(可迭代对象),其实正如第一张图所示,可迭代对象包含范围很广,如list是可迭代对象,dict是可迭代对象,set也是可迭代对象;

可迭代对象必须含有__iter__方法,该方法返回一个迭代器对象。上图中,y和z是通过可迭代对象x利用iter方法得到的两个迭代器。

迭代器

迭代器内部持有一个状态,该状态用于记录当前迭代所在的位置,以方便下次迭代的时候获取正确的元素。不同于可迭代对象的宽泛,迭代器有具体的迭代器类型,比如list_iterator,set_iterator等(这些迭代器都可以通过相应的可迭代对象利用iter方法得到)。

迭代器必须含有__next__方法,但是迭代器又属于可迭代对象,所以迭代器必须含有__iter__方法和__next__方法。

生成器

生成器也是一种迭代器

若函数的定义体中有yield关键字,该函数就是生成器函数。调用生成器函数时,会返回一个生成器(generator)对象,即生成器函数是生成器产出的地方。

无论是迭代器还是生成器,都属于python语法糖的一部分,都是为了简洁实用的目标。

可迭代对象&迭代器&生成器的更多相关文章

  1. python 可迭代对象 迭代器 生成器总结

    可迭代对象 只要有魔法方法__iter__的就是可迭代对象  list和tuple和dict都是可迭代对象 迭代器 只要有魔法方法__iter__和__next__的就是可迭代对象 生成器 只要含有y ...

  2. Python--可迭代对象,迭代器,生成器

    记得在刚开始学Python的时候,看到可迭代对象(iterable).迭代器(iterator)和生成器(generator)这三个名词时,完全懵逼了,根本就不知道是啥意识.现在以自己的理解来详解下这 ...

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

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

  4. 深入理解python中可迭代对象,迭代器,生成器

    英文原文出处:Iterables vs. Iterators vs. Generators 在python学习中,通常会陷入对以下几个相关概念之间的确切差异的困惑中: a container(容器) ...

  5. 搞清楚 Python 的迭代器、可迭代对象、生成器

    很多伙伴对 Python 的迭代器.可迭代对象.生成器这几个概念有点搞不清楚,我来说说我的理解,希望对需要的朋友有所帮助. 1 迭代器协议 迭代器协议是核心,搞懂了这个,上面的几个概念也就很好理解了. ...

  6. python14 1.带参装饰器 | wrapper 了了解 # 2.迭代器 ***** # 可迭代对象 # 迭代器对象 # for迭代器 # 枚举对象

    ## 复习 '''函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.验证执行 开放封闭原则: 功能可以拓展,但源代码与调用方式都不可以改变 ...

  7. 11.Python初窥门径(函数名,可迭代对象,迭代器)

    Python(函数名,可迭代对象,迭代器) 一.默认参数的坑 # 比较特殊,正常来说临时空间执行结束后应该删除,但在这里不是. def func(a,l=[]): l.append(a) return ...

  8. Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器

    Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器 一丶关键字:global,nonlocal global 声明全局变量: ​ 1. 可以在局部作用域声明一 ...

  9. Python迭代器,可迭代对象,生成器

    迭代器 迭代器(iterator)有时又称游标(cursor)是程式设计的软件设计模式,可在容器物件(container,例如链表或阵列)上遍访的界面,设计人员无需关心容器物件的内存分配的实现细节. ...

随机推荐

  1. mongodb简单运用

    mongodb NoSQL(Not Only SQL),意思是"不仅仅是 SQL",指的是非关系型数据库,是对不同于传统的关系型数据库的数据库管理系统的统称. NoSQL 用于超大 ...

  2. Py层次递进与文件修改大程序,模块,name与file

    层次的递进与返回 #输入quit的时候返回上一阶层,输入exit退出所有的循环 tag=True while tag==True: level1=input('level1:') if level1= ...

  3. JavaScript——深入了解this

    前言 我曾以为func()其实就是window.func() function func(){ console.log('this : ' + this); } func();//this : [ob ...

  4. jQuery json遍历渲染到页面并且拼接html

    jQuery 处理 json遍历在页面中显示,并且拼接html. 1 <title>json多维数组遍历渲染</title> 2 3 <body> 4 <di ...

  5. yoctoproject 地址

    第一次接触到yoctop. 在这里分享yoctoproject地址 https://www.yoctoproject.org/docs/2.3.3/ref-manual/ref-manual.html ...

  6. "INVALID" is not a valid start token

    Search · is not a valid start token https://github.com/prometheus/prometheus/search?q=is+not+a+valid ...

  7. RAID系统被初始化

    RAID系统被初始化 https://forum.huawei.com/enterprise/zh/thread-256077-1-1.html

  8. c 越界 数组越界

    int main(int argc, char* argv[]){ int i = 0; int arr[3] = {0}; for(; i<=3; i++){ arr[i] = 0; prin ...

  9. (Oracle)数据库用户的密码过期时间如何修改为永不过期

    Oracle的密码过期规则是用Profile来管理的,系统默认只有一个Profile(DEFAULT),该profile的密码过期规则为180天.那么如何修改Oracle数据库用户的密码过期时间为永不 ...

  10. 本地代码上传GitHub

    0. 登录 git config --global user.name "GitHub用户名" git config --global user.email "GitHu ...