python 可迭代对象与迭代器和生成器

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_函数

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容