一、迭代器
1、python中“迭代”的概念:即通过for循环遍历对象每一个元素的过程。
2、python中可迭代的数据类型有:list/dict/tuple/string/set/bytes。整形是不可迭代数据类型。可以通过collections模块的Iteable来进行判断。
3、迭代器是一个可以被遍历的对象,可以使用next()函数进行取数。迭代器从对象的第一个元素开始遍历按,随取随用,知道最后一个元素被遍历完。迭代器只可以向后遍历,不能回溯。可以使用iter()函数将可迭代对象转变成迭代器。因此如果想要将自己写的类变成一个迭代器,至少要实现__iter__()
和__next__()
方法。
4、迭代器除了可以适用next()函数进行取数,还可以使用for循环进行遍历。
5、迭代器总结:迭代器表示的是一个元素流,可以把元素流看成一个有序序列,但是却不能提前知道序列的长度,只能通过next()函数来获取下一个元素,这样可以节省内存和空间。
6、如何区分可迭代对象和迭代器?
(1)可以用for循环进行遍历的对象就是可迭代对象。
(2)可以用next()函数取数的就是迭代器。
(3)所以迭代器一定是可迭代对象,可迭代对象不一定是迭代器。可迭代对象需要使用iter()函数转化,才能变成迭代器。
二、生成器
1、前文提到过range()函数的生成器特性,即生成器通常用于数据量大、随存随取随计算、需要断点保护累计的场景。假如range()函数的值是20的20次方,如果先将这个多数据生成,并存在内存中,显然不现实。如果引入生成器,就可以做到什么时候需要就在上次循环的基础上累加。生成器同样可以节约内存和空间。
2、生成器的创建方法
(1)使用()推导式。(前文有提到,集合是没有函数推导式的,是因为圆括号被占用作为生成器创建符了)。
生成器一定是迭代器!所以可以适用next()方法进行遍历,也可以使用for循环进行遍历。
注意:前面提到生成器是累积的,所以上图的示例中使用for循环之后,遍历值是从3开始。
(2)使用yield函数
使用yield函数可以将一个普通的函数变成生成器,程序运行到yield标记处会暂停,并保存当前断点的所有信息,并将使用yield标记的变量的值作为返回值。
加入将上图yield标记值改成常量,则会得到如下结果。
三、迭代器和生成器的异同
1、同
(1)都可以节约内存和空间
(2)随取随用的特点方便、灵活
2、异
(1)生成器一定是迭代器,可以使用迭代器的方法遍历;但迭代器不一定生成器
(2)生成器是断点保存的机制确保随取随用,而迭代器一般是将可迭代对象转变而成。