1. '''
  2. 我们已经知道,可以直接作用于for循环的数据类型有以下几种:
  3. 一类是集合数据类型,如list、tuple、dict、set、str等;
  4. 一类是generator,包括生成器和带yield的generator function。
  5. 这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
  6. 可以使用isinstance()判断一个对象是否是Iterable对象:
  7. '''
  8. from collections import Iterable
  9. print(isinstance([],Iterable))
  10. print(isinstance({},Iterable))
  11. print(isinstance('abc',Iterable))
  12. print(isinstance(1234,Iterable))#常数不可迭代
  13. print(isinstance((x for x in range(10)), Iterable))
  14. '''
  15. 而生成器不但可以作用于for循环,
  16. 还可以被next()函数不断调用并返回下一个值,
  17. 直到最后抛出StopIteration错误表示无法继续返回下一个值了。
  18. * 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
  19. 可以使用isinstance()判断一个对象是否是Iterator对象:
  20. '''
  21. a=[1,2,3]
  22. print(dir(a))#可查看a所有的调用方法,a中无next()方法,所以不是迭代器
  23. from collections import Iterator
  24. print(isinstance((x for x in range(10)),Iterator))
  25. #生成器一定是迭代器,迭代器不一定是生成器
  26. print(isinstance([],Iterator))
  27. print(isinstance((),Iterator))
  28. print(isinstance({},Iterator))
  29. print(isinstance('abc',Iterator))
  30. '''
  31. 生成器都是Iterator对象,
  32. 但list、dict、str虽然是Iterable,却不是Iterator。
  33. 把list、dict、str等Iterable变成Iterator可以使用iter()函数:
  34. '''
  35. a=iter([1,2,3,4])
  36. print(a.__next__())
  37. print(a.__next__())
  38. print(a.__next__())
  39. print(isinstance(iter([]), Iterator))
  40. print(isinstance(iter(()), Iterator))
  41. print(isinstance(iter('abc123'), Iterator))
  42. '''
  43. 你可能会问,为什么list、dict、str等数据类型不是Iterator?
  44. 这是因为Python的Iterator对象表示的是一个数据流,
  45. Iterator对象可以被next()函数调用并不断返回下一个数据,
  46. 直到没有数据时抛出StopIteration错误。
  47. 可以把这个数据流看做是一个有序序列,
  48. 但我们却不能提前知道序列的长度,
  49. 只能不断通过next()函数实现按需计算下一个数据,
  50. 所以Iterator的计算是惰性的,
  51. 只有在需要返回下一个数据时它才会计算。
  52. Iterator甚至可以表示一个无限大的数据流,
  53. 例如全体自然数。而使用list是永远不可能存储全体自然数的。
  54.  
  55. 小结
  56. 凡是可作用于for循环的对象都是Iterable类型;
  57. 凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
  58. 集合数据类型如list、dict、str、tuple等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
  59. Python的for循环本质上就是通过不断调用next()函数实现的,例如:
  60. '''
  61. for x in [1, 2, 3, 4, 5]:
  62. pass
  63. #实际上完全等价于
  64. # 首先获得Iterator对象:
  65. it = iter([1, 2, 3, 4, 5])
  66. # 循环:
  67. while True:
  68. try:
  69. # 获得下一个值:
  70. x = next(it)
  71. except StopIteration:
  72. # 遇到StopIteration就退出循环
  73. break
  74.  
  75. print(range(5))#结果:range(0, 5),在python3range()是迭代器
  76. #在python2中,上式结果:[0,1,2,3,4],不是迭代器,用xrange(5)和python3结果相同,xrange()为迭代器
  77. #比如python3的文件读取也是用的迭代器 for in f:

  

python_68_迭代器的更多相关文章

  1. 匹夫细说C#:庖丁解牛迭代器,那些藏在幕后的秘密

    0x00 前言 在匹夫的上一篇文章<匹夫细说C#:不是“栈类型”的值类型,从生命周期聊存储位置>的最后,匹夫以总结和后记的方式涉及到一部分迭代器的知识.但是觉得还是不够过瘾,很多需要说清楚 ...

  2. 轻量级“集合”迭代器-Generator

    Generator是PHP 5.5加入的新语言特性.但是,它似乎并没有被很多PHP开发者广泛采用.因此,在我们了解PHP 7对Generator的改进之前,我们先通过一个简单却显而易见的例子来了解下G ...

  3. C#设计模式-迭代器模式

    一. 迭代器(Iterator)模式 迭代器是针对集合对象而生的,对于集合对象而言,必然涉及到集合元素的添加删除操作,同时也肯定支持遍历集合元素的操作,我们此时可以把遍历操作也放在集合对象中,但这样的 ...

  4. 设计模式(十):从电影院中认识"迭代器模式"(Iterator Pattern)

    上篇博客我们从醋溜土豆丝与清炒苦瓜中认识了“模板方法模式”,那么在今天这篇博客中我们要从电影院中来认识"迭代器模式"(Iterator Pattern).“迭代器模式”顾名思义就是 ...

  5. Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化

    本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解 ...

  6. 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。

    最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...

  7. Java迭代器

    迭代器在其实就是指针,读取集合或者数组中的一个值,读完以后又指向下一条数据. iterator() 迭代器只读,不能改效率要比for循环高 迭代器的一些方法: HasNext() 如果仍有元素可以迭代 ...

  8. Python 生成器与迭代器 yield 案例分析

    前几天刚开始看 Python ,后因为项目突然到来,导致Python的学习搁置了几天.然后今天看回Python 发现 Yield 这个忽然想不起是干嘛用的了(所以,好记性不如烂笔头.).然后只能 花点 ...

  9. 设计模式02迭代器(java)

    先贴代码,有空来写内容. 1.定义集合 import java.util.List; import java.util.ArrayList; //coollection是我自己定义的一个集合,因为要写 ...

随机推荐

  1. bzoj4873: [Shoi2017]寿司餐厅(最小割)

    传送门 大佬们是怎么一眼看出这是一个最大权闭合子图的……大佬好强->这里 1.把所有区间$(i,j)$看成一个点,如果权值大于0,则从$S$向他连边,容量为权值,否则从它向$T$连边,容量为权值 ...

  2. [Xcode 实际操作]三、视图控制器-(9)在Storyboard中使用标签和按钮控件

    目录:[Swift]Xcode实际操作 本文将演示标签和按钮在故事板中的应用. 在欢迎串口中,点击创建一个新的项目[Create a new Xcode project] [Single View A ...

  3. Google Guetzli是如何压缩图片的?

    你可能已经知道,现在网页文件的平均大小比Doom游戏的安装文件还还大. 文件变大的原因之一是图片的增加,并且还需要支持更高的分辨率. Google来拯救了 Google刚刚发布了一种新的JPEG压缩算 ...

  4. java8List集合根据对象的属性去重

    import static java.util.Comparator.comparingLong; import static java.util.stream.Collectors.collecti ...

  5. Webpack打包时警告 - Critical dependency: the request of a dependency is an expression

    关于解决 [Webpack] Critical dependency: the request of a dependency is an expression ------------------- ...

  6. rgb值转换成16进制

    由于jQuery获取css中的background有时候是rgb值,所以往往需要一个转换函数. 以前觉得难,还写个博客记录,现在觉得好容易. let testColor = "rgb(20, ...

  7. FileTest

    package com.yd.wmsc.util; import java.io.File; public class FileTest { public static void main(Strin ...

  8. Silverlight 登陆界面

    美术水平有限,不喜勿喷. 界面代码,效果如下图 <UserControl x:Class="ElecDemoTelerikSL.Login" xmlns="http ...

  9. 迷你迅雷+SqlServer2008r2下载

    迷你迅雷下载 http://down.sandai.net/mini/MiniThunderInstaller3.1.1.58.exe SqlServer 2008r2下载 ed2k://|file| ...

  10. Linux下mysql定时备份及恢复

    备份 1.数据库定时备份工作脚本:(日期时间作为名称的压缩文件,解压开是sql脚本) /root/backup/script/backup_mysql.sh 2.备份输出路径: /root/backu ...