Python个人学习笔记 生成器与迭代器
迭代器
迭代器为可迭代对象,可以生成一系列值。等要用的时候才会把值取出来,比起列表更省空间。
可以生成迭代器的函数:iter()、zip()、map()、reversed()、itertools库里的各种函数等。


生成器
用来生成迭代器的函数。

迭代器甚至可以是无限的。


获取迭代器里的元素
①迭代器作为可迭代对象,可以用for循环遍历输出。

②也可以用next()函数一个一个取迭代器中的元素,
或者自带的__next__()方法。


③将迭代器转换为列表等。

④如果只想要某个元素或者某段切片,可以用islice()函数。
第一个参数为迭代器,后面的参数同range()函数的参数。


迭代器的性质
迭代器具有状态信息。到达序列末尾时迭代器耗尽。(一次性)
迭代器经常配合in / not in 判断某元素是否在迭代器内。

用in判断时,python会从第一个元素遍历可迭代对象直至找到或者到末尾。
第二次判断13是否在迭代器中时,由于已经遍历取出了31之前的数,所以已经不在迭代器中了,返回False,因为迭代器的每个元素是一次性的。
当想多次使用迭代器时,可以用tee()函数把迭代器拆分成互相独立的多个迭代器。
第二个参数为拆分的数量,不写时默认为2。
▲tee()函数会缓存原始可迭代对象中的元素,如果原始可迭代对象很大或者无限的,那么使用tee()函数可能会消耗大量的内存。

但是当原迭代器被取出元素时,会影响到拆分出来的迭代器。

神奇的是,子迭代器虽然相互独立,但会影响原迭代器。影响到了原迭代器,另一个子迭代器就会受影响。
可以看到原迭代器取出的元素子迭代器也同时被取出。所以拆分后不要用原迭代器为好。


对比列表和迭代器的内存消耗



把迭代器所有元素存到列表里内存消耗上升3倍。
(当然正规做法是回溯算法)