美文网首页
python 可迭代对象与迭代器和生成器

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

作者: llicety | 来源:发表于2018-02-28 21:30 被阅读0次
    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_函数

    相关文章

      网友评论

          本文标题:python 可迭代对象与迭代器和生成器

          本文链接:https://www.haomeiwen.com/subject/owoixftx.html