简简单单说下迭代器 (iterator)

迭代器(iterator)

首先我们需要了解几个概念,容器,可迭代对象

可迭代对象

最简单的定义就是:可以使用for…in…语句进行循环遍历的对象
比如字符串for i in str1:
列表for i in list1:
元组 for i in tup1:
字典以及迭代器、生成器都是可迭代对象。

想深入了解的可以看下面:
https://blog.csdn.net/xun527/article/details/76652119

容器(container)

容器把多个元素组织在了一起,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中。
通常把所有的元素存储在内存中(也有一些特例,并不是所有的元素都放在内存,比如迭代器和生成器对象)

在Python中,常见的容器对象有:

list, deque, ….
set, frozensets, ….
dict, defaultdict, OrderedDict, Counter, ….
tuple, namedtuple, …
str

容器比较容易理解,因为你就可以把它看作是一个盒子、一栋房子、一个柜子,里面可以塞任何东西。从技术角度来说,当它可以用来询问某个元素是否包含在其中时,那么这个对象就可以认为是一个容器,比如 list,set,tuples都是容器对象

什么是迭代器呢?

它是一个带状态的对象,他能在你调用next()方法的时候返回容器中的下一个值,任何实现了__iter__和__next__() 方法的对象都是迭代器
__iter__返回迭代器自身
__next__返回容器中的下一个值

如果容器中没有更多元素了,则抛出StopIteration异常,如果不抛出异常,由于容器中已经没有值了,系统会不停地返回None(抽风一样)

它有什么用处?

其实意思就是,不管你用的是链表,2叉树、3叉树、N叉树,还是向量。
迭代器都可以让你从first开始,使用next,到达last,而且一个不漏滴都走一遍。

你不必知道在next的时候,迭代器是怎样从当前节点跳到下一个节点的。

就和猴子一样,你不必知道猴子是怎样从这个树的节点跳到那个树的!总之,猴子可以把树的所有节点跳一边(再次强调:一个不漏)

迭代器是:
无论你用的是什么结构(链表也好、数组也好、数也好、图也好、hash表也好),总之, 你可以不关心任何细节遍历细节,(下面看好了) 从一个起点(begin)触发到达,到达终点(end),并且保证每个节点都能走到且只走一次。

使用迭代器不要求事先准备好整个迭代过程中的所有元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后元素可以不存在或者被销毁。因此迭代器适合遍历一些数量巨大甚至无限的序列!!!!

这里用斐波那契数列做个小说明

class Fib:
    def __init__(self):  #创建类,初始化时被调用,里面放着(传入)的参数
        self.prev = 0
        self.curr = 1

    def __iter__(self):  #表示对象可迭代,返回自己本身
        return self

    def __next__(self):
        value = self.curr
        self.curr += self.prev
        self.prev = value
        return value

>>> f = Fib()
>>> list(islice(f, 0, 10))
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

Fib既是一个可迭代对象(因为它实现了__iter__方法),又是一个迭代器(因为实现了__next__方法)。
每次调用next()方法的时候做两件事:

1.为下一次调用next()方法修改状态
2.为当前这次调用生成返回结果

迭代器就像一个懒加载的工厂,等到有人需要的时候才给它生成值返回,没调用的时候就处于休眠状态等待下一次调用。

1.容器是一系列元素的集合,str、list、set、dict、file、sockets对象都可以看作是容器,容器都可以被迭代(用在for,while等语句中),因此他们被称为可迭代对象。
2.可迭代对象实现了__iter__方法,该方法返回一个迭代器对象。
3.迭代器持有一个内部状态的字段,用于记录下次迭代返回值,它实现了__next____iter__方法,迭代器不会一次性把所有元素加载到内存,而是需要的时候才生成返回结果。

迭代器深入了解:
http://python.jobbole.com/87805/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值