Python学習【365日チャレンジ!】59日目のマスターU(@Udemy11)です。
久しぶりに釣りに行ったんですが、目的のメバルは1匹だけで外道のスズキが1匹、豆アジ1匹という貧果でした。
とはいえ、スズキはいい感じにまるまるとした食べごろだったので、刺し身とあらに分けて美味しくいただきました。
ここ数ヶ月は釣りに行ってなかったので、釣れるかどうか心配でした。
目的のメバルは1匹でしたが、スズキでいい感じの引きを味わえたので、良しとしておきます。
それでは今日もPython学習をすすめていきましょう!
昨日の復習
昨日は、ジェネレーターを学習しました。
リストの値を一気に処理するfor
ループと違い、一つ一つの値を一時停止させながら、順番に処理できる特徴がありました。
def greeting():
yield 'Good morning'
yield 'Good afternoon'
yield 'Good night'
g = greeting()
print(next(g))
print('insert')
print(next(g))
print('insert')
print(next(g))
出力結果
Good morning
insert
Good afternoon
insert
Good night
for
ループとの違いは、一つ一つの値で処理を止めて他のことができるところです。
この例では、値の出力の間に、insert
を出力しています。
実際の使い所では、for
ループで一気に処理してしまうとCPUに負担をかけてしまうような場合に、一つ一つの処理を別々にすることで負担を減らしたい場合などに使われるようです。
まだ、具体的にどんな使い方があるのかわかりませんが、こんな使い方をするということをおぼえておきましょう。
リスト内包表記
リスト内包表記とは、読んで字のごとく、リストの中に包み込まれた表記です。
ラムダも関数を短くすることができたように、リスト内包表記は、for
文を使って新しいリストを作るときに、リストの中にfor
文を記載して、コードを短くすることが可能です。
t = (1, 2, 3, 4, 5)
l = []
for i in t:
l.append(i)
print(l)
出力結果
[1, 2, 3, 4, 5]
空のリストl
を用意して、for
ループを回して、append
メソッドでリストに変数t
のタプルの値を代入していきます。
この処理を次のような1行で書くことが可能です。
l = [i for i in t]
最初のコードと同様に、変数l
を出力すれば、同じ結果が出力されます。
条件も付け加えられる
t = (1, 2, 3, 4, 5)
l = []
for i in t:
if i % 2 == 0:
l.append(i)
print(l)
出力結果
[2, 4]
%
は、商の余りを求める記号なので、2で割って余りが0になる場合は、変数l
に値を追加するif
文を追加しています。
この条件式もリスト内包表記で書くことが可能です。
l = [i for i in t if i % 2 ==0]
if
を改行せずに続けて記載していますが、これで上記コードと同じ出力になります。
forループのネストも可能
さらに、for
ループの中にfor
ループを入れるネストもリスト内包表記で書くことが可能です。
t = (1, 2, 3, 4, 5)
t2 = (6, 7, 8, 9, 10)
l = []
for i in t:
for j in t2:
l.append(i * j)
print(l)
#このように書ける
l = [i * j for i in t for j in t2]
print(l)
出力結果
[6, 7, 8, 9, 10, 12, 14, 16, 18, 20, 18, 21, 24, 27, 30, 24, 28, 32, 36, 40, 30, 35, 40, 45, 50]
[6, 7, 8, 9, 10, 12, 14, 16, 18, 20, 18, 21, 24, 27, 30, 24, 28, 32, 36, 40, 30, 35, 40, 45, 50]
リスト内包表記の構造は次のような感じです。
[計算式 for 変数名1 in タプル1 for 変数名2 in タプル2]
この処理では、変数i
に1が入った時点で、変数j
にタプルt2
の値をを順番に入れていくので、最初の5つの値は、タブルt2
の値に1をかけた値が入ります。変数i
の2巡目のループでは、2倍、3巡目は3倍という感じで、変数l
に値が入っていき、最終的に25この値の入ったリストが出来上がります。
このように、いくつでもfor
ループをネストすることができるので、ついつい長く続けてしまいますが、注意が必要です。
見やすいコードが大切
リスト内包表記は、コードの中にappend
>が入らないので、処理が早くなったり、コードが短くなったりするので、よく使われますが、あまりにも長い表記になると、逆にみにくいコードになってしまいます。
Pythonの基本は見やすくてわかりやすいコード
なので、あまりに長いネストになってしまうと意味がわからなくなっちゃいます。
それにコード自体が醜くく!?(見にくく)なっちゃいますので、基本的には、単独のfor
文だけや、条件を一つ入れた単純なコードをリスト内包表記にするとおぼえておきましょう。
矢継はやにどんどん新しいことを学習していますので、過去の学習も振り返りながら、学習するようにしましょう。
それでは、明日もGood Python!