zoukankan      html  css  js  c++  java
  • 19-python基础8-可迭代对象、迭代器

    1 迭代

      迭代就是重复做一件事,并且执行时依赖于上一次执行的结果

    2 什么是迭代器协议

    1. 迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退)
    2. 可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法)
    3. 协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象。

    3 迭代器

         通常情况下,如list和tuple这类容器,是以序列存储的,存在索引(下标),可以通过索引来遍历。但有一些不存在索引,如无序的set和dict,文件。那我们就该如何遍历。这就需要迭代器了。
         迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素(且不依赖索引),每个迭代器对象代表容器中的确定的地址。
    迭代器描述的是一个重复的概念。

    迭代器的作用:

    1. 不通过索引将对象里的内容取出来;
    2. 迭代器就是一个内存地址,next()一次取一个值,同一时刻只有一个值,是惰性计算,更省内存。

    缺点:

    1. 无法获取迭代器的长度,使用不如列表灵活。
    2. 迭代器是一次性的,只能向后取值。

    4 Python中的循环

      对象实现了迭代器协议,就能用for循环所有对象。
      换句话就是,能被for遍历的都是可迭代对象。
      for循环的本质是:调用可迭代对象的__iter__()方法,将可迭代对象变成迭代器,再每一次循环调用对象的__next__()方法,直到遇到StopIteration,并捕捉该异常。结束for循环。

    4.1 先看看不用for,用while遍历迭代是什么怎样的

      只要对象本身有__iter__(),就是可迭代的对象。

    dic={"a":1,"b":"2","c":3,"d":4}
    i=dic.__iter__() #等同于i=iter(dic)
    dic.__iter__()返回值i是一个迭代器。

      只要是迭代器,都有一个__next__()方法,来返回下一个值,直到遇到StopIteration。

    i.__next__() #等价于next(i)
    dic={"a":1,"b":"2","c":3,"d":4}
    i=dic.__iter__()
    while True:
        try:
            print(next(i))
        except StopIteration:
            break
    
    result:
    a
    b
    c
    d

    4.2 python中提供了一个更强大的功能for。

    dic={"a":1,"b":"2","c":3,"d":4}
    i=dic.__iter__()
    for x in i:
        print(x)
    
    result:
    a
    b
    c
    d

    等同于上面的while循环

    dic={"a":1,"b":"2","c":3,"d":4}
    for x in dic:
        print(x)
    
    result:
    a
    b
    c
    d

          打印的和上面结果一样,也就是说for变量的对象可以是迭代器,也可以是可迭代的对象。for会将要遍历的对象先调用dic=dic.__iter__()转换成迭代器,再遍历出来。
    总结:能被for遍历的都是可迭代的对象。

    注意:

    dic={"a":1,"b":"2","c":3,"d":4}
    for x in dic:
        print(x)
    for x in dic:
        print(x)
    
    result:
    a
    b
    c
    d

    第二次for循环并没有打印,所以说迭代器是一次性的,打印完了就没值了。

    5 判断一个对象是否是迭代器或可迭代的对象

    需要用到collections模块中的Iterable、Iterator。

    from collections import Iterable,Iterator
    dic={"a":1,"b":"2","c":3,"d":4}
    i=dic.__iter__()
    print(isinstance("aaa",Iterable))
    print(isinstance("aaa",Iterator))
    print("------")
    print(isinstance(dic,Iterable))
    print(isinstance(dic,Iterator))
    print("------")
    print(isinstance(i,Iterable))
    print(isinstance(i,Iterator))
    
    
    result:
    True
    False
    ------
    True
    False
    ------
    True
    True
  • 相关阅读:
    Do You See Me? Ethical Considerations of the Homeless
    ELDER HOMELESSNESS WHY IS THIS AN ISSUE?
    Endoflife support is lacking for homeless people
    html内联框架
    html字体
    html块 div span
    html列表
    html表格
    SQL Server管理员专用连接的使用   作为一名DBA,经常会处理一些比较棘手的服务无响应问题,鉴于事态的严重性,多数DBA可能直接用“重启”大法,以便尽快的恢复生产环境的正常运转,但是多数情况
    如何配置最大工作线程数 (SQL Server Management Studio)
  • 原文地址:https://www.cnblogs.com/NewTaul/p/7049479.html
Copyright © 2011-2022 走看看