わかりました｡
この膨大なリストは､ ようやくメモリへの入力が終了した｡
しかし､ 私たちのキーワードを忘れないでください｡
リストは反復可能であると言ったのを覚えていますか？
イテラブルとは何だったのか？
イテラブルとは､ Pythonのオブジェクトの中でループを回すことができるものです｡
ダンダーエンター方式を採用しています｡
つまり､ オブジェクトを作成すると､ このエディタは反復可能なオブジェクトを持つことができ､
それを使って何かを反復することができます｡
forループやwhileループのようなループを使うものを反復処理と呼んでいます｡
それは､ プロセスそのものです｡
そして､ ジェネレーター｡
実際には反復可能である｡
つまり､ ジェネレータであるものはすべてイテラブルである｡
繰り返し実行することは可能ですが､ 繰り返し実行可能なものすべてがジェネレータになるわけではありません｡
例えば､ レンジは発電機です｡
だから､ それは常にイテラブルになるのです｡
しかし､ リストは反復可能ですが､ ジェネレータではありません｡
つまり､ ジェネレーターはイテラブルのサブセットということになります｡
言葉数が多いのは承知しています｡
まだ一緒にいてくれるといいんだけど｡
ジェネレータと通常のイテラブルの違いは､ その実装方法です｡
そこで､ ジェネレーターの一般的な作り方を紹介します｡
このコードをクリアして､ 独自のジェネレータを定義してみましょう｡
そして､ ジェネレータは通常､ レンジが関数であるように､ 関数である｡
ジェネレーターは通常､ この方法で作られます｡
では､ ジェネレーター機能としましょう｡
そして､ このジェネレータ関数は4つのループを持ち､ 先ほどと同じように範囲をループしていきます｡
しかし､ ここで違うのは､ 実際に以前持っていたコードを戻してみることです｡
彼女はこれをコメントアウトしてくれるので､ 差分として見ることができます｡
ジェネレーター機能は､ これから｡
作成するのは､ 仮にこれだけの項目です｡
しかし､ 通常の関数のように返すのではなく､ yieldというキーワードを使用します｡
そして､ ここではI so the itemをゆだねることになります｡
だから､ ここの違いに注目してください｡
ここで､ 必要であれば､ ここと同じように､ 番号を渡すことができます｡
こんな感じ｡
しかし､ 戻るどころか
そして､ このリストを追加し､ すべてのデータを作成するには､ ealdを使用することになります｡
さて､ Hieldはどうするのか？
Hieldは関数を一時停止して､ 何かすると戻ってくる｡ この関数はnextと呼ばれ､
これから説明する｡
そこでHieldは､ Hey, pause the function, just Hield I give I, and when you tell me to keep going again, then I'll keep
goingと言うのです｡
では､ どうすればいいのか｡
まあ､ ジェネレーター機能の項目については言えるんですけどね｡
するつもりです｡
プリントする｡
アイテムです｡
さて､ ここで起こることは､ ジェネレータ関数をループして､ ジェネレータ関数にそれを与えることです､
今は1000としましょう｡
そして､ これは反復可能なので､ ジェネレーター関数の各項目を表示することにします｡
走るし､ ループするし｡
そして､ この数値の範囲内のすべての項目に対して､ Yを返すので､ ループが繰り返されます｡
そして､ 戻ってきたら､ ループオーバーするのです｡
これと歩留まりを実行するんです｡
戻ってきて､ また走る｡
どういうことか､ お見せしましょう｡
これもコメントアウトする､ コメントアウトする｡
そして､ ここをクリックするだけで､ 実行されます｡
見たか？
今やったことは､ ここと似ていますが､ メモリ上にリストを作るのではなく､ 一つ一つを続けていくのです｡
メモリは1項目しか持っていない｡
そして､ それを好きなように使っていました｡
私たちの場合､ やったのは印刷物だけです｡
このキーワードをもう少し掘り下げてみましょう｡
実際のところ､ どうなんでしょうか？
ここで､ リストを使った最初の例でやったように､ これを2倍することにしましょう｡
しかし､ 今度は4つのループをする代わりに､ 関数を呼び出すだけにしてみましょう｡
そして､ イコールジェネレーター機能で､ 100を出すと言うのです｡
ここで､ Gをプリントして､ 「実行」をクリックすると｡
見たか？
ジェネレーターオブジェクトを取得する｡
そして､ これはPythonの標準的な方法で､ 範囲とyieldキーワードを使ってジェネレータ関数を作ることができることを覚えておいてください｡
でも､ このキーワードは､ ここに戻るだけで､ ある程度の力を発揮してくれます｡
特別なものは手に入らない｡
実は､ yieldキーワードを使って､ 代わりに値を取得するだけなのです｡
私たちができることは､ これをうまくジェネレーター機能に変えていくことです｡
これは次のgに言えることです｡
ここで､ 次のGをプリントして､ 「実行」をクリックすると､ 次のようになります｡
ゼロになるんです｡
でも､ ここがカッコいいんです｡
next Gを2回やって､ ここで1回やってプリントすると｡
のために取得します｡
それはなぜでしょうか？
キーワードで機能を一時停止することを忘れないでください｡
つまり､ この関数を100で実行したわけです｡
範囲100の最初の項目は0であった｡
そうですね｡
さて､ ここではこれを実行する前に､ 「これはジェネレータ関数ですが､ 最初に実行するときは､ このように表示されます｡
この関数を初めて実行し､ 「実行」をクリックしたときに､ ゼロの2倍を出力するようにします｡
Iに変更するようにします｡
これはまさにゼロ｡
またこうやって走らせれば､ あるんです｡
今度は､ 反復して1回になるようにしてほしい｡
だから1×2｡
それは何ですか？
まあ､ 1回×2回ですね｡
直しますね｡
こんな感じ｡
これがIであることを確認してください｡ 1×2は2ですから､ I get twoです｡
もう一度実行し､ 実行をクリックすると
のために取得します｡
ほらね｡
Hieldは､ 先ほども言ったように､ 機能を一時停止して､ nextが呼ばれたときに戻ってくる｡
つまり､ イールドキーワードを持てばジェネレーターになるわけです｡
この状態､ つまり値と呼ばれるものを記録し､ 最新のデータだけをメモリに保持します｡ 例えば､
14行目でprint next Gを実行すると､ それを記憶しています｡
以前はこのような私であったことを記憶しているのです｡
のためによく｡
つまり､ このコードはすでに実行されているにもかかわらず､ オンラインで実行すると､ 14行目になります｡
6人？
3×2がよく6になりますから､ 2倍されるから覚えておいてください｡
そこで､ お聞きしたいのですが｡
ここで1つの範囲しかやらないとして｡
そして､ ご存知ですか？
2倍を削除してみましょう｡
これをやって､ 次をもっともっとよく実行したら､ ここで実行をクリックしたらどうなるんでしょうか｡
ストップがかかるんです｡
イテレーションです｡
ほら､ nextは何度でも呼び出すことができるんだ｡
この範囲が切れるまで何度でも｡
そして､ その範囲を超えたとき｡
まあ､ stop iteration errorが出るんですけどね｡
もう次には電話できないよ､ と知らせるために｡
行末に到達し､ 範囲を指定したforループを使用すると､ 実はその下を検出してくれるのです｡
というのも､ forループは､ stop iterationに遭遇したらすぐにループを停止するように自動で命令するからです｡
さて､ このジェネレーターという概念は､ 特に最初はかなり理解しにくいものです｡
ですから､ 何度か見ていただく必要があるかもしれませんが､ これから数回のビデオで､ その威力を納得していただきたいと思います｡
では､ 次回作でお会いしましょう｡