再谈迭代器,生成器,yield,及和类的使用
生活随笔
收集整理的這篇文章主要介紹了
再谈迭代器,生成器,yield,及和类的使用
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
最近寫(xiě)項(xiàng)目時(shí),遇到類(lèi)嵌套和yield的混合使用,覺(jué)得比較典型,正好借此加深對(duì)迭代器和生成器的理解。
代碼
代碼抽象如下:
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)打印結(jié)果如下:
1 11 111 1111 11111 111111 1111111 1 11 111 1111 11111 111111 1111111知識(shí)準(zhǔn)備:
關(guān)于迭代器和生成器的基本知識(shí),可以參考 http://blog.csdn.net/ayhan_huang/article/details/73374894
我們知道,可迭代對(duì)象都具有__iter__方法,因此只要在類(lèi)中定義該方法,那么其實(shí)例化對(duì)象就是可迭代對(duì)象,就可以被for循環(huán),比如:
class Foo(object):def __iter__(self):return iter([1,2,3])obj = Foo() for i in obj:print(i)""" 打印結(jié)果 1 2 3 """而如果一個(gè)函數(shù)中有yield,那么執(zhí)行函數(shù)就會(huì)拿到一個(gè)生成器(生成器就是迭代器)。
流程分析:
下面我們具體看一下本文開(kāi)頭給出的那段代碼的執(zhí)行流程
總結(jié)
以上是生活随笔為你收集整理的再谈迭代器,生成器,yield,及和类的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Rpm包的安装与yum的配置
- 下一篇: Ubuntu下VIM使用指南