from collections import Iterable, Iterator
a = [1, 2, 3]
class A(object):
def __init__(self):
pass
print isinstance(A(), Iterable)
输出:
False
from collections import Iterable, Iterator
a = [1, 2, 3]
class A(object):
def __init__(self):
pass
def __iter__(self):
return None
obj_a = A()
print isinstance(obj_a, Iterable)
for i in obj_a:
print i
输出:
True
TypeError: iter() returned non-iterator of type 'NoneType'
对比上面两个例子,可以得出有_iter_方法的对象就是可迭代对象, 但是可迭代对象不一定就可以用for 循环去迭代获取对象中的数据,比如上例中有_iter_中的的A(),就不能用在for循环中,因为_iter_\返回的不是一个迭代器对象。
上例中的for i in A(),也说明了一个python 魔法,那就是for 循环一个对象的时候,会调用iter函数生成一个迭代器对象,然后遍历这个可迭代的对象。 将上面的例子改成如下:
from collections import Iterable, Iterator
a = [1, 2, 3]
class A(object):
def __init__(self):
pass
def __iter__(self):
return iter(a)
obj_a = A()
print isinstance(obj_a, Iterable)
for i in obj_a:
print i
输出:
true
1
2
3
python中有很多原生的数据结构就是可迭代对象,比如容器中的list set等都是可迭代对象
a = [1, 2, 3]
print type(a)
print isinstance(a, Iterable)
输出:
<type 'list'>
True
总结: 就有_iter_方法的对象就是可迭代对象,但是只有_iter_方法返回的是迭代器对象,那么这个可迭代对象才可以用于for循环
迭代器对象:具有_iter_方法,且_iter_返回自身self;并且就有_next_方法,_next_方法返回下一个元素。
上面说到list对象通过iter函数会生成一个迭代器对象
a = [1, 2, 3]
print type(a)
print isinstance(a, Iterable)
print isinstance(a, Iterator)
print isinstance(iter(a), Iterator)
输出:
<type 'list'>
True
False
True
实验说明,list本身不是迭代器对象,但是通过iter函数后,返回的是迭代器对象。
for 循环可迭代对象,就是调用了iter()函数,生成迭代器对象,然后调用迭代器对象的_next_函数
网友评论