30 secounds of Python codeは,その名の通り「30秒で理解できるPythonのコード集」。リスト要素のソートやシャッフル,数値列の平均の計算など,親しみやすい課題やアルゴリズムをPythonで書いたコード集。それぞれのコードは短いので,プログラムの挙動を文字通り「30秒」で理解できる。
たとえば,リスト要素のシャッフル(ランダムな並べ替え)のコードを見てみよう。
from copy import deepcopy from random import randint def shuffle(arr): temp_arr = deepcopy(arr) m = len(temp_arr) while (m): m -= 1 i = randint(0, m) temp_arr[m], temp_arr[i] = temp_arr[i], temp_arr[m] return temp_arr
「フィッシャー–イェーツのアルゴリズム」を使って,リストの要素をまぜこぜにしている。それほど難しくないので,実際にコードを読めば内容を理解できると思うけど,念のためポイントを解説する。
まず関数の中でdeepcopy()を使ってリストのコピーを取る。「temp_arr = arr」のように引数として受けたリストを単に代入すると,引数のリスト自体の並び順が変わってしまうからだ。whileループの中では,実際に要素の順番を入れ替えている。randint()関数を使ってリストを入れ替える先のインテックスを生成して,その次の行で要素の入れ替えを行っている。temp_arrをインデックスで参照している部分が似たようなコードで分かりづらいけど,よく見ると左辺と右辺で角括弧の中にある変数が異なっている(左辺はm,iで,右辺はi,m)。Pythonでは「a, b = b, a」のような代入すると,要素の入れ替えができるのだ。
Pythonの文法を知っている人でも,自分で思ったようなプログラムを作れない人は意外と多いはずだ。プログラムの動きをイメージできないことがつまづきのポイントになりやすい。短いコードを読んで,動きを頭の中で追って理解することで,プログラムの動きが分かるようになるはずだ。そうすれば,少しずつ自分で思ったようなプログラムが作れるようになる。30 secounds of Python codeは,そんな勉強にピッタリのコード集と言える。
コードにlambdaやreduceなどの高階関数が使われていたり,少しトリッキーな所もある。そういうコードは自分でループやリスト内包表記に書き換えると,より深く勉強できてよいと思う。