Pythonを使う際に心がけるべき5つのポイント〜エンジニア未経験から3年経ったので初心に帰る〜

お久しぶりです。望月です。 前回のブログでは入社からの成長を語らせていただきました。 改めてエンジニアとして入社して3年経ったということで、実務半年が経った時のメモを掘り起こしてみました。 少し忘れかけていた事もあったので改めて見直したいと思いブログにまとめさせていただきます!

Pythonはそのシンプルさと多様な標準ライブラリにより、データ解析、ウェブ開発、機械学習など幅広い分野で利用されています。 実務でPythonを使う際には、コードの品質や効率を保つためにいくつかのポイントを心がけることが重要となります。 以下に、実務でPythonを使う際に特に意識している5つのポイントを紹介します。

1. コードの可読性を保つ

Pythonは「可読性を重視する」ことが一つの特徴です。コードは他の人や自分が後で読んでも理解しやすいように書きましょう。 チームに入りたてのころよく指摘を受けていました。(懐かしい・・)

良い例

def calculate_area(radius):
    """
    この関数は円の面積を計算します
    :param radius: 円の半径
    :return: 円の面積
    """
    pi = 3.14159
    area = pi * (radius ** 2)
    return area

解説

  • 明確な関数名: calculate_areaという関数名は何を計算するか一目瞭然です。
  • ドキュメンテーションストリング: 関数の目的、引数、返り値について説明しています。コードを読んだ人がすぐに理解できます。
  • 変数名が明確: radiuspiなどは、それぞれの変数が何を表すかが直感的にわかります。

悪い例

def calc(r):
    return 3.14 * (r ** 2)

解説

  • 曖昧な関数名: calcという名前だけでは何を計算するのかが不明瞭です。
  • ドキュメンテーションがない: 関数の目的や引数、返り値についての説明がないため、コードを見ただけでは理解しづらくなります。
  • 変数名が短縮されすぎ: rという短縮形は一見して何を意味するのかがわかりにくいです。

2. エラー処理を詳細に行う

エラーが発生した場合に備えて、適切なエラー処理(例外処理)を行いましょう。特にファイル操作や外部APIの呼び出しなどでは、エラーハンドリングが重要です。 私自身、携わっているプロジェクトでAPIを利用しており、よく使っています!

良い例

try:
    with open('data.txt', 'r') as file:
        data = file.read()
except FileNotFoundError:
    print("ファイルが見つかりません")
except IOError:
    print("ファイル読み取り中にエラーが発生しました")

解説

  • 例外処理を行っている: ファイルが見つからない場合や読み取り中にエラーが発生した場合に、適切なエラーメッセージを表示することで原因を特定しやすくなります。
  • 具体的な例外をキャッチ: FileNotFoundErrorIOErrorといった具体的な例外をキャッチすることで、問題の特定が迅速かつ正確に行われます。

悪い例

with open('data.txt', 'r') as file:
    data = file.read()

解説

  • 例外処理がない: ファイルが存在しない場合や読み取りエラーが発生した場合に、プログラムがそのままクラッシュする可能性があります。
  • エラーメッセージがない: エラーが発生した際に何が悪いのかがわからず、デバッグが難しくなります。

3. コードの再利用性を高める

同じ処理を複数の場所で行う場合、関数やクラスを使って再利用可能なコードブロックに分けることをお勧めします。

良い例

def fetch_data(url):
    response = requests.get(url)
    return response.json()

data1 = fetch_data('http://example.com/api/data1')
data2 = fetch_data('http://example.com/api/data2')

解説

  • 再利用可能な関数: 同じ処理を繰り返さずに関数としてまとめることで、コードの再利用が容易になり、保守性も向上します。
  • 一貫性: N回繰り返しても同じ動作を保証するため、バグの発生率も低減されます。

悪い例

data1 = requests.get('http://example.com/api/data1').json()
data2 = requests.get('http://example.com/api/data2').json()

解説

  • コードの重複: 同じ処理が複数の場所で行われており、変更が必要な場合に全ての箇所を修正する必要があります。
  • 保守が難しい: 重複したコードが増えると保守性が低下し、エラーが発生しやすくなります。

4. テストの重要性と効果的なテスト方法

テストは、コードの品質を保ち、バグを未然に防ぐために欠かせないプロセスです。単体テストを中心に、効果的なテスト方法について説明します。

良い例

単体テスト

import unittest

def calculate_area(radius):
    pi = 3.14159
    return pi * (radius ** 2)

class TestMathFunctions(unittest.TestCase):
    def test_calculate_area(self):
        self.assertAlmostEqual(calculate_area(1), 3.14159)
        self.assertAlmostEqual(calculate_area(2), 12.56636)
        self.assertAlmostEqual(calculate_area(0), 0)
        self.assertRaises(ValueError, calculate_area, -1)

if __name__ == '__main__':
    unittest.main()

解説

  • テストの自動化: unittestモジュールを使用してテストを自動化することで、手動でのテストが不要になり、効率が上がります。
  • エッジケースの考慮: 正常な入力だけでなく、0や負の数といったエッジケースも考慮しています。
  • 例外処理のテスト: 不適切な値が入力された場合に正しくエラーが発生するかもテストしています。

悪い例

テストがない場合

def calculate_area(radius):
    pi = 3.14159
    return pi * (radius ** 2)

# コードを実行するが、テストがないため結果の正当性を確認できない
result = calculate_area(1)
print(result)

解説

  • テストがない: コードの正当性を確認するためのテストが欠如しており、結果が正しいかどうかを確認できません。
  • 手動確認: 手動で結果を確認するのは非効率かつエラーを見逃しやすくなります。

5. コードのパフォーマンスに注意を払う

効率的なコードを書くことは非常に重要です。特に大量のデータを扱う場合、処理時間やメモリ使用量に気をつける必要があります。

良い例

numbers = [i for i in range(10 ** 6)]
total = sum(numbers)

解説

  • 効率的なリスト生成: リスト内包表記を使うことで、より速くメモリ効率の良いリスト生成が可能です。
  • 効率的な計算: Pythonの組み込み関数sumを使うことで、内部で最適化された処理を行って計算が高速化されます。

悪い例

total = 0
for i in range(10 ** 6):
    total += i

解説

  • 非効率なループ: 一つ一つの要素を手動で加算するため、処理時間が増加します。
  • 可読性の低下: 繰り返しの処理が明示的に書かれており、コードの可読性が低下します。

以上のポイントを意識することで、コードの品質が向上し、メンテナンスや拡張が容易になります。

前回のブログでもお伝えしましたが、私はエンジニアとして成長するために、多くの試行錯誤を重ねてきました。特にPythonにおいては、今回ご紹介したポイントを常日頃から意識して書くことで、その感覚を自然と身に付けることができました。

例えば、コードの可読性を大切にしながら書くことで、後々のメンテナンスが格段に楽になることを実感しました。また、エラー処理をしっかりと行うことによって、予期しない問題に迅速に対応できるようになりました。さらには、テストを導入することでコードの信頼性が大きく向上し、チーム全体の開発効率も向上しました。

長い道のりでしたが、これらのポイントを意識して日々のプロジェクトに取り組むことで、実際にどれだけの効果があるのかを体感することができました。これからも努力を続け、さらなる成長を目指していきたいと思います。

皆さんも、ぜひこれらのポイントを意識してPythonコードを書いてみてください。きっと、コードの品質が向上し、プロジェクト全体の生産性も上がることでしょう。

それではまた、次回のブログでお会いしましょう。お互いに学びと成長の旅を続けていきましょう!