再谈迭代器,生成器,yield,及和类的使用
生活随笔
收集整理的這篇文章主要介紹了
再谈迭代器,生成器,yield,及和类的使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近寫項目時,遇到類嵌套和yield的混合使用,覺得比較典型,正好借此加深對迭代器和生成器的理解。
代碼
代碼抽象如下:
from types import FunctionTypeclass RowItems(object):def __init__(self,option,x1,x2,x3):self.option = optionself.x1 = x1self.x2 = x2self.x3 = x3def __iter__(self):yield 1yield 11yield 111yield 1111yield 11111yield 111111yield 1111111class Option(object):def __init__(self,name_or_func,status):self.name_or_func = name_or_funcself.status = statusdef is_func(self):if isinstance(self.name_or_func,FunctionType):return Truedef func(configs):for option in configs:if option.is_func():data_list = Noneelse:data_list = RowItems(option,11,22,33)yield data_listlist_filter_config = [Option('name',True),Option('email',True), ]result = func(list_filter_config) for v in result:for j in v:print(j)打印結果如下:
1 11 111 1111 11111 111111 1111111 1 11 111 1111 11111 111111 1111111知識準備:
關于迭代器和生成器的基本知識,可以參考 http://blog.csdn.net/ayhan_huang/article/details/73374894
我們知道,可迭代對象都具有__iter__方法,因此只要在類中定義該方法,那么其實例化對象就是可迭代對象,就可以被for循環,比如:
class Foo(object):def __iter__(self):return iter([1,2,3])obj = Foo() for i in obj:print(i)""" 打印結果 1 2 3 """而如果一個函數中有yield,那么執行函數就會拿到一個生成器(生成器就是迭代器)。
流程分析:
下面我們具體看一下本文開頭給出的那段代碼的執行流程
總結
以上是生活随笔為你收集整理的再谈迭代器,生成器,yield,及和类的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Rpm包的安装与yum的配置
- 下一篇: Ubuntu下VIM使用指南