01 / 07
いつも書いている3行
「リストの中身を全部2倍にした、新しいリストがほしい」。こういう処理は本当によく出てくる。
いまのやりかたなら3つの手順を踏むよね。空のリストを作る、for で回す、append で足す。
kazus = [1, 2, 3]baisu = []for x in kazus: baisu.append(x * 2)print(baisu)実行結果
[2, 4, 6]
内包表記
INPUT · スライド
01 / 07
「リストの中身を全部2倍にした、新しいリストがほしい」。こういう処理は本当によく出てくる。
いまのやりかたなら3つの手順を踏むよね。空のリストを作る、for で回す、append で足す。
kazus = [1, 2, 3]baisu = []for x in kazus: baisu.append(x * 2)print(baisu)実行結果
[2, 4, 6]
02 / 07
Pythonには、この形だけを短く書く専用の書きかたがある。内包表記(ないほうひょうき)だよ。
角かっこの中に 作るもの for 名前 in 回すもの と書く。それだけで新しいリストができあがる。
kazus = [1, 2, 3]baisu = [x * 2 for x in kazus]print(baisu)実行結果
[2, 4, 6]
03 / 07
同じことをする2つのコードを並べてみよう。結果はまったく同じだよ。
baisu = []for x in kazus: baisu.append(x * 2)baisu = [x * 2 for x in kazus]4行が1行になった。しかも空のリストを用意し忘れるという事故も起きない。
kazus = [1, 2, 3]a = []for x in kazus: a.append(x * 2)b = [x * 2 for x in kazus]print(a)print(b)print(a == b)実行結果
[2, 4, 6] [2, 4, 6] True
04 / 07
[x * 2 for x in kazus] の読みかたはこう。
**「kazus の中の x それぞれについて、x * 2 を並べたリスト」**
慣れるまでは順番が逆に感じるはず。うしろの for x in kazus を先に読んで、そのあと先頭の x * 2 に戻る。
でも慣れるとこちらのほうが読みやすくなる。「何を作るのか」が行の先頭に書いてあるからだよ。for 版だと4行目の append まで読まないと、何を作っているのか分からないよね。
namaes = ["ゆい", "はると"]print([n + "さん" for n in namaes])実行結果
['ゆいさん', 'はるとさん']
05 / 07
in のうしろはリストでなくてもいい。for で回せるものなら何でも置けるよ。range でも文字列でも動く。
第8章でやった「回せるもの」の話が、そのままここに効いてくるんだ。
print([x * x for x in range(1, 6)])print([m for m in "あいう"])実行結果
[1, 4, 9, 16, 25] ['あ', 'い', 'う']
06 / 07
正直にいうと、内包表記は書けなくても困らない。for と append で全部書けるからね。
それでもわざわざ1章使うのは、読めないと詰まるからだよ。GitHubにあるPythonのコードを開けば、まず間違いなく内包表記が出てくる。仕事で受け取るコードにも、ライブラリの中にも、当たり前のように並んでいる。
だからこの章の目標は「書けるようになる」より、見た瞬間に意味が分かることだよ。
07 / 07
気をつけてほしいのは、短く書くこと自体は目的ではないということ。
目的は読みやすさで、内包表記はたいていの場合それに貢献する——という順番で覚えてほしい。詰めこみすぎて読めなくなったら本末転倒だよ。
次のレッスンでは、ここに if を足して「いるものだけを集める」書きかたを覚えよう。