ジェネレータ
知人ビルダー1.1
発電機は何ですか?この概念は曖昧で、文学は異なる理解を持っていますが、コアは基本的に同じです。ビルダーPythonコミュニティでは、本質的に、イテレータ、ほとんどの時間は、イテレータと発電機は同じ概念をしていると見なさ。なぜ同じではありませんか?なぜジェネレータを作成しますか?ジェネレータとイテレータも異なっている、唯一の違いはこれです:Pythonツールイテレータが既に書き込まれたデータを提供することですか来て変換することにより、(ファイル・ハンドルなど、ITER([1,2,3]) 。Builderは、私たちは自分のPythonコードのビルドを使用する必要があるツールです。最大の違いは、ケースになります。
1.2発電機を内蔵しています
ジェネレータを作成するためのPythonで3つの方法があります。
1.ファンクション・ジェネレータ
2.ジェネレータの導出
組み込み関数又はモジュール3パイソン(基本的に2つのオン1,3-ほぼ同様に、関数の形で生成され、1つだけが、関数発生器を書くことで、3のみPythonのジェネレータ機能により提供されます)
1.3ジェネレータ機能
私たちは、最初のジェネレータ関数によって生成された建物を調べます。
まず、我々は非常に単純な関数を見てみましょう。
FUNC DEF(): 印刷(11) 22を返すがある RET = FUNC() 印刷(RET)# 結果: 11 22れます
収量への復帰の機能、それはFUNC機能ではないようではなく、ファンクション・ジェネレータ
DEF FUNC(): プリント(11)は、 22を得
私たちは、理由である、任意の変更を書き込みませんでした?のは、カッコ内の関数名を取得したか見てみましょうか?
FUNC DEF(): 印刷(11) 、収率22は、 RET = FUNC() 印刷(RET)# 実行結果: <ジェネレータFUNC AT 0x000001A575163888オブジェクト>
その結果、トップランが降伏関数のなので、この関数はジェネレータ関数である理由??、同じではありません。
ときに我々は、この機能を実行する。もはや機能を実行されません。その代わりに、オブジェクトがどのようにそれを値を生成するために、ジェネレータオブジェクトを取得しますか?
私たちが言う前に、発電機は基本的にイテレータです。どのようにイテレータ値、発電機を評価する方法。だから我々は、直接実行することができ、次へを以下の発電を行うために()
FUNC DEF(): 印刷( "111") 222が得られる 。GENER = FUNC()関数で、この時点で#は、それが⽣ジェネレータに取得することです⽽実行していません RET = GENER .__次__() #の機能のみ、この時間をYESであろう (RET)を印刷#1 funcがRETに生成され、収率データ222します。 結果: 111 222
そして、私のジェネレータ関数は、より多くの収率で書き込むことができます。
FUNC DEF(): 印刷( "111") 収率222 プリント( "333") 収率444 GENER = FUNC() RET = GENER .__次に__() プリント(RET) RET2 = GENER .__ next__ () 印刷(RET2) RET3 =次にGENER .__ __() #最後のフレーム収率再び完全__nextを実行__()プロシージャエラー プリント(RET3) 結果: 111 222 333 444
プログラムは、収量の最後に実行されている場合、それは後ろに実行を継続次にイテレータのように、次、次の収率の数を超え、エラーう収率に相当する、()プログラムを説明します。
収量との違いを返します。
一般的にはリターン機能は一つだけ、彼の役割は、機能を終了することで、機能の実行の戻り値に提供されます。
複数設けられていてもよいジェネレータ関数を得て、彼は機能を停止しないことを、次の対応する捕捉要素が生成もたらします。
例えば:
私たちは、この需要を見て:ボス階下蒸しパンを販売歳の少年は、包子プルトニウムの上司は非常に現実的である万個のパンを命じ、彼らが働いたすべてのだろう。
DEF)(食べる: LST = [] の範囲でI(1,10000)のために: lst.append( '包子' + STR(I))は LST戻り E =食べる() プリント(e)を
そうすることは問題ありませんが、学生はそんなに、約2000、および8000の残りの部分を食べるので、我々はなかった、我々は唯一のいくつかの領域を達成することができ、脇に置きます。包子プルトニウムのボス効率が十分に高い場合、私は、あなたが、それはあまりにも多くのストレージスペースを取るし、完璧ではないでしょうかパンをパンを食べます。
DEF)(食べる: iについての範囲(1,10000)において: 収率'包子' + STR(I) E =(食べる) iについての範囲(200)において、 次の(E)
2間のこの違い:
最初は、全てのパンに直接それを行うメモリを取ることです。
第二は、非常に省メモリを生産食べることですが、また、以前の位置を保持します。
DEF()EAT: :範囲(1,10000)におけるIため 収量'パン' + STR(I) E = EAT() の範囲内のiについて(200である): (E)次 の範囲内のiについて( 300): 次の(E) 複数の次の順番の番号が記録され#パン。
1.4 sendメソッド(話すことはありません、理解)
・私たちは、物事の新しい理解に来次に、メソッドを送ります
#次世代のみ収率の値を得ることができるが、値を渡すことはできません。 DEF ゲン(名): 印刷(F 「{名前}盛り付け」) ながら 1 : 食品 = 降伏 プリント(F 「{名前} {食べ物を食べるために開始} 」) 犬 =ゲン(「アレックス」) 次に(イヌ) 次に(イヌ) 次に(イヌ) #この方法が可能である送信使用。 DEF ゲン(名): 印刷(F ' {名前}食べることREADY ' ) 一方、 1 : 食品 = 収率 222 プリント(F 「{名前} {食べ物を食べるために開始} 」) 犬 =ゲン(「アレックス」) 次の(犬) #初めて次の収率で、最初のポインタで許可されなければなりませんバック #および降伏値として次を得ることができる RET = dog.send(「骨」) プリント(RET) DEF :ゲン(名) を印刷(F 「{名前}盛り付け」) ながら 1つの: 食品 = 降伏 プリント(F 「{名前} {スタート食物を食べる} 」) 犬 =ゲン(「アレックス」) 次に(犬) #はまた、降伏に送信された値であってもよい dog.send(「骨」) 犬。 (送信' 犬' ) dog.send(' ソーセージ')
違いを送信し、次の():
同じポイント:
発電機は一度下方対応を得ることができるように送信し、次の()。
降伏値が生成され得ることができます。
違い:
第1の取得収率値は、次の((なし)を送信することができない)送信することはできません使用することができます。
設定値が送信され得るために送信することができます。
から1.4利回り
python3であってもよく、データオブジェクトの直接各反復を提供する結果、発電機として返されます
#収率および収率の比較 DEFのFUNC(): LST = [ ' ウェイロング'、' 古いアイスキャンディー'、' 北極'、' と羊' ] 得LST G = FUNC() プリント(G) 印刷(次へ(G )) #は、リストのみを返し DEF )FUNCを(: LST = [ ' ガーディアンドラゴン'、' 古いポプシクル'、' 北極'、' 牛や羊と' ] 収率 からLST G = FUNC() プリント(G) #イテレータが返されるように、各反復の結果の各要素の彼は、このオブジェクト(リスト)を使用することができます。 プリント(次へ(G)) プリント(次へ(G)) プリント(次へ(G)) プリント(次へ(G)) ' '' ガーディアンドラゴン''古いポプシクル【から得' ''北極''牛羊と「] と等価です: 歩留まり」Waylung「 歩留まり」は昔のアイスキャンディー「 降伏」北極「 羊と歩留まり」「 」「」
そこ小さな穴、各要素を返すリストからの収量はあるので、あなたがから2つの歩留まりを書いて、効果を交互に生成していない場合
DEF FUNC(): LST1 = [ ' ウェイロング'、' 古いアイスキャンディー'、' 北極'、' と羊' ] LST2 = [ ' パン'、' 花巻'、' BEAN '、' ケーキ' ] 収率 からLST1 収率 からLST2 G = FUNC() のための I におけるG: 印刷(I)