Pythonの研究ノート:ジェネレーター(発電機)詳細


まず、式のリスト:プログラムはより柔軟になるように動的にリストを生成するのではなく、リストに固定値を割り当てます
DEF テスト(I):
    でも
    IF I%2 == 0:
         リターンI 

共通式 
LIST1 = [I 2 * のための I における範囲(10 )]
 プリント(リスト1)
関数の値を選択することにより 
LIST1 = [試験(I)のために I における範囲(10 )]
 プリント(リスト1)

第二に、Builderは:リストこのリストは巨大であることをデータの量が、それは、メモリや非効率を占領されている場合は、準備ができて呼び出す前に
、このような100万個の要素のリストとして、このサイクルは唯一、100の前に循環します後者の要素があり、使用されていない
あなたがそれを呼び出すときに要素を生成することができる方法は?これは発電機です。

#は、(レンジ(10000)におけるIのためのI * 2)発電機のメモリアドレスを返す 
LIST3 =(I * 2  I におけるレンジ(10000))
注:要素が生成されていないため、発電機を使用することができない「リスト[0]」要素内のこのよう呼び出しでのみループのアクセスに使用することができます
#は、発電要素は、現在の位置を記録しそうという、消失の前で同時に次の要素を取得するために、次の__を取得する__next()方法であってもよいです。(__nextで前方、後方に行くことができない)__ 
印刷(LIST3。__Next__ ())
 を印刷(LIST3。__Next__ ())
 を印刷(LIST3。__Next__())
一般的にアクセスサイクルに使用し、使用済みの__next __()メソッドではありませんこれは次の方法を構築し、内蔵のpythonイテレータ、使用することです
ためにLIST3
   印刷(i)を
例えば、フィボナッチジェネレータを有するカラムは、(列定義フィボナッチ数を第1及び第2の数に加えて、後者の数は次のように最初の2つの数値を加算することによって得られる)を生成する
手書きの下
list_num =(I ための I における範囲(10 ))
list_new_num = [] 

のためにlist_num:
     もし I = 0! I = 1! 
        list_new_num.append(list_new_num [I - 1] + list_new_num [I - 2 ])
     
        list_new_num.append(I)
    プリント(list_new_num [I])
数の別のフィボナッチ言葉遣い
N-、A、B = 0,0 ,. 1   連続割当
ながら N- <10 プリント(B)
    A、B = B、A + B 
    N - = N + 1。
上記のコードに変更します。
セーブ機能割り込みステータスyieldキーワード、コードは最初の外の呼び出しを実行することができ、あなたはすべての値が大幅に効率向上させることができ、再計算の実行、されるまで待つ必要はありません
利回りバック位置は機能を継続する場合)(次回に実行を内部コード。
DEF (MAX)FIB:
    N-、A、B = 0,0 ,. 1 ながら、 N- < 最大:
         収率のB   プラス収率が発生、ここで変数Bに格納された値が対応なります。Bこれは収率が標識されたように、広がることである 
        A、B = B、A + B 
        N- = 1 + N-
     リターン間違ったこれは、エラーメッセージで、例外が捕捉されます。そうFIB、この発電機の具体的な実装に対応し、発電機を返します。
FIB = G(6 一方、TRUE:
     トライ__nextの役割(と次が内蔵されている方法)__次の要素は、発電機取らとして位置のFIB機能上の次の収率を入力した後、 
        X = 次(G)
         を印刷"

       




        :G "X)
     を除いて呼び出すとStopIteration AS E:  ここでは、キャッチ例外にプログラムを終了するプリント" :エラー" 、e.Value)
         BREAKを
        
収率は、依然としてシングルスレッドがまた、(単独で、スレッドとコルーチンについては後述する)、シングルスレッドの下で通話コルーチンを作るために使用することができるが、収率に大きく効率向上させることができ
、次のを生産と消費の代表的なモデル、人の生産であります私たちは、「パラレル・ビルダー」を呼び出すいくつかのヒトの消費量が、同時に、不動産の利回りを使用し、
インポート時間
 DEF 消費者(名):
     印刷!%Sは、パンを用意し、」%の名称)
     しながら、真のは:
        包子 = 降伏 #は何の戻り値を得ていない、なぜそれをbaozhiするために割り当てられていますか?

        印刷" 饅頭[%s]が来て、[%s]を食べました。"(包子、名前)) 

C =消費者( "Tangwei") C .__次__()#__next__最初の実行次いで収率の関数で消費者の位置、および戻りC .__次へ__()#__next__第2の部分はループの残りの部分に続くジャンプが生じるように実行されるまで継続

最初C .__次に__()#を_ _next__関数で消費者の位置を得るために行われ、その後、戻りc.send(「肉」)#値は次、変数包子に割り当てられている消費者の降伏関数内の位置に渡され、送信、呼び出しのみ__next__得値を渡さない

DEFの生産(名):
     ジェネレータ生成 
    C1 =消費者(Tangwei #が発生生成 
    C2 =消費者(chenyadanをC1はnext__ロケーション消費者は、歩留まりの機能を実行し、その後に戻り__、BUNを調製 
    C1。__next__ ()
    上記C2 
    C2。__next__ ()
     印刷" 私はシェフ午前[%s]のを、...パンをやるようになった"(名))
     のための I におけるレンジ(10):
        time.sleep( 1 印刷パンを行い、半分... 
        c1.send(I) 、降伏値が変数包子に割り当てられている消費者、内の位置の関数に渡され送ります渡され得るためだけでなく、__next__値を呼び出す
        c2.send(I) 

プログラムがまだ実行の順序ですが、プログラムの流れは、機能間をジャンプすることができますので、機能の終了後まで待ってから、別の機能を実行する必要はありませんが、 、大幅な実装の効率を高めます。これは、コルーチンであるシングルスレッドで並列効果であり、コルーチンは、スレッドユニット、スレッド内の寄生虫よりも小さくなっています。
プロデューサー(犬は無視します

 

おすすめ

転載: www.cnblogs.com/tangwei-fuzhou/p/12669069.html