欢迎光临散文网 会员登陆 & 注册

Python个人学习笔记 生成器与迭代器

2023-04-12 21:09 作者:ベレッタ  | 我要投稿

迭代器

迭代器为可迭代对象,可以生成一系列值。等要用的时候才会把值取出来,比起列表更省空间。

可以生成迭代器的函数:iter()、zip()、map()、reversed()、itertools库里的各种函数等。


生成器

用来生成迭代器的函数。


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


获取迭代器里的元素

①迭代器作为可迭代对象,可以用for循环遍历输出。


②也可以用next()函数一个一个取迭代器中的元素,

   或者自带的__next__()方法。

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

④如果只想要某个元素或者某段切片,可以用islice()函数。

   第一个参数为迭代器,后面的参数同range()函数的参数。


迭代器的性质

迭代器具有状态信息。到达序列末尾时迭代器耗尽。(一次性)

迭代器经常配合in / not in 判断某元素是否在迭代器内。


用in判断时,python会从第一个元素遍历可迭代对象直至找到或者到末尾。

第二次判断13是否在迭代器中时,由于已经遍历取出了31之前的数,所以已经不在迭代器中了,返回False,因为迭代器的每个元素是一次性的。


当想多次使用迭代器时,可以用tee()函数把迭代器拆分成互相独立的多个迭代器。

第二个参数为拆分的数量,不写时默认为2。

▲tee()函数会缓存原始可迭代对象中的元素,如果原始可迭代对象很大或者无限的,那么使用tee()函数可能会消耗大量的内存。

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


神奇的是,子迭代器虽然相互独立,但会影响原迭代器。影响到了原迭代器,另一个子迭代器就会受影响。

可以看到原迭代器取出的元素子迭代器也同时被取出。所以拆分后不要用原迭代器为好。

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

迭代器切片

把迭代器所有元素存到列表里内存消耗上升3倍。

(当然正规做法是回溯算法)



Python个人学习笔记 生成器与迭代器的评论 (共 条)

分享到微博请遵守国家法律