一:什么是迭代器协议

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

2.可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个_iter_()方法)

3.协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min函数等)使用迭代器协议访问对象。

二:for循环机制

1.for循环机制的本质:循环所有对象,全部都是使用迭代器协议。

三:什么是生成器

1.生成器,可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己内置的_iter_方法),所以生成器就是可迭代对象。

2.生成器分类:在python中有两种表现形式(python有两种不同的方式提供生成器)

【1】生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果,yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便于下次从它离开的地方继续执行。

 def test():
yield 1
yield 2
yield 3
res=test()
print(res)
print(res.__next__())
print(res.__next__())
#结果:<generator object test at 0x0000023E254BD8E0>
#
#

【2】生成器表达式:类似于列表推导,但是生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表。

 laomuji=('鸡蛋%d' %i for i in range(10))
print(laomuji)
print(laomuji.__next__())
print(laomuji.__next__())
print(laomuji.__next__())
print(next(laomuji))
print(next(laomuji))
#结果:<generator object <genexpr> at 0x0000015F1262D8E0>
# 鸡蛋0
# 鸡蛋1
# 鸡蛋2
# 鸡蛋3
# 鸡蛋4

3.列表解析:

 egg_list=[]
for i in range(10):
egg_list.append('鸡蛋%d' %i)
print(egg_list)
#结果:['鸡蛋0', '鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4', '鸡蛋5', '鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9'] 列表解析:
l=['鸡蛋%d' %i for i in range(10)]
print(l)
#结果:['鸡蛋0', '鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4', '鸡蛋5', '鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9']
#列表解析将即将生成的列表结果放前面,for循环放在后面 三元表达式:(三个操作,for循环前面是一个,for循环是一个,if条件这是一个)
l1=['鸡蛋%d' %i for i in range(10) if i>5 ]
print(l1)
#结果:['鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9']
#没有四元表达式

总结:

1.把列表解析的[]换成()得到的就是生成器表达式

2.列表解析与生成器表达式都是一种便利的变成方式,只不过生成器表达式更加节省内存

3.Python不但使用迭代器协议让for循环更加通用。大部分内置函数也是使用迭代器协议访问对象的。例如,sum函数是Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议,所以,我们可以直接计算一系列值得和:

 sum(x**2 for x in range(4))

而不用多此一举的先构造一个列表:

 sum([x**2 for x in range(4)])

最新文章

  1. 一些Matlab函数的使用
  2. 字符加密Cipher(bzoj 1031)
  3. 【dubbo】zookeeper搭建
  4. WebService 基本操作
  5. Shell脚本语言与编译型语言的差异
  6. Windows与Linux下文件操作监控的实现
  7. 人在江湖飘,哪能不挨刀。CENTOS之后,UBUNTU,FEDORA都要安装起来作测试啊
  8. W3C词汇和术语表
  9. 简单使用NSURLConnection、NSURLRequest和NSURL
  10. @JoinTable和@JoinColumn
  11. GDAL库学习笔记(1):无缝拼接Google卫星图
  12. jQuery 的 ready 函数是如何工作的?(源码分析)
  13. STM32的LED驱动程序
  14. 团队作业10--事后分析(Beta版本)
  15. Linux显示所有运行中的进程
  16. Day17 Django的基础使用和结构
  17. IBM x3850 RAID5数据恢复过程
  18. 设计模式之组合模式——Java语言描述
  19. Python内置函数(34)——isinstance
  20. Unity3D开发之3D按钮的声音播放

热门文章

  1. git命令之切换分支
  2. Spark aggregateByKey函数
  3. 「雕爷学编程」Arduino动手做(14)——倾斜角度模块
  4. Oracle细粒度审计
  5. python3.x 基础八:socket网络编程
  6. windows package.json设置多个环境变量
  7. Puppeteer笔记(七):Puppeteer切换浏览器TAB页
  8. 【转】团队项目的Git分支管理规范
  9. [优文翻译]003.你应避免的移动开发APP的5个细节(5 Things to Avoid while Developing Your Next Mobile App)
  10. python 验证码处理