迭代器

作者: 裁尘的人儿 | 来源:发表于2020-09-18 18:44 被阅读0次
    #判断是否为可迭代(Iterable)对象:
    isinstance(***, Iterable)
    
    #判断是否为迭代器(Iterator)对象:
    isinstance(***, Iterator)
    

    1. 什么是迭代?
    迭代是访问集合元素的一种方式。

    可迭代对象有哪些?
    ==> 可以直接作用于 for 循环的数据类型:

    • 一类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等;
    • 一类是 generator ,包括生成器和带 yield 的generator function。

    ==> 这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable 。


    2. 什么是迭代器(iterator)?

    • 迭代器是一个可以记住遍历的位置的对象。
    • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
    • 迭代器只能往前不会后退。
    • 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。

    迭代器有哪些?

    • 生成器都是 Iterator 对象。
    • 生成器不但可以作用于 for 循环,还可以被 next() 函数不断调用并返回下一个值,直到最后抛出 StopIteration 错误表示无法继续返回下一个值了。
    • 但是,除了生成器,其他 list 、 dict 、 str 虽然是 Iterable ,却都不是 Iterator
    (i for i in range(7))是一个生成器对象
    #<generator object <genexpr> at 0x7f7e471ed550>
    
    [i for i in range(7)]是一个列表
    #[0, 1, 2, 3, 4, 5, 6]
    

    那如何将可迭代对象变成迭代器对

    象呢?
    ==> 使用 iter() 函数

    iter([])
    

    总结:

    • 凡是可作用于 for 循环的对象都是 Iterable 类型;
    • 凡是可作用于 next() 函数的对象都是 Iterator 类型
    • 集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不过可以通过 iter() 函数获得一个 Iterator 对象。

    使用迭代器

    迭代是Python最强大的功能之一,是访问集合元素的一种方式。

    迭代器是一个可以记住遍历的位置的对象。

    迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

    迭代器有两个基本的方法:iter() 和new()

    1. 创建迭代器:

    #1. 将 list 、 dict 、 str 等是 Iterable的数据类型编程迭代器对象:
    iter() 
    
    #2. 通过创建一个类来创建一个迭代器,把这个类作为迭代器使用。
    #怎么创建这个类:需要在类里实现两个方法 __iter__() 与 __next__() :
    #(如果你已经了解的面向对象编程,就知道类都有一个构造函数,Python 的构造函数为 __init__(), 它会在对象初始化的时候执行。)
    __iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。
    
    __next__() 方法(Python 2 里是 next())会返回下一个迭代器对象。
    
    创建一个返回数字的迭代器,初始值为 1,逐步递增 1:
    
    class MyNumbers:
      def __iter__(self):
        self.a = 1
        return self
     #无论何时创建迭代器都将调用_iter_()方法。这是用初始值对迭代器进行初始化的绝佳之处。
    #以后创建并使用这个迭代器对象的时候,iter(seq)就是等同于seq._iter_()
    
      def __next__(self):
        x = self.a
        self.a += 1
        return x
    #无论何时从迭代器中获取下一个值,都将调用_next_()方法。
    #以后出去,next(seq)就是等同于seq._next_()
    #相对于_next_()函数,_reversed_()按逆序创建一个迭代器。它以一个现有序列为参数,并将该序列中所有元素从尾到头以逆序排列生成一个新的迭代器。
    
     
    myclass = MyNumbers()
    myiter = iter(myclass)
     
    print(next(myiter))
    print(next(myiter))
    print(next(myiter))
    print(next(myiter))
    print(next(myiter))
    # 1
    # 2
    # 3
    # 4
    # 5
    

    2. 访问迭代器对象里的数据,有两种方式 :

    • next(iterator_object):
    • for循环:for x in (iterator_object)
    一、使用new函数一个一个迭代访问
    list=[1,2,3,4]
    it = iter(list)    # 创建迭代器对象
    print (next(it))   # 输出迭代器的下一个元素
    #1
    print (next(it))
    #2
    
    
    二、迭代器遍历:
    (1)迭代器对象可以使用常规for语句进行遍历:
    list=[1,2,3,4]
    it = iter(list)    # 创建迭代器对象
    for x in it:
        print (x, end=" ")
    #1 2 3 4
    
    (2)也可以使用next()进行遍历:
    import sys         # 引入 sys 模块
     
    list=[1,2,3,4]
    it = iter(list)    # 创建迭代器对象
     
    while True:
        try:
            print (next(it))
        except StopIteration:
            sys.exit()
    
    # 1
    # 2
    # 3
    # 4
    

    相关文章

      网友评论

          本文标题:迭代器

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