什么是迭代器:

--迭代器(迭代就是循环)

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

可迭代对象有:

  • 一类是集合数据类型,如list,tuple,dict,set,str等

  • 一类是generator,包括生成器和带yield的generator function

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

但是必须可以被next() 函数调用并不断返回下一个值! 的  可迭代对象,才是迭代器

实现迭代器协议:

class Node:def __init__(self, value):self._value = valueself._children = []def __repr__(self):return 'Node({!r})'.format(self._value)def add_child(self, node):self._children.append(node)def __iter__(self):return iter(self._children)def depth_first(self):yield selffor c in self:yield from c.depth_first()root = Node(0)
child1 = Node(1)
child2 = Node(2)
root.add_child(child1)
root.add_child(child2)grandson1=Node(3)
grandson2=Node(4)
grandson3=Node(5)
child1.add_child(grandson1)
child1.add_child(grandson2)
child2.add_child(grandson3)for ch in root.depth_first():print(ch)
# 代码我理解的是意思是:root 是爷爷,他孩子是child1,child2,然后child1又有两个孩子Node(3),Node(4),child2只有一个孩子Node(5);
# 祖孙三代都是Node()对象
# Node(0)
# Node(1)
# Node(3)
# Node(4)
# Node(2)
# Node(5)
# depth_first()方法很重要,它首先返回自己本身并迭代每一个子节点并 通过调用子节点的 depth_first() 方法(使用 yield from 语句)返回对应元素。

yeild 和yeild from 区别

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 字符串
astr='ABC'
# 列表
alist=[1,2,3]
# 字典
adict={"name":"wangbm","age":18}
# 生成器
agen=(i for i in range(4,8))def gen(*args, **kw):for item in args:for i in item:yield inew_list=gen(astr, alist, adict,agen)
print(list(new_list))
# ['A', 'B', 'C', 1, 2, 3, 'name', 'age', 4, 5, 6, 7]# 字符串
astr='ABC'
# 列表
alist=[1,2,3]
# 字典
adict={"name":"wangbm","age":18}
# 生成器
agen=(i for i in range(4,8))def gen(*args, **kw):for item in args:yield from itemnew_list=gen(astr, alist, adict, agen)
print(list(new_list))
# ['A', 'B', 'C', 1, 2, 3, 'name', 'age', 4, 5, 6, 7]# 由上面两种方式对比,可以看出,yield from后面加上可迭代对象,他可以把可迭代对象里的每个元素一个一个的yield出来,对比yield来说代码更加简洁,结构更加清晰

Python实现迭代器协议相关推荐

  1. 第十六篇 Python之迭代器与生成器

    一.迭代器 一. 递归和迭代 生活实例说明什么是递归和迭代 A想去腾达大厦,问B怎么走路,B 说我不知道,我给你问问C,C也不知道,C又去问D,D知道,把路告诉了C,C又告诉B,B最后告诉A, 这就是 ...

  2. python六十四: 迭代器协议

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

  3. Python学习之迭代器协议

    文章目录 迭代(iteration) 可迭代(iterable) 迭代器(iterator) 迭代器协议(iterator protocol) 迭代器协议与 for 循环 迭代(iteration) ...

  4. 《Python Cookbook 3rd》笔记(4.4):实现迭代器协议

    实现迭代器协议 问题 你想构建一个能支持迭代操作的自定义对象,并希望找到一个能实现迭代协议的简单方法. 解法 目前为止,在一个对象上实现迭代最简单的方式是使用一个生成器函数.在 4.2 小节中,使用 ...

  5. python 迭代器协议_浅谈Python中的生成器和迭代器

    迭代器 迭代器协议 对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么返回一个异常来终止本次迭代.(只能往前走,不能往后退!) 迭代器对象 遵循了(实现了)迭代器协议的对象.(对象内 ...

  6. pythonfor循环遍历list_为什么for循环可以遍历list:Python中迭代器与生成器

    1 引言 只要你学了Python语言,就不会不知道for循环,也肯定用for循环来遍历一个列表(list),那为什么for循环可以遍历list,而不能遍历int类型对象呢?怎么让一个自定义的对象可遍历 ...

  7. python基础-------迭代器,生成器,协程函数

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

  8. Python之迭代器和生成器(Day17)

    一.可迭代对象(iterable) 刚才说过,很多容器都是可迭代对象,此外还有更多的对象同样也是可迭代对象,比如处于打开状态的files,sockets等等.但凡是可以返回一个迭代器的对象都可称之为可 ...

  9. python的迭代器无法输出值_python迭代器和生成器

    人生还早,谁能笑到最后呢,坚持吧! 1.迭代器协议 由于生成器自动实现了迭代器协议,我们有必要了解迭代器协议是什么,才能更好的理解生成器. 1)迭代器协议:对象要提供__next()__方法,它要么返 ...

最新文章

  1. leetcode算法题--二叉搜索树的后序遍历序列
  2. 绑定变量窥测(Bind Variable Peeking)
  3. Stack(栈 c++模版实现)
  4. java+jsp+网页制作,java+jsp+mysql网页制作总结(2)
  5. 安卓开发面试题!带着问题深入学习Handler,进阶学习资料!
  6. MSSQL如何在没有主键的表中删除重复数据
  7. 【java学习之路】(java SE篇)011.线程池
  8. KRPANO资源分析工具下载720THINK全景图
  9. 弱电工程施工规划实施
  10. 浏览器的使用方法,如何添加书签|常用网站|扩展程序?
  11. 十二进制加计数器-20151112
  12. py错误jupyter:某个缩进Unindent不匹配任何外部缩进 IndentationError: unindent does not match any outer indentation
  13. 高通wlan驱动之tgt_mgmt_txrx_rx_frame_handler函数
  14. 质量功能展开QFD成功案例解析
  15. 三种梯度下降算法的比较和几种优化算法
  16. [蓝桥杯国赛]客观题
  17. 微博点赞数等信息和公众号点赞数等信息爬取
  18. MRI血管造影技术之最大密度投影法(maximum intensity projection)重建
  19. 基于SSM的教学辅助平台(在线学习)系统的设计与实现
  20. Json与 String 转换

热门文章

  1. 理解C++ lvalue与rvalue
  2. 阿里云今日发布数据库产品HybridDB
  3. python调用钉钉API发送消息
  4. MHA故障切换和在线手工切换原理
  5. PowerShell图形化编程2-快速入门
  6. 算法导论——贪心算法:哈夫曼编码(霍夫曼编码)
  7. 2014第6周六退火车票
  8. Initialization SQL Statement – Custom 配置错误,导致无法加载FORM
  9. DR模式 mysqlABB读写分离
  10. Windows域内的时间同步