h1>【Python】ジェネレータ関数まとめ【基本講座】
Pythonでは、クラスを使用してオリジナルのイテラブルのオブジェクトを定義できます。これは、ジェネレータ関数と呼ばれる特殊な関数で定義できます。
ジェネレータ関数をマスターしよう
yield文の基本書式
ジェネレータ関数では、通常、返し値はreturn文ではなく、yield文を使います。
yield文は、関数を終了せず、一時停止状態となります。これを再実行するときには、next()関数を使います。
つぎのプログラムを見てください。単純な文字を大文字に変換するプログラムです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
def hoge(s): for i in s.upper(): yield i n = hoge("aBcDeF") print(next(n)) print(next(n)) print(next(n)) print(next(n)) print(next(n)) print(next(n)) >> A B C D E F |
一文字ずつ大文字に変換して返しています。
これがジェネレータ関数というものです。もし返す文字がない場合は、StopIterationエラーが出ます。
for文を使えばエラーなく抜けれますね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
def hoge(s): for i in s.upper(): yield i n = hoge("aBcDeF") for i in n: print(i) >> A B C D E F |
ジェネレータ式について
以前、シンプルな関数は、lambda文で表せたことを覚えていますか?
このジェネレータでもジェネレータ文と呼ばれる構文で定義できるのです。
一見リストの内包表記と似ていますが、()を使うことに注意です。
先ほどの例を書き換えてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
s = "aBcDeF" n = (i for i in s.upper()) for i in n: print(i) >> A B C D E F |
ちなみに、()のかわりに[]と書くとリストの内包表記が実はできますが、これは良くありません。なぜかというと、リストの内包表記は、リスト要素をすべて生成してから処理するという特徴があります。これが何千万ものようそがあれば、処理するたびに、その膨大な要素を処理しなくてはいけません。その分時間もメモリも大量に消費することになるため現実的ではありません。
そのためジェネレータ文で処理していくというのが良いとされています。
Pythonおすすめ書籍
最初の2冊は初心者向けです。Effectiv Pythonはこの2冊を終えてから読むとかなりわかりやすく感動できると思います。
|
|
|
独学に限界を感じていませんか?
プログラミング初学者がもっとも陥りやすいのは、挫折です。
なぜ?挫折するのでしょうか?
それは独学だけでは、限界があるからです。
でも、あきらめてはそこで終わりです。
プログラミング言語習得には、メンターと呼ばれる教えてくれる人間が必要です。メンターがいれば、挫折する確率がグンと低くなります。
困ったときに、いつでも教えてくれる先生がいれば心強いと思いませんか?
でも、先生って、学校行く時間もないし、、、そんなこと思っていませんか?
今は、Webでプログラミングが学べる時代なんですよ!
でも、お高いんでしょ?
うーん。これは考え方なのかもしれないんですが、例えば、こう考えてはどうでしょうか?
スクール代金が1コース20万円として、その後、ITエンジニアに就職したら、平均30万円以上は、稼げるのですぐに元が取れますよね?
この数値は、リクナビなど転職サイトを検索すればすぐ出てくる数値です。
今一時の出し渋りにより、一生の賃金を損することになるか、倍以上手に出来るかは、自明ですよね?
でも、どこが良いのかわからない。
そこで、厳選したプログラミングスクールと動画サイトをご紹介いたします。
- TechAcademy [テックアカデミー]※スクールの数が多い!返金制度あり!
- 【WebCampPRO】※WEB系に特化したスクール!返金制度あり!
- 【CodeCamp】※無料体験レッスンを受講すると受講料が1万円OFF!
- Python 3 入門+アメリカのシリコンバレー流コードスタイル
- 【Web開発初心者向け!】Web開発入門完全攻略 充実の18時間コース※動画で学びたい人はこちら!格安もあり!
- フロントエンドエンジニアになりたい人の Webプログラミング入門