Python にまつわるアイデア: Pythonic その2

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

参考