如果列表元素可以按照某种算法推算出来,可以在循环的过程中不断推算出后续的元素。这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

#将列表生成式的[]改为()得到generator,通过for循环得到generator的下一个返回值
g=(x*x for x in range (10))
for n in g:
print(n)
#用函数表示斐波那契数列的前n个数
def fib(n):
m,a,b=0,0,1
while m<n:
print(b)
a,b=b,a+b
m=m+1
return 'done'
print(fib(6))

可以直接作用于for循环的对象统称为可迭代对象:Iterable

#使用isinstance()判断一个对象是否是Iterable对象
from collections import Iterable
print(isinstance([],Iterable))
print(isinstance({},Iterable))
print(isinstance('abc',Iterable))
print(isinstance('',Iterable))
print(isinstance((x for x in range(10)), Iterable))

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

#使用isinstance()判断一个对象是否是Iteratro对象
from collections import Iterator
print(isinstance((x for x in range(10)),Iterator))
print(isinstance([], Iterator))
print(isinstance({},Iterator))
print(isinstance('abc',Iterator))

生成器都是Iterator对象,但listdictstr虽然是Iterable,却不是Iterator

listdictstrIterable变成Iterator可以使用iter()函数:

#使用iter()函数把list、dict、str等Iterable变成Iterator
from collections import Iterator
print(isinstance(iter([]),Iterator))
print(isinstance(iter({}),Iterator))
print(isinstance(iter('abc'),Iterator))

Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。

Python的for循环本质上就是通过不断调用next()函数实现的

最新文章

  1. nuget的搭建及多源冲突
  2. PHP基础之 错误处理 及 异常处理
  3. 瀑布流js排列
  4. spring boot实战(第十三篇)自动配置原理分析
  5. Dictionary中的结构体转出来
  6. badboy 之 查看回放结果
  7. android实现json数据的解析和把数据转换成json格式的字符串
  8. django + nginx + raspberypi + pidaro
  9. [转]100个经典C语言程序(益智类问题)
  10. (转)Jquery弹窗插件Lhgdialog的用法
  11. input file图片上传预览效果
  12. 关于破解Quartus
  13. Android开发 ---基本UI组件6 :只定义一个listView组件,然后通过BaseAdapter适配器根据数据的多少自行添加多个ListView显示数据
  14. Windows server 2012 R2 解决“无法完成域加入,原因是试图加入的域的SID与本计算机的SID相同
  15. Windows编程的本质
  16. MMON进程手工启动
  17. .NET Core 2.0 Cookie中间件 权限验证
  18. Ruby gem: Mac 系统下的安装与更新
  19. 群晖Nas中搭建Intellij Idea的LicenseServer服务
  20. 把Excel导入SQL server时出现错误

热门文章

  1. activiti学习第二天
  2. python魔法方法
  3. pandas Dataframe 取某行
  4. Java Web参考资料
  5. 关于Java流
  6. Vue非父子组件之间的传值
  7. 单链表查找第i个节点
  8. js 一些方法
  9. ubuntu 16.04 mysql5.7.17 开放远程3306端口
  10. 堆排序(Heapsort)