日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

再谈迭代器,生成器,yield,及和类的使用

發布時間:2025/3/17 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 再谈迭代器,生成器,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,那么執行函數就會拿到一個生成器(生成器就是迭代器)。

流程分析:

下面我們具體看一下本文開頭給出的那段代碼的執行流程

  • list_filter_config 中拿到兩個實例化對象,假設為: A & B
  • result = func(list_filter_config),未執行func具邏輯,直接拿到一個生成器對象,假設為F_gen
  • for v in result: 執行生成器,F_gen
  • 執行func :
  • 循環list_filter_config第一個元素 A
  • 實例化RowItems對象,得到可迭代對象,假設為:A_iter
  • func:yield A_iter 返回 A_iter
  • 回到for v in result: A_iter, F_gen
  • for j in v: 迭代A_iter:每打印一行,回到for j in v,觸發A_iter繼續迭代
  • 迭代A_iter 完成,打印出第一個金字塔
  • 回到for v in result: F_gen
  • 執行func :
  • 循環list_filter_config第二個元素 B
  • 實例化RowItems對象,得到可迭代對象,假設為:B_iter
  • func:yield B_iter 返回 B_iter
  • 回到for v in result: B_iter
  • for j in v: 迭代B_iter:每打印一行,回到for j in v,觸發B_iter繼續迭代
  • 迭代B_iter完成,打印出第二個金字塔
  • 新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!

    總結

    以上是生活随笔為你收集整理的再谈迭代器,生成器,yield,及和类的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。