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异常.
    • 迭代器的优点:省内存.它是一种通过延时创建的方式生成一个序列,只有在需要的时候才被创建.
    • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问结束,只能往前不能后退

     

     

  • 相关阅读:
    标签平滑Label Smoothing
    py 中传参时**符号学习
    RoBERTa模型学习
    获取bert所有隐层的输出
    json.dumps||ensure_ascii
    nn.LSTM输入、输出、参数及pad
    py中的heapq操作
    fastnlp中的CRF补齐的padding?
    P3393 逃离僵尸岛 最短路dijkstra
    P2057 [SHOI2007]善意的投票 最小割
  • 原文地址:https://www.cnblogs.com/Se7eN-HOU/p/10715501.html
Copyright © 2011-2022 走看看