1.イテレータ
データ取得サイクルの生成または1.1
1.2オブジェクトの__iter __()メソッドが反復可能であるた、forループであってもよいです
1.3(__iterの__を有する)とオブジェクト__next __()メソッドは、イテレータオブジェクトであります
1.4forサイクル原理:
- イテレータを取得することができます反復可能
- 何の価値昇給を呼び出すとStopIterationがなくなるまでのサイクルは、イテレータ__next __()メソッドを呼び出します
- この例外をつかむために循環させるため、密かに外部の認識を扱っていません
1.5カスタムイテレータ:手段は__ next__ロジックはすでにパッケージ化され、既存のデータ構造を繰り返すことがあり、
クラスの生徒: stu_list = [] 位置は = 0 デフ __init__(自己、* 引数): のための名前で引数: self.stu_list.append(名) デフ __iter__ (自己): 戻り値の自己 デフ __next__ (自己): 場合 self.position < lenの(self.stu_list): アイテム = self.stu_list [self.position] self.position + = 1つの 戻り項目は 上げる()を呼び出すとStopIterationを デフappend_stu(自己、学生): self.stu_list.append(学生) stus =学生(" 张三"、" 李四"、" 王五" ) stus.append_stu(" 老王" ) のための私でstus: 印刷(私)
カスタムイテレータオブジェクト、主にどのようなデータを取得するために、内部__next__方法を完了します。
いくつかは非常に便利です、それもデータを取得するために、インデックス反復をリストしていないあなたは完全に十分なデータ型であり、__next__文はCの内部ロジックで書かれているので、あなたがデータを取得するために、インデックスに頼ることができない、独自のイテレータを書きますA。
概要:イテレータより内側の三つの方法
= iter_l [1,2,3,4,5,6]。__iter__ () #イテレータの要素の長さを取得する 印刷(iter_l。__length_hint__ ()) #反復インデックス開始する場所に関して指定 プリント(「* 」、 iter_l。__setstate__(4 )) #のいずれかの値 を印刷(' ** '、iter_l。__next__ ()) を印刷(' *** '、iter_l。__next__())
反復インデックスデータ内のリストの可視底部とイテレータが、呼び出し元の詳細を隠すには、唯一の__next__呼び出すあなたは次の値を得ることができることを知っています。
あなたは簡単に、非常に快適にそれらを横断するために使用できるように、タプルの文字列リストは、何のインデックス、反復データの統一されたタイプの下かどうかそこにすべてのデータの対象にイテレータをset.dictない、添字を持っています。
2.ジェネレータ
多くの場合、データを生成するためのツールとして使用する、イテレータの性質は、__iter__と__next__は我々が達成し、唯一の生成ロジックに集中する必要があるんです。
多くの場合、大量のデータが生成されます
DEF num_gen(): NUM = 0 つつ:真 収率NUM NUM + = 1 、G = num_gen() のための I におけるG: プリント(I)
不活性操作、カスタム開発
生成された発電機の発現が一致2.1論理データ------------
誘導された同様のリストが、しかし、むしろ一度構築結果のリストより、結果を生成する要求を生成するオブジェクトを返します
異なるデータ生成機能を生成するために異なる条件で生成された2.2論理データ---------------
しかし、従来の関数定義、代わりに結果の歩留まりreturn文のreturn文を使用します。
収率の効果は:値1を返し、2機能状態をサスペンド
yield文は、それぞれの結果の真ん中で、結果を返す関数の保留状態を次の場所に重いが、それが継続して中断したように、
Builderは、レイズを呼び出すとStopIterationまで、さらに一歩進めます)(__内部ロジックが実行されませんが、ホイップ__next用データを生成するロジックを保持するオブジェクトを取得するために呼び出します
DEF )(gen_test: のための I におけるレンジ(20である。) 収率 " テスト%S "%I G = gen_test() #1 のみ__nextを呼び出すために、直接的または間接的に取得するための呼ジェネレータ関数発生器__()は発電機能を実行します #1 次降伏まで実行 #の生産を達成しながら、反復子は、グローバル降伏値に定数発生器から返された値取得中 ためのI でG: 印刷(I)
イニシアチブは、前方基本的に受動的または非表示の呼び出しをする方法をめったに見られません
イテレータを取得するためのループのための発電機であります
私のための範囲内(5):
プリント(I)
発電機が使用されますが、意味はインデックス発生器が生成される値を与えています。
DEF 平均化(): 合計 = 0.0 カウント = 0 平均 = なし ながらTRUE: 用語 = 収量平均 合計 + = ターム カウント + = 1 、平均 =合計/ カウント g_avg = アベレージ() 次の(g_avg) プリント(g_avg.send(10 )) プリント(g_avg.send(30 )) プリント(g_avg.send(5))
DEFのinit(FUNC): #ジェネレータ関数ジェネレータは最初次で活性化されたときにコールが飾られる DEFインナー(* argsを、** kwargsから): G = FUNC(* argsを、** kwargsから) 次の(G) の戻りG 戻りインナー @Init DEF :アベレージ() の合計 = 0.0 COUNT = 0 の平均 = なし ながらTRUE: 用語 = 収量平均 合計 + = ターム カウント + 1 = 平均 =合計/ カウント g_avg = アベレージ() #次(g_avg)は、次のメソッドのデコレータ行う プリント(g_avg.send(10 )) プリント(g_avg.send(30 )) プリント(g_avg.send(5))