Python实现迭代器协议
生活随笔
收集整理的這篇文章主要介紹了
Python实现迭代器协议
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
什么是迭代器:
--迭代器(迭代就是循環(huán))
可以被next()函數(shù)調(diào)用并不斷返回下一個值的對象稱為迭代器:Iterator
可迭代對象有:
-
一類是集合數(shù)據(jù)類型,如list,tuple,dict,set,str等
-
一類是generator,包括生成器和帶yield的generator function
這些可以直接作用于for 循環(huán)的對象統(tǒng)稱為可迭代對象:Iterable
但是必須可以被next() 函數(shù)調(diào)用并不斷返回下一個值! 的 可迭代對象,才是迭代器
實現(xiàn)迭代器協(xié)議:
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()方法很重要,它首先返回自己本身并迭代每一個子節(jié)點并 通過調(diào)用子節(jié)點的 depth_first() 方法(使用 yield from 語句)返回對應(yīng)元素。yeild 和yeild from 區(qū)別
''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學(xué)習(xí)交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學(xué)習(xí)教程和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來說代碼更加簡潔,結(jié)構(gòu)更加清晰總結(jié)
以上是生活随笔為你收集整理的Python实现迭代器协议的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python字节到大整数的打包与解包
- 下一篇: Python:3种方式实现随机生成8位字