什么是迭代器:

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

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

可迭代对象有:

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

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

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

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

实现迭代器协议:

class Node:
def __init__(self, value):
self._value = value
self._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 self
for 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 区别

# 字符串
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 i new_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 item new_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来说代码更加简洁,结构更加清晰

最新文章

  1. java回调机制
  2. 查看mysql语句运行时间
  3. Android实现自适应正方形GridView(陌陌引导页面效果)
  4. CentOS 6.5 下安装 Elasticsearch 5
  5. Yii2 composer更新后报错: Calling unknown method: yii\web\UrlManager::addRules()
  6. 06MySQL数据库入门
  7. ajax+FormData+javascript 实现无刷新表单注册
  8. Cocos2dx 中的CCCallFunc,CCCallFuncN,CCCallFuncND,CCCallFuncO比较
  9. css伪类伪元素
  10. 细节!重点!易错点!--面试java基础篇(二)
  11. tkinter的冷却技能
  12. JavaSE之Long 详解 Long的方法简介以及用法
  13. weapp-mobx
  14. Android camera2 回调imagereader 从Image拿到YUV数据转化成RGB,生成bitmap并保存
  15. CentOS7下解决ifconfig command not found
  16. HTML5 historyState pushState、replaceState
  17. 未找到与约束ContractName,无法打开项目的解决方案
  18. 【转】WIFI基本知识整理
  19. Python3 匿名函数
  20. Onvif鉴权实现方式

热门文章

  1. 使用WakeLock将Android应用程序保持后台唤醒
  2. c#同时验证手机号和座机号正则
  3. 【转载】关于Maven项目build时出现No compiler is provided in this environment的处理
  4. Kvm--03 kvm克隆,桥接网络,热添加
  5. better-scroll 的使用
  6. centos 6.5 切换用户
  7. VueJS基础框架代码介绍
  8. Spring框架之接口实现覆盖(接口功能扩展)
  9. JS中算法之排序算法
  10. linux 正则表达式与实践