この投稿は 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 になる道なのではないかと思います。