Python实现迭代器协议
什么是迭代器:
--迭代器(迭代就是循环)
可以被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 区别
'''
遇到问题没人解答?小编创建了一个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 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来说代码更加简洁,结构更加清晰