- 迭代器
可以直接作用于for循环的数据类型有以下几种:
1.集合数据类型(list,tuple,set,str等)
2.generator,包括生成器和带yield的generator function
这些可以直接作用于for循环的对象统称为可迭代对象(可循环对象):Iterable。
可以使用isinstance()判断一个对象是否是Iterable对象。
from collections import Iterable
print(isinstance([],Iterable))
=>True
print(isinstance('abc',Iterable))
=>True
print(isinstance(1,Iterable))
=>False
生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIterator错误,表示无法继续返回下一个值了。
可以被next函数调用并不断返回下一个值的对象称之为迭代器:Iterator
可以直接作用于for循环的对象统称为可迭代对象:Iterable
判断迭代器最快方法,使用dir(object)只要其中包含next方法,那么他就是迭代器。也可以通过isinstance判断是不是一个Iterator对象。
print(dir([1,2,3]))
=>['__add__', '__class__', '__contains__', '__delattr__',
'__delitem__', '__dir__', '__doc__', '__eq__', '__format__',
'__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__',
'__iadd__', '__imul__', '__init__', '__init_subclass__',
'__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__',
'__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__reversed__', '__rmul__', '__setattr__', '__setitem__',
'__sizeof__', '__str__', '__subclasshook__', 'append', 'clear',
'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove',
'reverse', 'sort']
print(isinstance((x for x in range(5)),Iterator))#生成器一定是迭代器
=>True
生成器都是Iterator对象,但是list,dict,str虽然是Iterable,却不是Iterator。使用iter()可以将这些变成Iterator。
print(isinstance(iter([]),Iterator))
=>True