2013/02/22

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

この投稿は「Pythonic その1」からの続きです。

引き続き「Pythoic」という概念について見ていきます。今回は具体的な例を見ながら、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なのかunpythonicなのか」と問うことができるかと思います。

単にコードを書くのではなく、「どう書いたらPythonicなコードになるだろう?」という意識をもって書くことが、よいpythonistaになる道なのではないかと思います。


参考
How to Write "Pythonic" Code
Be Pythonic

0 件のコメント: