pythonのリストはすごい

バックアップをとろう(その1) - La coda de la corsaシェルスクリプトをもうちょっと高機能にしようということで、pythonを使って書きかえています。今回は、for文とリストについて。

例のスクリプトは、バックアップを取るボリュームをソースで決めうちしていましたが、起動時に動的に指定できたほうが便利なのでそうしようと。cronで回すときに、例えばbootは一日置きに、/homeは1時間毎に、とか柔軟に対応できますから。

このスクリプトは、./backup.py boot home gentoo なんていう風に起動することになる訳ですが、pythonでは、この文字列はsys.argvというリストに格納されます。

sys.argv=["./backup.py","boot","home","gentoo"]

それで、受け取ったパラメーターについて、for文で処理していくことを考えます。これが、例えばCなんかの場合だと、一時的な変数iを使って、

for (int i = 1; i < argc; i++) {
	do_something(argv[i]);
	................
}

みたいになります。同じことをpythonで一時的変数を使って書くとこんな感じ。

for i in range(1,len(argv)-1):
	do_something(argv[i])
	..................

これだと、forの条件判断の中で関数len()を呼ぶことになるので、気持が悪い。さらに、インデックスの範囲が、len(argv)までなのかlen(argv)-1までなのか、ちょっと考えないといけません。イケていないコードだ、と言えると思います。

しかし、実はpythonのリストには、スライスというかっちょいい機能があるので、一時的な変数を省くことができます。

for param in argv[1:]:
	do_something(param)
	..................

パラメーターにアクセスするのに、一時的変数を使ってargv[i]なんて書くよりも、具体的な変数名(例えばparam)を使うことになるので、直感的で解りやすいと思います。さらに、インデックスの範囲も、指定しなければ最期までになるので、迷う余地がありません。