zoukankan      html  css  js  c++  java
  • python 迭代

    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遍历的都是可迭代对象。
    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
    

    http://www.cnblogs.com/linhaifeng/articles/6133014.html#_label2

  • 相关阅读:
    JDBC连接效率问题
    如何配置Filter过滤器处理JSP中文乱码(转)
    Servlet生命周期与工作原理(转)
    ANR触发原理
    SystemServer概述
    Zygote总结
    ART、JIT、AOT、Dalvik之间有什么关系?
    谈谈android缓存文件
    Activity启动过程全解析
    tombstone问题分析
  • 原文地址:https://www.cnblogs.com/yangzhenwei123/p/6759287.html
Copyright © 2011-2022 走看看