CHAPTER 11 · 8 lessons · 104問

もっと便利な道具

セット・collections・正規表現・再帰。知っていると急に楽になる道具を、必要な理由とセットで。

0 / 104 問クリア

この章は、これまでの章と少し性格が違う。1本の筋を通すのではなく、知っていると急に楽になる道具を集めてある。どれも「無くても書けるが、あると段違い」というものだよ。

最初は セット。リストと似ているけれど、同じ値を2つ持てない入れ物だ。「重複を消したい」というだけなら set(kazus) の一言で済む。さらに、2つのセットの共通部分・片方にしかない部分を求める演算がついていて、「両方のクラスに在籍している生徒」のような処理が1行で書ける。自分で二重ループを書く必要はもう無いよ。

次が collections。標準ライブラリの中でも特によく使われるモジュールだ。Counter は「それぞれ何個あるか」を数えるための道具で、単語の出現回数を数えるような処理が本当に1行になる。defaultdict は「まだ無いキーを触ったとき、勝手に初期値を用意してくれる辞書」で、if kagi not in jisho: という定型文を書かなくてよくなる。

そして 正規表現。文字列の中から「こういう形をしたもの」を探す仕組みだよ。電話番号、郵便番号、日付。「数字が3つ、ハイフン、数字が4つ」といったパターンで探せる。記号の羅列に見えて最初はぎょっとするけれど、この章で扱うのは基本の数個だけにする。全部覚える必要はなく、「こういうものがある」と知っていて、必要なときに調べられれば十分だよ。

最後が 再帰。関数が自分自身を呼ぶ書き方だ。実用というより考え方の道具で、「大きな問題を、同じ形の小さな問題に分けて解く」という発想を身につけるためのものだよ。フォルダの中のフォルダを辿るような、階層構造を扱うときに本領を発揮する。

この章の道具は、どれも「知らなくても書ける」。だからこそ、知らないままだと一生使わない。名前と、どういうときに出番が来るかだけでも覚えて帰ってほしい。

この章のレッスン

重なりを扱う

  1. 95同じものを1つにする入れ物セットは同じ値を2つ持てない。「重複を消したい」が set(kazus) の一言で済むよ。問題へ
  2. 962つのセットを重ねる& | - ^ の4つ。「両方にいる人」を探すのに、二重ループはもう要らないよ。問題へ

数える・まとめる

  1. 97それぞれ何個あるかを数えるCounter は数えるための辞書。第2章で書いた数えるコードが、まるごと1行になるよ。問題へ
  2. 98まだ無いキーに初期値を用意するdefaultdict があれば、if kagi not in jisho: という定型文をもう書かなくていいよ。問題へ

文字のパターン

  1. 99形をたよりに探すimport re で、「数字が3つ」のような形から文字列を探せるようになるよ。問題へ
  2. 100かっこで取り出す( ) で囲んだところだけを group(1) で受け取る。見つけた先の「分解」だよ。問題へ
  3. 101パターンで置きかえるre.sub は「形を指定して置きかえる」。replace にできなかったことができるよ。問題へ

自分を呼ぶ

  1. 102自分を呼ぶ関数関数の中で自分自身を呼ぶ。終わる条件を先に書くのがすべてだよ。問題へ

つぎは「きれいに書く」。動くコードから、読まれるコードへ。三日後の自分と、隣の誰かのために書く章。