Python-迭代器/生成器

迭代器指的是迭代取值的工具,迭代是指一个重复的过程,每一次重复都是基于上一次结果而来
迭代提供了一种通用的不依赖索引的迭代取值方式
迭代是访问容器元素的一种方式

一.可迭代对象

但凡内置有__iter__方法的对象,都称为可迭代对象,可迭代的对象:str,list,tuple,dict,set,文件对象

二.迭代器对象

1既内置又__next__方法的对象,执行该方法可以不依赖索引取值

2.又内置有__iter__方法的对象,执行迭代器的__iter__方法得到的依然是迭代器本身

迭代器一定是可迭代对象,可迭代对象不一定是迭代器对象,文件对象本身就是一个迭代器对象

在python,能够被全局函数next调用,并且返回下一个值的对象,就是迭代器。

可迭代对象不一定是迭代器,迭代器都是可迭代对象

凡是可作用于 for 循环的对象都是 Iterable 类型;
凡是可作用于 next() 函数的对象都是 Iterator 类型
可迭代对象不一定是迭代器,迭代器都是可迭代对象
集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,
不过可以通过iter() 函数获得一个 Iterator 对象。
目的是在使用迭代器的时候,减少内存的占用。

生成器就是一种自定义的迭代器,本质为迭代器

但凡函数内包含yield关键字,调用函数不会执行函数体代码,会得到一个返回值,该返回值就是生成器对象

列表生成器(list generator)
列表推导式 —> 生成器
[ 列表推导式 ] --> (列表推导式) # 就会变成一个列表推导式

使用全局函数next,没调用一次next,返回下一个值,直到最后抛出异常也可以使用循环迭代generator
生成器对象也存在一个__next__魔方方法,等价于next全局函数

好处优点:节约内存

函数转换为列表生成器
当列表生成时,需要大量代码来完成时,不可能使用列表推导式,一般使用函数完成,如:(斐波那契数列)

斐波那契数列:
从第三个元素开始,每一个元素是前两个元素之和

如果函数中使用yield关键字,那么这个函数的返回值就是一个生成器

yield关键字的作用
|-- 具有return的功能,能够返回一个函数的值
|-- 当一个函数出现yield,那么这个函数就被调用执行,而是返回值是一个生成器
next它返回值,不断地返回被yield的值
|-- yield值之后,会记住当前位置,下一次next函数调用生成器的时候,会在记住的位置继续执行
yield:只能在函数内使用

1.yield提供了一种自定义迭代器的解决方案

2.yield可以保存函数的暂停的状态

3.yield对比return:相同点,都可以返回值,值得类型与个数没有限制,不同点:yield可以返回多次值,而return只能返回一次值函数就会结束

发布了16 篇原创文章 · 获赞 0 · 访问量 271

猜你喜欢

转载自blog.csdn.net/JOKERSNEAKER/article/details/105400569