迭代器(iterator)协议

· 在Python中,支持迭代器协议就是实现对象的__iter__()和__next__()方法。

  1.__iter__()方法:返回迭代器对象本身;

2.__next__()方法:返回容器中的下一个元素,在结尾时引发Stoplteration异常终止迭代器。

可迭代对象(iterable)

·  实现了迭代器协议的对象,就是可迭代对象。

·  如何实现迭代器协议:对象内部定义了一个__iter__()方法。

·  在Python中,字符串、tuple、list、dict、set、文件都是可迭代对象。总之能用Python内置函数调用出__iter__()方法的,都是可迭代对象。

如下:

  1. # str1='hello'
  2. # list1=[1,2,3]
  3. # tup1=(1,2,3)
  4. # dic={'x':1}
  5. # s1={'a','b','c'}
  6. # f=open('a.txt','w',encoding='utf-8')

都能用__iter__()调试出来。

迭代器对象

· 迭代器对象:

指的是既内置有__iter__方法,又内置有__next__方法的对象。仅有文件才是迭代器对象
如下:
  1. # f=open('db.txt','rt',encoding='utf-8')
  2. # print(f.__next__())
  3. # print(f.__next__())
  4. # print(next(f))

迭代器的缺点

1.迭代器的取值不如按照索引的方式更灵活,因为它只能往后取不能往前退
2.无法预测迭代器值的个数
如下:
  1. name=['egon','alex_sb','wxx_sb']
  2. res=name.__iter__()
  3. print(res.__next__())
  4. print(name[0])

迭代器优点

  • 对于支持随机访问的数据结构:list、tuple等,迭代器和经典的for循环(索引访问)相比,并无优势,反而失去了索引值。不过可以使用内置函数enumerate()找回这个索引值。但对于无法随机访问的数据结构:set(),迭代器是唯一的访问元素的方式。
  • 省内存:迭代器不需要事先准备好整个迭代过程中的所有元素,仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或销毁。这也是迭代器的一大优点:适合用于遍历一个巨大的或无限的集合,比如几个G的文件。下面用斐波那契数列为例: 
    • 代码一直接在fab(max)中用print打印会导致函数的可复用性变差,因此fab返回None。其他函数无法获得fab函数返回的数列;
    • 代码二满足了可复用性的需求,但是占用了内存空间;
    • 代码三Fabs类通过next()不断返回数列的下一个,内存占用始终为常数。
      #代码一:
      def fab(max):
      L = []
      n, a, b = 0, 0, 1
      while n < max:
      L.append(b)
      a, b = b, a + b
      n = n + 1
      return L #代码二:
      def fab(max):
      n, a, b = 0, 0, 1
      while n < max:
      print b
      a, b = b, a + b
      n = n + 1
      #代码三:
      class Fab(object):
      def __init__(self, max):
      self.max = max
      self.n, self.a, self.b = 0, 0, 1 def __iter__(self):
      return self def next(self):
      if self.n < self.max:
      r = self.b
      self.a, self.b = self.b, self.a + self.b
      self.n = self.n + 1
      return r
      raise StopIteration()

Python里的迭代器的更多相关文章

  1. Python学习--07迭代器、生成器

    迭代 如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration). Python里使用for...in来迭代. 常用可迭代对象有 ...

  2. Python基础之迭代器和生成器

    阅读目录 楔子 python中的for循环 可迭代协议 迭代器协议 为什么要有for循环 初识生成器 生成器函数 列表推导式和生成器表达式 本章小结 生成器相关的面试题 返回顶部 楔子 假如我现在有一 ...

  3. python is、==区别;with;gil;python中tuple和list的区别;Python 中的迭代器、生成器、装饰器

    1. is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同 == 比较的是两个对象的内容是否相等 2. with语句时用于对try except finally 的优 ...

  4. Python之路迭代器协议、for循环机制、三元运算、列表解析式、生成器

    Python之路迭代器协议.for循环机制.三元运算.列表解析式.生成器 一.迭代器协议 a迭代的含义 迭代器即迭代的工具,那什么是迭代呢? #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的 ...

  5. python基础8 -----迭代器和生成器

    迭代器和生成器 一.迭代器 1.迭代器协议指的是对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2. ...

  6. Python - 三大器 迭代器,生层器,装饰器

    目录 Python - 三大器 迭代器,生层器,装饰器 一. 容器 二. 可迭代对象(iterable) 三. 迭代器 四. 生成器 五. 装饰器 1. 定义 六. 闭包 Python - 三大器 迭 ...

  7. python之路——迭代器和生成器

    阅读目录 楔子 python中的for循环 可迭代协议 迭代器协议 为什么要有for循环 初识生成器 生成器函数 列表推导式和生成器表达式 本章小结 生成器相关的面试题 返回顶部 楔子 假如我现在有一 ...

  8. 为什么在Python里推荐使用多进程而不是多线程

    转载  http://bbs.51cto.com/thread-1349105-1.html 最近在看Python的多线程,经常我们会听到老手说:"Python下多线程是鸡肋,推荐使用多进程 ...

  9. 为什么在Python里推荐使用多进程而不是多线程?

    最近在看Python的多线程,经常我们会听到老手说:“Python下多线程是鸡肋,推荐使用多进程!”,但是为什么这么说呢?   要知其然,更要知其所以然.所以有了下面的深入研究: 首先强调背景: 1. ...

随机推荐

  1. 【JZOJ5363】【NOIP2017提高A组模拟9.14】生命之树 Trie+启发式合并

    题面 45 在比赛中,我只想到了45分的暴力. 对于一个树中点对,相当于在他们的LCA及其祖先加上这个点对的贡献. 那么这个可以用dfs序+树状数组来维护. 100 想法 我想到了可能要用trie树来 ...

  2. MySQL语句错误及解决方案

    1.group by查询错误 ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contai ...

  3. oracle-表空间-用户-角色-权限

    概要图 概要图 一 表空间 1.1创建表空间 --问题:创建一个名为hp的表空间,指定数据文件为hp.dbf,大小为10m. create tablespace hp datafile 'C:\app ...

  4. NKOJ1469 通向自由的钥匙

    P1469通向自由的钥匙   时间限制 : 10000 MS   空间限制 : 65536 KB 问题描述 通向自由的钥匙被放n个房间里,这n个房间由n-1条走廊连接.但是每个房间里都有特别 的保护魔 ...

  5. 安装scrapy问题:-bash:scrapy:command not found

    但是可以import,于是添加python3.5到环境变量,搞定 export PATH=$PATH:/usr/local/python3./bin/

  6. Vue.js NPM 安装方法

    由于 npm 安装速度慢,本教程使用了淘宝的镜像及其命令 cnpm,安装使用介绍参照:使用淘宝 NPM 镜像. npm 版本需要大于 3.0,如果低于此版本需要升级它: # 查看版本 $ npm -v ...

  7. Node.js概述1

    为什么我们要学习Node.js? 认为: Node.js就学习一周,时间比较短,不重要 将来工作我后端又不用Node.js做,我们又java/python/php/c,为什么要在意它 Node.js接 ...

  8. C++ UNREFERENCED_PARAMETER函数的作用

    新建win32 application程序,会有这样一段代码 int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hP ...

  9. vuehomework1

    红黄蓝三个按钮,点击不同的按钮可以切换一个200*200的矩形框对应的颜色 <!DOCTYPE html> <html lang="en"> <hea ...

  10. 全面系统Python3入门+进阶课程

    全面系统Python3入门+进阶课程 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看的时候 ...