zoukankan      html  css  js  c++  java
  • python高级-迭代器(18)

    一、什么是迭代器

    • 迭代是访问集合元素的⼀种⽅式。
    • 迭代器是⼀个可以记住遍历的位置的对象。
    • 迭代器对象从集合的第⼀个元素开始访问,直到所有的元素被访问完结束。
    • 迭代器只能往前不会后退

    二、可迭代对象

    直接作⽤于 for 循环的数据类型有以下⼏种:

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

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

    三、判断是否可以迭代

    可以使⽤ isinstance() 判断⼀个对象是否是 Iterable 对象:

    #从collections.abc模块导入Iterable工具
    from collections.abc import Iterable
    #判断列表是否可以迭代
    print(isinstance([],Iterable))
    #判断字典是否可以迭代
    print(isinstance({},Iterable))
    #判断生成器是否可以迭代
    print(isinstance((x for x in range(1,10)),Iterable))
    #判断字符串是否可以迭代
    print(isinstance("abc",Iterable))
    #判断整形是否可以迭代
    print(isinstance(100,Iterable))

    运行结果为:

    True
    True
    True
    True
    False

    可以看出,列表、字典、生成器、字符串都是可以被迭代的,而整形常量不可以被迭代

    四、迭代器

    可以被next()函数调⽤并不断返回下⼀个值的对象称为迭代器:Iterator。
    可以使⽤ isinstance() 判断⼀个对象是否是 Iterator 对象:

    #从collections.abc模块导入Iterator工具
    from collections.abc import Iterator
    #判断列表是否可以迭代
    print(isinstance([],Iterator))
    #判断字典是否可以迭代
    print(isinstance({},Iterator))
    #判断生成器是否可以迭代
    print(isinstance((x for x in range(1,10)),Iterator))
    #判断字符串是否可以迭代
    print(isinstance("abc",Iterator))
    #判断整形是否可以迭代
    print(isinstance(100,Iterator))

    运行结果为:

    False
    False
    True
    False
    False

    注意:

    • 判断是否可以被迭代使用的是 Iterable,而判断是否是迭代器使用的是 Iterator,不一样的 。
    • 生成器也是迭代器
    • 列表、字典、字符串虽然可以被迭代,但是不是迭代器,这就说明了,迭代器一定可以迭代,但是可以迭代的不一定是迭代器。这个道理就和鱼会游泳,但是会游泳的不一定是鱼,一个道理。

    五、iter()函数

    ⽣成器是迭代器对象,但列表、字典 、字符串虽然是可迭代的,却不是迭代器。把列表、字典、字符串等可迭代对象变成迭代器可以使⽤ iter() 函数:

    #从collections.abc模块导入Iterator工具
    from collections.abc import Iterator
    #没有使用iter()函数
    print(isinstance([],Iterator))
    print(isinstance("abc",Iterator))
    
    #使用iter()函数
    print(isinstance(iter([]),Iterator))
    print(isinstance(iter("abc"),Iterator))

    运行结果为:

    False
    False
    True
    True

     

    六、使用迭代器完成for循环的底层实现

    for x in [1,2,3,4,5]:
        print(x)
    
    #完全等价于
    
    # 首先获得Iterator对象:
    it = iter([1, 2, 3, 4, 5])
    # 循环:
    while True:
        try:
            # 获得下一个值:
            x = next(it)
            print(x)
        except StopIteration:
            # 遇到StopIteration就退出循环
            break

    总结

    • 凡是可作⽤于 for 循环的对象都是 Iterable 类型;
    • 凡是可作⽤于 next() 函数的对象都是 Iterator 类型
    • 集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不过可以通过 iter() 函数获得⼀个 Iterator 对象。
    • 迭代器对象就是实现了iter() 和 next()方法的对象.其中iter()返回迭代器本身,而next()返回容器的下一个元素,在结尾处引发StopInteration异常.
    • 迭代器的优点:省内存.它是一种通过延时创建的方式生成一个序列,只有在需要的时候才被创建.
    • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问结束,只能往前不能后退

     

     

  • 相关阅读:
    Binary Tree Inorder Traversal
    Populating Next Right Pointers in Each Node
    Minimum Depth of Binary Tree
    Majority Element
    Excel Sheet Column Number
    Reverse Bits
    Happy Number
    House Robber
    Remove Linked List Elements
    Contains Duplicate
  • 原文地址:https://www.cnblogs.com/Se7eN-HOU/p/10715501.html
Copyright © 2011-2022 走看看