この投稿は Pythonic その1 の続きです。
引き続き「 Pythonic 」という概念について見ていきます。今回は具体的な例を見ながら Pythonic とはどういうことなのかをご紹介します。まずは for ループの書き方から。
○が pythonic なもの、☓がそうでないものです。
for ループ
×:
for i in range(len(alist)):
print alist[i]○:
for item in alist:
print itemループでのカウンタ変数の使用は、どうしても必要なときだけに留めます。
×:
i = 0
for item in alist:
print i, item
i += 1○:
for i, item in enumerate(alist):
print i, itemカウンタ変数が必要な場合は、 enumerate() を使えばシンプルに書くことができます。
○:
for key, value in adict.items():
print key, value辞書の key と value をあわせて取得したい場合は、辞書の items() メソッドを使うとシンプルに書くことができます。
リスト内包表記/ジェネレータ式
×:
newlist = []
for x in oldlist:
newlist.append(x ** 2)○:
newlist = [x ** 2 for x in oldlist]既存のリストから新しいリストを作るときには、 for ループではなく内包表記を使うのが便利でシンプルです。
○:
for ele in (x ** 2 for x in oldlist):
print ele要素を少しずつ計算していく「ジェネレータ」についても、リスト内包表記と同じような書き方で書くことができます。ちがいは [] が () になっている点のみです。
アンパック
×:
def calc_sin_cos(x):
return (sin(x), cos(x))
results = calc_sin_cos(1.57)
sinx = results[0]
cosx = results[1]○:
sinx, cosx = calc_sin_cos(1.57)関数が複数の要素を返す(=タプルを返す)場合は、戻り値を受け取るときに別個の変数に分割することが可能です。
値の交換
×:
tmp = x
x = y
y = tmp○:
y, x = x, yふたつの変数の値を交換するときには、まとめて一文で行います。
・・・以上です。
今回見たのは小さな単位での書き方の例ですが、もっと大きな、変数やモジュールの命名やコード全体の構成といったところにも「それは Pythonic なのかどうか」を問うことができるかと思います。
単にコードを書くのではなく、「どう書いたら Pythonic なコードになるだろう?」という意識をもって書くことが、よい pythonista になる道なのではないかと思います。