より良い Python コードを書くための 7 つのテクニック

動作するコードを書くことは常に十分ではありません。理解しやすい構造化されたコードを書くようにする必要があります。クリーンなコードは、あなたと他の人がソフトウェアを保守しやすくします。

Python には、よりクリーンなコードを書くのに役立つ多くの機能があります。その中でも優れたものをいくつかご紹介します。

1. コンテキスト マネージャーでリソースのクローズを自動化する

コードが多数のリソースとやり取りしている場合、リソースを手動でクローズするのは不便です。リソースをクローズし忘れる可能性があります。これにより、プログラムはシステム リソースを非効率に使用し、メモリ リークが発生する可能性があります。

このコードではファイルを開いて手動でクローズします:

file = open('test.txt', 'r')
file_contents = file.read()
file.close()
words = file_contents.split(' ')
word_count = len(words)
print(word_count)

コンテキスト マネージャーを使用してファイルのクローズを自動化できます。コンテキスト マネージャーはリソースを処理してくれるので、手動で管理する必要はありません。withステートメントを使用して、リソースを管理するコンテキストを作成します:

with open('test.txt', 'r') as file:
file_contents = file.read()
words = file_contents.split(' ')
word_count = len(words)
print(word_count)

このブロック内のコードは、openが返すファイル オブジェクトのコンテキスト内で実行されます。例外が発生した場合でも、コードがそのコンテキストから外れると Python は自動的にそのファイルをクローズします。

2. よりクリーンな条件分岐文を書く

if-else ステートメントを扱うとき、不要なコードをたくさん書いていることに気付くかもしれません。Python には、よりコンパクトなステートメントを書くのに役立つ三項演算子があります。以下のコード ブロックは、通常の if-else ステートメントを示しています。

condition = True
if condition:
x = 1
else:
x = 0
print(x)

このコードは、条件を 1 行のコードで記述できる三項演算子を使用して書き直すことができます。

condition = True
x = 1 if condition else 0
print(x)

簡単なロジックを実装するときは三項演算子を使用する必要があることに注意することが重要です。より複雑なロジックとネストされた条件分岐文では、三項演算子は理解しにくくなる可能性があります。

3. enumerate 関数で項目を追跡する

Python のリストを反復処理するときは、現在の項目のインデックスに 2 つの方法でアクセスできます。1 つは従来の for ループを使用する方法です。これは問題なく動作しますが、コードはできるだけクリーンではありません。また、インデックスを手動で初期化する必要があります。

cars = ['Bugatti', 'Mercedes', 'Toyota']
index = 0
for car in cars:
print(index, car)
index += 1

もう 1 つの方法は、Python の組み込み関数である enumerate を使用する方法です。これにより、ループ中にリスト内のインデックスと対応する値にアクセスできます。

cars = ['Bugatti', 'Mercedes', 'Toyota']
for index, car in enumerate (cars):
print(index, car)

これで、インデックスを手動で追跡する必要がなくなります。

4. zip 関数で複数のリストをループ処理する

enumerate 関数を使用して、一度に複数のリストをループ処理することもできます。最初のリストのインデックスを取得してから、それを使用して他のリストの対応する値にアクセスします。

english_names = ['food', 'water', 'car']
spanish_names = ['alimento', 'agua', 'auto']
for index, name in enumerate(english_names):
spanish = spanish_names [index]
print (f' {name} in spanish is {spanish}')

これは問題なく動作しますが、リストの数が増えると不要なコードをたくさん書く必要があります。よりクリーンなコードを書くには、zip 関数を使用し、リストの名前を渡すことができます。

english_names = ['food', 'water', 'car']
spanish_names = ['alimento', 'agua', 'auto']
for english, spanish in zip(english_names, spanish_names):
print(f' {english} in spanish is {spanish}')

1 つのリストをループ処理するには enumerate 関数を使用し続ける必要があります。ただし、複数のリストをまとめてループ処理する場合は、zip 関数を使用することを検討してください。

5. GetPass で機密性の高いユーザー入力を隠す

機密情報を 입력するときは、入力は画面にプレーン テキストとして表示されるべきではありません。Python で入力を取得する通常の方法は、input 関数を使用することです:

username = input('Username: ')
password = input('Password: ')
print('Logging In...')

ただし、input 関数を使用すると、パスワードは入力中に画面にプレーン テキストとして表示されます。パスワードが画面に表示されないようにするには、代わりに getpass 関数を使用する必要があります:

from getpass import getpass
username = input('Username: ')
password = getpass('Password:')
print('Logging In...')

getpass モジュールは Python の標準ライブラリの一部であるため、インストールする必要はありません。

6. アンダー スコア プレースホルダーを使用して大きな数字を読みやすくする

プログラムで大きな数字を扱う場合、それらは一目で読むのが非常に難しくなる可能性があります。変数に間違った数字を割り当てるとプログラムが誤動作し、このエラーを見つけるのは非常に困難になる可能性があります。

num1 = 10000000000
num2 = 100000000
total = num1 + num2
print(total)

上のコードは、アンダースコアを使用して数千のグループを区切ることで書き直すことができます。これは、大きな数字を読みやすくするための一般的な方法です。

num1 = 10_000_000_000
num2 = 100_000_000
total = num1 + num2
print(f'{total:,}')

print 関数の f 文字列は、数千の区切り記号を使用して出力を区切ります。

7. ヘルプ関数を使用してモジュールについてさらに学習する

help 関数は Python で非常に重要です。インストールしたモジュールの使用方法を教えてくれます。使用するには、モジュールをインストールしてから、ターミナルで Python インタープリターを起動し、モジュールをインストールしたパスを指定します。モジュールをインポートし、最後にモジュールの名前を help 関数に渡します。

使用できるメソッドと属性を確認するには、help 関数を dir 関数に置き換えます。

dir 関数はモジュールがサポートするメソッドと属性を返しますが、ドキュメント全体を返すわけではありません。これは、モジュールの機能をざっと把握したい場合に便利です。

よりクリーンな Python コードを書く

Python は非常に多様な言語です。他の言語と同様に、時間の経過とともに、よりクリーンな Python コードを書くことができるようになります。

Python には多くの組み込みモジュールと関数があります。場合によっては、特定の関数の存在を知らないために、読みづらいコードを書いてしまうことがあります。より多くの情報を確実に得るために、より良いコードの書き方に関する記事をもっと読むべきです。