Python实现迭代器协议
什么是迭代器:
--迭代器(迭代就是循环)
可以被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实现迭代器协议相关推荐
- 第十六篇 Python之迭代器与生成器
一.迭代器 一. 递归和迭代 生活实例说明什么是递归和迭代 A想去腾达大厦,问B怎么走路,B 说我不知道,我给你问问C,C也不知道,C又去问D,D知道,把路告诉了C,C又告诉B,B最后告诉A, 这就是 ...
- python六十四: 迭代器协议
迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代.(只能往后走,不能往前退). 可迭代对象:实现了迭代器协议的对 ...
- Python学习之迭代器协议
文章目录 迭代(iteration) 可迭代(iterable) 迭代器(iterator) 迭代器协议(iterator protocol) 迭代器协议与 for 循环 迭代(iteration) ...
- 《Python Cookbook 3rd》笔记(4.4):实现迭代器协议
实现迭代器协议 问题 你想构建一个能支持迭代操作的自定义对象,并希望找到一个能实现迭代协议的简单方法. 解法 目前为止,在一个对象上实现迭代最简单的方式是使用一个生成器函数.在 4.2 小节中,使用 ...
- python 迭代器协议_浅谈Python中的生成器和迭代器
迭代器 迭代器协议 对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么返回一个异常来终止本次迭代.(只能往前走,不能往后退!) 迭代器对象 遵循了(实现了)迭代器协议的对象.(对象内 ...
- pythonfor循环遍历list_为什么for循环可以遍历list:Python中迭代器与生成器
1 引言 只要你学了Python语言,就不会不知道for循环,也肯定用for循环来遍历一个列表(list),那为什么for循环可以遍历list,而不能遍历int类型对象呢?怎么让一个自定义的对象可遍历 ...
- python基础-------迭代器,生成器,协程函数
1,迭代器协议: 1.1 迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 1.2. ...
- Python之迭代器和生成器(Day17)
一.可迭代对象(iterable) 刚才说过,很多容器都是可迭代对象,此外还有更多的对象同样也是可迭代对象,比如处于打开状态的files,sockets等等.但凡是可以返回一个迭代器的对象都可称之为可 ...
- python的迭代器无法输出值_python迭代器和生成器
人生还早,谁能笑到最后呢,坚持吧! 1.迭代器协议 由于生成器自动实现了迭代器协议,我们有必要了解迭代器协议是什么,才能更好的理解生成器. 1)迭代器协议:对象要提供__next()__方法,它要么返 ...
最新文章
- leetcode算法题--二叉搜索树的后序遍历序列
- 绑定变量窥测(Bind Variable Peeking)
- Stack(栈 c++模版实现)
- java+jsp+网页制作,java+jsp+mysql网页制作总结(2)
- 安卓开发面试题!带着问题深入学习Handler,进阶学习资料!
- MSSQL如何在没有主键的表中删除重复数据
- 【java学习之路】(java SE篇)011.线程池
- KRPANO资源分析工具下载720THINK全景图
- 弱电工程施工规划实施
- 浏览器的使用方法,如何添加书签|常用网站|扩展程序?
- 十二进制加计数器-20151112
- py错误jupyter:某个缩进Unindent不匹配任何外部缩进 IndentationError: unindent does not match any outer indentation
- 高通wlan驱动之tgt_mgmt_txrx_rx_frame_handler函数
- 质量功能展开QFD成功案例解析
- 三种梯度下降算法的比较和几种优化算法
- [蓝桥杯国赛]客观题
- 微博点赞数等信息和公众号点赞数等信息爬取
- MRI血管造影技术之最大密度投影法(maximum intensity projection)重建
- 基于SSM的教学辅助平台(在线学习)系统的设计与实现
- Json与 String 转换