Python ジェネレーター内包表記

Python学習【365日チャレンジ!】62日目のマスターU(@Udemy11)です。

少し前に、包丁を研ぐことが趣味になっていた時期がありました。

包丁マニア?!で知らないものはいないというメーカーのシャプトンから発売されている【刃の黒幕シリーズ】を使っているのですが、最後の仕上げに#5000のものを使っています。

シャプトン 刃の黒幕 エンジ 仕上砥 #5000

評価 4.5

商品の名前を出されても分かる人は少ないと思いますが、鏡面仕上げにできるんですよね。

でもやっぱりさらに目の細かい#8000か#12000で研いでみたいと思うのですが、ちょっと値段が張るので、#5000で我慢しています。

なかなか理解してくれる人がいないんですよね〜。

では、今日もPython学習を始めましょう!

昨日の復習

昨日は、集合内包表記を学習しました。
集合内包表記は、辞書型と同じBracesの波括弧{}を使いました。

s = {i for i in range(10)}
print(s)

出力結果

{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

同じBracesの波括弧を使う辞書型の場合、<keyvalueをしてするので、この2つを区別することができているということです。

それでは、今日のジェネレーター内包表記にはいっていきましょう!

ジェネレーター内包表記

そろそろ内包表記にも慣れてきたと思いますが、forループと同じような働きを持つジェネレーターでも内包表記が可能です。

def g():
    for i in range(10):
        yield i
 
g = g()
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))

出力結果

0
1
2
3
4

上記コードは、内包表記を使わずに0から9までの数字をジェネレーターに入れて5つ目までの値を出力しています。

ここまで一緒に学習している人ならすでにジェネレーター内包表記を使う場合のコードが思いついているかもしれませんので、その答え合わせをやってみましょう。

g = (i for i in range(10))
print(next(g)
print(next(g)
print(next(g)
print(next(g)
print(next(g)

出力結果

0
1
2
3
4

もしかしたら、最初のiの前にyieldを入れてしまった人もいるかもしれませんが、私も最初は入れてしまいました。

他の内包表記同様に、変数だけでジェネレーターとして認識されるので、yieldは不要です。

あとは、Pearenthesesの丸括弧を使っているので、タプルになってしまうのでは?と思った人もいるかも知れませんが、内包表記では、Pearenthesesの丸括弧を使うと、ジェネレーターを生成します。

タプルじゃないの?

もし、タプルを生成したい場合は、Pearenthesesの丸括弧の前にtupleと記述する必要があります。

t = tuple(i for i in range(10))
print(t)

出力結果

(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

全ては憶えられなくても

なんどもお伝えしていますが、一度通っただけでは長期記憶には残りません。

学習したら、次の日や1週間後に復習するなど何度も同じ道を通ることで、記憶の片隅に記憶されていきます。

もちろん、Pythonの全てを覚えることは不可能ですので、

そういえば、こんな使い方があったな。

と思い出せるくらいは繰り返して学習する必要があります。

思い出せれば、記憶をたどって情報を引き出すことはできますし、わからなければ、その段階でさらに復習すれば、より記憶に刷り込まれることになります。

一足飛びにマスターできるわけがないので、一つ一つ楽しみながら、学習していきましょう!

それでは、明日もGood Python!