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

    可迭代对象具有一个iter()方法,可迭代对象调用__iter__()方法以后返回一个迭代器对象。也就是说一个迭代器  具有iter 和next方法

    以列表为例 a = [1,2,3,4]

         a.__iter__()   返回一个迭代器对象

         a.__iter__().__next__()  就可以进行迭代

    for i  in list: 的本质就是一个迭代器,它做的就是首先找到一个迭代器对象,iteration = list.__iter__(),然后 iteration.__next__()进行迭代

    一个迭代器的源码:

    class MyList(object):

      def __init__(self):
        self.items = []

      def add(self, item):
        self.items.append(item)

      def __iter__(self):
        my_iterator = MyIterator(self.items)
          return my_iterator

    class MyIterator(object):
      def __init__(self, container):
        self.i = 0
        self.container = container

      def __next__(self):
        if self.i < len(self.container):
          ret = self.container[self.i]
          self.i += 1
          return ret
        else:
          raise StopIteration

    my_list = MyList()   这个对象就可以就可以进行迭代

    my_list.add(100)

    my_list.add(200)

    for i in my_list:

      print i

    from collections import   iterator

    isinstance((my_list.iter()),iterator  )

    在pycharm 中返回false   因为迭代器本身也是一个可迭代对象,所以在class MyIterator(object): 还要定义一个iter方法,return  self  返回自身就可以。 

    所以一个迭代器本身的写法可以写成:

    class MyList2(object):
      def __init__(self):
        self.items = {}

     

      def __iter__(self):
        return self

     

      def __next__(self):
        pass

     忽略掉容器的概念,每一次通过数学计算的方法来获取数据,这样数据太大占用内存空间的问题就解决了

    1、  迭代是 访问集合元素的一种方式,生成器是一种特殊的迭代器
      迭代器是可以记住遍历的对象的位置。
      列表可以迭代,即遍历,但不是迭代器。
    2、通过__iter__方法我们可以把一个可迭代对象变成一个迭代器。
      f=[1,2,3,]
      iter(f)
    3、即 g =iter(f)
      next(g)
    ---------------------------------------------------------------------------------------------
    4、判断一个对象是否可以迭代
      from collections import Iterable
     
      isinstance([],Iterable)
     
      判断一个对象是否是迭代器
        from collections import Iterator
     
        isinstance([],Iterator)
    -------------------------------------------------------------------
    5、对象进行迭代的过程,过程中应该有一个“人”去记录每次访问到了第几条数据,以及位置,
      帮助我们进行数据迭代的“人”称为迭代器(Iterator)
     
      通过这个迭代器来依次获取对象中的每一个数据
    -------------------------------------------------------------------------------------------------
    6、list、tuple等都是可迭代对象,通过iter()函数获取这些可迭代对象的迭代器。
      然后我们可以对获取到的迭代器不断使用next()函数来获取下一条数据
    --------------------------------------------------------------------------------------------------
    7、iter()函数实际上就是调用了可迭代对象的__iter__方法。
      使用next()函数的时候,调用的就是迭代器对象的__next__方法,
      (Python3中是对象的__next__方法,Python2中是对象的next()方法)
    life is short,i need python
  • 相关阅读:
    printf()函数不能直接输出string类型
    HDU 6166.Senior Pan()-最短路(Dijkstra添加超源点、超汇点)+二进制划分集合 (2017 Multi-University Training Contest
    计蒜客 17119.Trig Function-切比雪夫多项式+乘法逆元 (2017 ACM-ICPC 亚洲区(西安赛区)网络赛 F)
    POJ 1195.Mobile phones-二维树状数组
    HDU 1541.Stars-一维树状数组(详解)
    ACM中常见错误对应表
    HDU 6112.今夕何夕-蔡勒公式 (2017"百度之星"程序设计大赛
    hdu 2126 Buy the souvenirs 二维01背包方案总数
    codevs 1017 乘积最大 dp
    bzoj 2705: [SDOI2012]Longge的问题 欧拉函数
  • 原文地址:https://www.cnblogs.com/lvhonglei-python/p/7204715.html
Copyright © 2011-2022 走看看