4:イテレータジェネレータ

1.イテレータ

データ取得サイクルの生成または1.1

1.2オブジェクトの__iter __()メソッドが反復可能であるた、forループであってもよいです

1.3(__iterの__を有する)とオブジェクト__next __()メソッドは、イテレータオブジェクトであります

1.4forサイクル原理:  

  1. イテレータを取得することができます反復可能
  2. 何の価値昇給を呼び出すとStopIterationがなくなるまでのサイクルは、イテレータ__next __()メソッドを呼び出します
  3. この例外をつかむために循環させるため、密かに外部の認識を扱っていません

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)
コードの表示

イニシアチブは、前方基本的に受動的または非表示の呼び出しをする方法をめったに見られません

イテレータを取得するためのループのための発電機であります

値ウェイ:サイクリックデータキャスト用(ワンタイムの全ての合計メモリ)、次の方法
収率が出ない、何も方法がないだろうが、結果が返された後、最後の実行コードをビルダー。
next()メソッドを呼び出し、反復子ロジックは停止を得るために始めます
降伏値への転送を必要としないため、実行する最初の送信(なし)、生成関数の内部へ(G)次の伝統的な値よりg.send()以上

私のための範囲内(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))
プラスデコレータ

 

おすすめ

転載: www.cnblogs.com/gyxpy/p/11594872.html