Yuta NakataのBlog

Python / AWS / ITについて役立つ情報を発信します

Pythonマスターへの近道: きれいなコードでプロになる

現場のエンジニア目線でPythonのコードの書き方について、初学者から未経験エンジニアに知ってもらいたい内容です。

一般的な話が多く、現場のスタイルに制限されるものではないので色々なところで使えるかと思います。

やってほしくないこと

変数名をカタカナ日本語にしない

# だめなコード
a = [1, 2, 3, 4, 5]
goukei = sum(a)
# 良いコード
a = [1, 2, 3, 4, 5]
total = sum(a)

goukeiは日本語です。

適切な英単語に書き換えましょう。

ただし、Pythonには予約語といって使うべきではない単語があります(例えば、sumなど)。

それらの言葉は回避して使ってください。

http://www.ic.daito.ac.jp/~mizutani/python/intro8_python.html

複雑な条件分岐、ループ構造を作らない

# だめなコード
if x == 1:
    if y == 2:
        if z == 3:
elif x == 2:
    pass
elif x == 3:
    pass
# 良いコード
if x == 1 and y == 2 and z == 3:
    pass
elif x >= 2:
    pass

2重・3重となるif文の実装はやめましょう。

また、多数のelifで分岐するのもやめましょう。

for文も同様です。多重実装はNGです。

条件分岐・ループ構造は、エンジニアの力量が現れます。書き方をよく考えましょう。

素人エンジニアに最も多いのが、このケースです。

直書きしない

# だめなコード
a = [1, ,2, 3, 4, 5]

total = sum(a)

print(a)
# 良いコード

def get_total(data):
    return sum(data)

if __name__ == '__main__':
    print(get_total([1, ,2, 3, 4, 5]))

関数を使わず、直書きするのはやめましょう。

機能ごとに関数化して処理まとめることで、問題の特定がしやすくなります。

関数部分と直書き部分を混ぜない

# だめなコード

def process1():
    pass

a = process1()

def process2():
    pass

b = process2()
# 良いコード

def process1():
    pass

def process2():
    pass

a = process1()
b = process2()

関数化して書く部分、処理を行う部分は分けて書きましょう。

できれば、ファイルを分けるのもGoodです。

OOPオブジェクト指向プログラミング)の考え方を理解せず、クラス化を多様しない

オブジェクト指向プログラミングは、抽象度が高く概念的な側面があります。

なぜ、オブジェクト指向なのか?

そこで、なぜクラス化がメリットあるのか?

適切に理解していないと、クラス化して書く意味を見いだせません。

まずは、下記の本を読んでオブジェクト指向を理解しましょう。クラス化はそこからです。

https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%A7%E3%81%AA%E3%81%9C%E3%81%A4%E3%81%8F%E3%82%8B%E3%81%AE%E3%81%8B-%E7%AC%AC3%E7%89%88-%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84OOP%E3%80%81%E8%A8%AD%E8%A8%88%E3%80%81%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E9%96%8B%E7%99%BA%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-%E5%B9%B3%E6%BE%A4-%E7%AB%A0/dp/4296000187

やってほしいこと

flake8を使ってリファクタリングをする

あなたの書いたコードはどこかに欠陥があります。

Pythonには、pep8というコードの書き方に関する規約があります。

qiita.com

必ずしもすべてを守るべきかはプロジェクトに寄りますが、まずはルールを確認しましょう。

flake8というライブラリを使うと、自動で検出してくれます。

pip install flake8
flake8 <対象ファイルもしくはフォルダ>

エラーコード一覧は下記からCHECK!

qiita.com

ひとまとまりのロジックを関数化し、型ヒントを導入する

関数化については、先述しました。

型ヒントも導入しましょう。

特に、型ヒントに関しては近年のPythonバージョンにて変化が激しいので、Python 3.9, 3.10, 3.11など比較的最近のものを使いましょう。

型ヒントを用いて、関数を書くとは以下のようなことを指します。

def get_total(data: list) -> int:
    return sum(data)

データベースについて学び、効率的なデータ処理の基礎を身につける

Pythonユーザーなら、Pandasを使っているケースは多いのではないでしょうか?

Pandasはとても使いやすく、直感的にデータ操作ができるため、非常に便利なためオススメです。

ですが、ここまで紹介したような、

  • 多重ループ
  • 複雑な条件分岐

をすると、計算速度が大きく低下します。

ただし、Pandasにはデフォルトで便利なメソッドがたくさんあります。

これらを上手に活用するためには、データベースについての知識があると効率的な計算処理ができます。

例えば、以下の内容を説明できますか?

  • 結合処理とは?
  • 外部結合・内部結合の違いは?
  • SELECT, WHERE, FROM, FILTERは何を指すか?

これらを理解し、DataFrameをデータベースと見たてて処理を考えると、効率的な計算を行うことができます。

入門書で結構です。一読してみてください。