2013/02/22

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

参考

0 件のコメント: