currPath = os.path.dirname(os.path.abspath(__file__)) with open(currPath+'/model.py') as file: print(isinstance(file, Iterable)) # true 文件对象是可迭代的
iter()方法
包含__iter__方法的可以使用内置的iter()函数调用并转化成Iterator对象
1 2 3 4 5 6
classIterObj: def__iter__(self): return self it = IterObj() print(iter(it))
这里使用iter()函数将 IterObj 的实例转换一下:
1 2 3 4
Traceback (most recent call last): File "<ipython-input-5-1e3a4bca5dfa>", line 7, in <module> print(iter(it)) TypeError: iter() returned non-iterator of type 'IterObj'
currPath = os.path.dirname(os.path.abspath(__file__)) with open(currPath+'/model.py') as file: print(isinstance(file, Iterator)) # true 文件对象是迭代器
迭代器可以使用next()函数进行调用
1 2 3
it = IterObj() next(it) # 1 next(it) # 2
生成器(Generator)
生成器既是可迭代的也是迭代器
定义生成器有两种方式:
列表生成器
使用yield定义生成器函数
第1种
1 2 3 4 5 6 7
from collections.abc import Iterable, Iterator, Generator
g = (i for i in range(10)) print(g) # <generator object <genexpr> at 0x110829ca8> print(isinstance(g, Iterable)) # true print(isinstance(g, Iterator)) # true print(isinstance(g, Generator)) # true 是一个生成器
列表生成器可以不需要消耗大量的内存来生成一个巨大的列表,只有在需要数据的时候才会进行计算。
第2种情况
1 2 3 4 5 6
defgen(): for i in range(10): yield i g = gen() print(next(g)) # 0 print(next(g)) # 1