どうもこんにちは。
コンです。
最近Pythonを基本からしっかり勉強したいなって思って色々勉強させてもらっております。
5年も使っているのに、分からなかったり知らなかったことばかりでだなって思っております(笑)
下のような感じの記事が多いのも勉強のアウトプットとして書かせていただいております。
その中でもジェネレータという、イテレータの作成するツールが難しかったので
解説させていただけたらと思います。
(イテレータ:リスト・タプル(データ型)やrange, map(関数)など複数の要素をもつデータ構造)
ジェネレータ関数とyield文
ジェネレータ文は、yield文を使って1つずつ反復するデータを出力してます。
1 : yieldとreturn
実際にジェネレータ文を書いたコードを以下に記します。
return文で書いた場合も一緒に記入してます。
▷マークを押して実行してみてください!!
returnを使ったcount_b関数では場合、「for num_b in gen_b」(27行目)でエラーが起きてます。
yieldを記入したcount()関数でエラーにならないポイントとしては
生成したインスタンスを printして確認してみるとgenerator object 関数名となっているところです。
つまりインスタンスを生成して
そのインスタンスがfor文で繰り返し返し実行され、出力するのがyieldの内容になります。
クラスのことを勉強してみると分かりやすないようかと思います。
2 : 2回実行してみたり、next使ってみたり
ジェネレータの特徴として前の結果が保存されて、再度実行すると続きからの結果が出てくるのが特徴です。
おわりに
ジェネレータの内容を以下にまとめさせていただきます。
yield
文で値を返した時に、処理の中断と値を記憶する- 新たに値が要求されたら記憶した箇所から処理を再開する
これを繰り返すことでジェネレータは値を反復して出力するそうです。
ジェネレータを使いどきとしては、処理を順に行なっていく時に前の当たりを保持する必要がない場合などがよく使われるそうです。
リストを使うと、リスト全体を記憶しないといけないためメモリを消費してしまうのですが、
ジェネレータはそんな必要ないよ〜てのがメリットだそうです。
無駄にメモリを使っているかもしれないので、見直そうって思いました