python的迭代器和生成器

一、迭代器

1、python中“迭代”的概念:即通过for循环遍历对象每一个元素的过程。

2、python中可迭代的数据类型有:list/dict/tuple/string/set/bytes。整形是不可迭代数据类型。可以通过collections模块的Iteable来进行判断。

python的迭代器和生成器

 

 3、迭代器是一个可以被遍历的对象,可以使用next()函数进行取数。迭代器从对象的第一个元素开始遍历按,随取随用,知道最后一个元素被遍历完。迭代器只可以向后遍历,不能回溯。可以使用iter()函数将可迭代对象转变成迭代器。因此如果想要将自己写的类变成一个迭代器,至少要实现__iter__()__next__()方法。

python的迭代器和生成器

 

 4、迭代器除了可以适用next()函数进行取数,还可以使用for循环进行遍历。

python的迭代器和生成器

 

 5、迭代器总结:迭代器表示的是一个元素流,可以把元素流看成一个有序序列,但是却不能提前知道序列的长度,只能通过next()函数来获取下一个元素,这样可以节省内存和空间。

6、如何区分可迭代对象和迭代器?

(1)可以用for循环进行遍历的对象就是可迭代对象。

(2)可以用next()函数取数的就是迭代器。

(3)所以迭代器一定是可迭代对象,可迭代对象不一定是迭代器。可迭代对象需要使用iter()函数转化,才能变成迭代器。

 

二、生成器

 

1、前文提到过range()函数的生成器特性,即生成器通常用于数据量大、随存随取随计算、需要断点保护累计的场景。假如range()函数的值是20的20次方,如果先将这个多数据生成,并存在内存中,显然不现实。如果引入生成器,就可以做到什么时候需要就在上次循环的基础上累加。生成器同样可以节约内存和空间。

2、生成器的创建方法

(1)使用()推导式。(前文有提到,集合是没有函数推导式的,是因为圆括号被占用作为生成器创建符了)。

  生成器一定是迭代器!所以可以适用next()方法进行遍历,也可以使用for循环进行遍历。

python的迭代器和生成器

 

 

  注意:前面提到生成器是累积的,所以上图的示例中使用for循环之后,遍历值是从3开始。

(2)使用yield函数

  使用yield函数可以将一个普通的函数变成生成器,程序运行到yield标记处会暂停,并保存当前断点的所有信息,并将使用yield标记的变量的值作为返回值。

python的迭代器和生成器

 

 

加入将上图yield标记值改成常量,则会得到如下结果。

 

python的迭代器和生成器

 

 

三、迭代器和生成器的异同

1、同

(1)都可以节约内存和空间

(2)随取随用的特点方便、灵活

2、异

(1)生成器一定是迭代器,可以使用迭代器的方法遍历;但迭代器不一定生成器

(2)生成器是断点保存的机制确保随取随用,而迭代器一般是将可迭代对象转变而成。

 

python的迭代器和生成器

上一篇:解决appium-doctor报 mjpeg-consumer cannot be found.


下一篇:Python发送的邮件设置收件人隐藏与显示