2013/02/27

Python Tips:「Code Like a Pythonista」から


Pycon 2007での発表の資料として、「Code Like a Pythonista: Idiomatic Python」というものがあります。David Goodgerという人が作ったもので、いわゆる、Pythonのイディオムを紹介したもの。イディオムとは、ここでは、「よく使う小さなコード」のことを示していて、そのおすすめの書き方がまとめられています。

まずはPEP 20――「Zen of Python」の紹介から始まり、その後さまざまな具体的なアイデアがたくさん紹介されています。

今回はこの「CodeLike a Pythonista」のうち、PEP 20PEP 8に含まれていないものに限定して、さらに、個人的に勉強になったものに絞ってご紹介します。原文にはここに挙げたよりもっとたくさんの例が載っていますので、そちらもよろしければ。

Docstringとコメントの使い分け

  • Docstring HOW TO 使い方
  • コメント WHY & HOW なぜ、どのように動くのか

値の入れ替え → 一行で


b, a = a, b
×
tmp = a
a = b
b = tmp

文字列を連結して長い文字列を作る → join()で


''.join(words)
×
result = ''
for s in words:
    result += s

''.join(fn(i) for i in items)

inが使える処理 → inでシンプルに書く


if key in d:
    # do something
×
if d.has_key(key):
    # do something

辞書の初期値を入れるための処理 → get()やsetdefault()で



d = []
for (e1, e2) in data:
    d[e1] = d.get(e1, 0) + e2
×
d = []
for (e1, e2) in data:
    if e1 not in d:
        d[e1] = 0
    d[e1] += e2

lists = {}
for (e1, e2) in data:
    lists.setdefault(e1, []).append(e2)
×
lists = {}
for (e1, e2) in data:
    if e1 in lists:
        lists[e1].append(e2)
    else:
        lists[e1] = [e2]

2つのリストをいっしょに回す → zip()で


for (e1, e2) in zip(list1, list2):
    # do something

リストが空かどうかの判定 → 判定文に変数そのものを入れる


if items:
    # do something
×
if items == []:
    # do something

ソートのルールをカスタマイズする → keyで


def my_key(item):
    return (item[1], item[3])

to_sort.sort(key=my_key)

モジュールのimport → *は使わず何を使うのかを明示的に示す


import module
module.name
×
from module import *

import long_module_name as mod
mod.name

from module import name
name

モジュールとしても、実行するスクリプトとしても使うコード → 末尾で判定


....
code
....
....

if __name__ == '__main__':
    # script code

以上です。

Pythonを使い始めてから少し経ってからでも、「そんな書き方ができるんだ」と勉強になるものが結構あります。

「Code Like a Pythonista」の中でも「Don't reinvent the wheel」(車輪の再開発をするな=すでにあるものをゼロから作るな)ということが言われていますが、意識せずとも自然にPythonicなコードが書けるようになるには、こういう基礎の部分をときどき見直すのがよいのかもしれません。

0 件のコメント: