Python里的迭代器

摘要:
迭代器协议·在Python中,支持迭代器的协议是实现object__iter_()和__next__()方法。1.__ iter_()方法:返回迭代器对象本身;2.__next__()方法:返回容器中的下一个元素,并抛出Stopieration异常以终止末尾的迭代器。在Python中,字符串、元组、列表、dict、集合和文件都是迭代对象。
迭代器(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里的迭代器》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇synchronized 的真正含义jsp页面点击显示影藏div的一个方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Python 的音乐库

前言 其实处理这个用 Matlab 最方便,之前把 guitar-synthesizer 从 Matlab 移植到 Python,过程中更是体会到了这一点。不过 Matlab 安装包又大,启动又慢,还是收费软件。。平常也不怎么用得到,毕竟我也不搞算法、仿真。 所以还是,Python 真香hhh 库 音乐的时域处理 标准库有个 wave 模块,可以转成 w...

curl perl python get请求带请求头

curl get请求带请求头: curl -H "Authorization: Token 9ec341da308a60047b72f9766b5b98d0d819562c" -H 'Accept: application/json; indent=4' http://http://192.168.137.1:8000/api2/accounts/...

python 异常处理、进程

目录: 异常处理 python进程 python并发之多进程 一、异常处理(try...except...) 1、程序中难免出现错误,而错误分成两种: a.语法错误: View Code b.逻辑错误(逻辑错误) View Code 2、异常定义:异常就是程序运行时发生错误的信号。 在python中,错误触发的异常,是以异常追踪信息、异常类型、异常值三...

Shell终端收听音乐--网易云音乐命令行版

Musicbox:网易云音乐命令行版本 高品质网易云音乐命令行版本,简洁优雅,丝般顺滑,基于Python编写。 这款命令行的客户端使用 Python 构建,以 mpg123 作为播放后端: Vim 式的流畅操作,支持快捷键绑定 支持电台、收藏等各种特色功能 支持 OS X 及各类 Linux 发行版 安装Python2.* pacman -S pytho...

Python-类的继承

类的继承 面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。 需要注意的地方:继承语法class 派生类名(基类名)://... 基类名写作括号里,基本类是在类定义的时候,在元组之中指明的。 在python中继承中的一些特点: 1:在继承中基类的构造(__init__()方法)...

python(leetcode)-350两个数组的交集

给定两个数组,编写一个函数来计算它们的交集。 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出: [4,9] 说明: 输出结果中每个元素出现的次数,应与元素在两个数组中出...