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

     在python中,但凡内部含有__iter__方法的对象,都是可迭代对象

    查看对象内部方法

    通过dir() 去判断一个对象具有什么方法

    s1 = 'alex'
    print(dir(s1))

    dir()会返回一个列表,这个列表中含有该对象的以字符串的形式所有方法名。这样我们就可以判断python中的一个对象是不是可迭代对象了:

    s1 = 'alex'
    i = 100
    print('__iter__' in dir(i))  # False
    print('__iter__' in dir(s1))  # True

    从字面意思来说:可迭代对象就是一个可以重复取值的实实在在的东西。

        从专业角度来说:但凡内部含有__iter__方法的对象,都是可迭代对象。

        可迭代对象可以通过判断该对象是否有’__iter__’方法来判断。

        可迭代对象的优点:

            可以直观的查看里面的数据。

        可迭代对象的缺点:

            1. 占用内存。

            2. 可迭代对象不能迭代取值(除去索引,key以外)。

        那么这个缺点有人就提出质疑了,即使抛去索引,key以外,这些我可以通过for循环进行取值呀!对,他们都可以通过for循环进行取值,其实for循环在底层做了一个小小的转化,就是先将可迭代对象转化成迭代器,然后在进行取值的。那么接下来,我们就看看迭代器是个什么鬼。

    迭代器

    1) 迭代器的定义

        从字面意思来说迭代器,是一个可以迭代取值的工具,器:在这里当做工具比较合适。

        从专业角度来说:迭代器是这样的对象:实现了无参数的__next__方法,返回序列中的下一个元素,如果没有元素了,那么抛出StopIteration异常.python中的迭代器还实现了__iter__方法,因此迭代器也可以迭代。 出自《流畅的python》

        那么对于上面的解释有一些超前,和难以理解,不用过于纠结,我们简单来说:在python中,内部含有'__Iter__'方法并且含有'__next__'方法的对象就是迭代器。

    2) 如何判断该对象是否是迭代器

        ok,那么我们有了这个定义,我们就可以判断一些对象是不是迭代器或者可迭代对象了了,请判断这些对象:str list tuple dict set range 文件句柄 哪个是迭代器,哪个是可迭代对象:

    o1 = 'alex'
    o2 = [1, 2, 3]
    o3 = (1, 2, 3)
    o4 = {'name': '太白','age': 18}
    o5 = {1, 2, 3}
    #f = open('file',encoding='utf-8', mode='w')
    print('__iter__' in dir(o1)) # True
    print('__iter__' in dir(o2)) # True
    print('__iter__' in dir(o3)) # True
    print('__iter__' in dir(o4)) # True
    print('__iter__' in dir(o5)) # True
    #print('__iter__' in dir(f)) # True
    # hsagn
    print('__next__' in dir(o1)) # False
    print('__next__' in dir(o2)) # False
    print('__next__' in dir(o3)) # False
    print('__next__' in dir(o4)) # False
    print('__next__' in dir(o5)) # False
    #print('__next__' in dir(f)) # True
    复制代码
    o1 = 'alex'
    o2 = [1, 2, 3]
    o3 = (1, 2, 3)
    o4 = {'name': '太白','age': 18}
    o5 = {1, 2, 3}
    f = open('file',encoding='utf-8', mode='w')
    print('__iter__' in dir(o1))  # True
    print('__iter__' in dir(o2))  # True
    print('__iter__' in dir(o3))  # True
    print('__iter__' in dir(o4))  # True
    print('__iter__' in dir(o5))  # True
    print('__iter__' in dir(f))  # True
    # hsagn
    print('__next__' in dir(o1))  # False
    print('__next__' in dir(o2))  # False
    print('__next__' in dir(o3))  # False
    print('__next__' in dir(o4))  # False
    print('__next__' in dir(o5))  # False
    print('__next__' in dir(f))  # True
    f.close()
    复制代码

    通过以上代码可以验证,之前我们学过的这些对象,只有文件句柄是迭代器,剩下的那些数据类型都是可迭代对象。

    可迭代对象如何转化成迭代器:

    l1 = [1, 2, 3, 4, 5, 6]
    obj = l1.__iter__() 
    # 或者 iter(l1)print(obj) 
    # <list_iterator object at 0x000002057FE1A3C8>

    迭代器怎么取值

    l1 = [1, 2, 3, 4, 5, 6]
    obj = l1.__iter__()
    for i in range(6):
        print(obj.__next__())

    可迭代对象与迭代器对比

    可迭代对象:

        是一个私有的方法比较多,操作灵活(比如列表,字典的增删改查,字符串的常用操作方法等),比较直观,但是占用内存,而且不能直接通过循环迭代取值的这么一个数据集。

        应用:当你侧重于对于数据可以灵活处理,并且内存空间足够,将数据集设置为可迭代对象是明确的选择。

        迭代器:

        是一个非常节省内存,可以记录取值位置,可以直接通过循环+next方法取值,但是不直观,操作方法比较单一的数据集。

  • 相关阅读:
    Java精通并发-自旋对于synchronized关键字的底层意义与价值分析以及互斥锁属性详解与Monitor对象特性解说【纯理论】
    线性表的链式存储结构
    Java精通并发-同步方法访问标志与synchronized关键字之间的关系
    Java精通并发-透过字节码理解synchronized关键字
    解决com.fasterxml.jackson.databind.JsonMappingException: No suitable
    mybatis绑定错误-- Invalid bound statement (not found)
    java.sql.SQLException: **** [SQLServer]对象名 "XXXX"无效
    Missing URI template variable 'XXXX' for method parameter of type String
    Unrecognized token 'XXXX': was expecting ('true', 'false' or 'null')
    ajax的data传参的两种方式
  • 原文地址:https://www.cnblogs.com/wind666/p/13555065.html
Copyright © 2011-2022 走看看