迭代器和生成器
一,什么是迭代协议
-
迭代器是用来访问集合元素内部的一种方式,一般用来遍历数据
-
迭代器和访问下表的访问方式不一样,迭代器是不能返回的,迭代结束就没有值了,迭代器提供了一种惰性生成数据的方式
from collections import Iterable, Iterator
二,迭代对象和迭代器区别
可迭代对象
:实现了 __ iter __() 这个魔法方法
迭代器
:实现了 __ next __ 和 __ iter __ 这两个魔法方法
__ next __
返回下一个可用的元素,如果没有元素了,抛出 StopIteration异常
__ iter __
返回 self,以便在应该使用可迭代对象的地方使用迭代器,例如在 for 循环中。
内置的 iter 函数有以下作用。
(1)检查对象是否实现了 __iter__
方法,如果实现了就调用它,获取一个迭代器。
(2)如果没有实现 iter 方法,但是实现了 __getitem__
方法,Python 会创建一个迭代器,尝试按顺序(从索引 0 开始)获取元素。
(3)如果以上两者都没有,抛出异常
序列能够迭代的原因:实现了 __ getitem __()
- 迭代器和可迭代对象的关系:Python 从可迭代对象中获取迭代器
四,生成器的使用
在Userlist里面查看python的list的源码
from collections import UserList
五,python读取大文件
读取大文件数据,比如说一个T
-
有很多行的时候,使用文件句柄
f = open() for line in f: pass
-
所有数据连成一行(使用生成器)
uwgesg{|}jegnjgj;sgnsjnegjnsjrn;ghnsdbjlsljdrnlkghesw{|}g561rhd16hd23hwsewdhg5sdg{|}dnwankd;kalfklan;lgnjegjakjdajkvandvlkjaegi{|}564456566g65egsg{|}dwadwadawd
def my_read_lines(f, split_sign): buf = "" while True: while split_sign in buf: pos = buf.index(split_sign) yield buf[:pos] buf = buf[pos + len(split_sign):] chunk = f.read(4096*10) if not chunk: # 已经读到了文件结尾 yield buf break buf += chunk with open(r'text.txt', 'r', encoding='gbk') as f: for line in my_read_lines(f, '{|}'): print(line)