迭代器(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. 用CSS添加选中文字的背景色

  2. java.lang.NoSuchMethodError: org.apache.commons.io.FileUtils.copyInputStreamToFile(Ljava/io/InputStream;Ljava/io/File;)V

    昨天用的好好的,今天就不行了 也懒得搞 具体原因就是引用的问题 找了个能用的pom 直接贴过去完事儿

  3. drf作业01

    api\urls from django.conf.urls import url from . import views urlpatterns = [ url(r'^cars/$',views.C ...

  4. Linux 中查询 CPU 的核数的方法

    以一台 Linux 服务器为例.这台 Linux 包括两颗 Intel(R) Xeon(R) CPU E5-2630 v4 @ 2.20GHz CPU, 单颗 CPU 包括 10 个 cpu core ...

  5. 2018-8-10-如何移动-nuget-缓存文件夹

    title author date CreateTime categories 如何移动 nuget 缓存文件夹 lindexi 2018-08-10 19:16:51 +0800 2018-2-13 ...

  6. webpack学习之—— Code Spliting(代码分离)

    代码分离特性能够把代码分离到不同的 bundle 中,然后可以按需加载或并行加载这些文件.代码分离可以用于获取更小的 bundle,以及控制资源加载优先级,如果使用合理,会极大影响加载时间. 有三种常 ...

  7. 【笔记】http1.1支持的7种请求方法

    本文是本人复习http协议整理笔记,以备后续查阅. http1.1支持的7种请求方法:get.post.head.options.put.delete.trace 在internet应用中,最常用的请 ...

  8. php收集表单数据-$GET和$POST的区别

    学习笔记: $_GET 变量 预定义的 $_GET 变量用于收集来自 method="get" 的表单中的值. 从带有 GET 方法的表单发送的信息(例如:http://www.r ...

  9. Codeforces 451D

    题目链接 D. Count Good Substrings time limit per test 2 seconds memory limit per test 256 megabytes inpu ...

  10. ajax下载小于500M大文件【原】

    不推荐使用的FileReader 之前用FileReader读取下载文件,当文件超过1M浏览器就立即扑街了 // 文件下载 function download(blob, fileName) { va ...