ホームページ  >  記事  >  バックエンド開発  >  長い Python コードをリファクタリングする方法

長い Python コードをリファクタリングする方法

WBOY
WBOY転載
2023-05-20 21:11:30707ブラウズ

1. for ループをリスト/辞書/セット式に変換する

これを行うときによく遭遇するのは、値のセットを作成することです。

たとえば、3 次の数値のリストを作成し、それを繰り返し埋めることができます。ほとんどの言語の標準的な方法は次のとおりです:

cubes = []
for i in range(20):
    cubes.append(i ** 3)

Python では、リスト式を使用して必要なデータを生成できます。このコードは 1 行に圧縮して、リストの定義や面倒な入力操作を避けることができます。

cubes = [i ** 3 for i in range(20)]

ほら、3 行のコードを 1 行に変換しました。これは間違いなく良い選択です。目でコードを上下左右にチェックする必要はありません。

コードを 1 行に圧縮すると読みにくくなりますが、これは導出式には当てはまりません。構文に慣れると、必要なすべての要素が非常に明確に表示されるため、for ループ版よりも読みやすくなります。

もう 1 つのポイントは、代入がアトミック操作に似ていることです。キューブの構築方法を指示するのではなく、キューブとは何かを宣言します。こうすることで、変数キューブの構築方法ではなく変数キューブの意味に注目するため、コードが読みやすくなります。

最後に、式は多くの場合、ループ内でコレクションを構築するよりも高速です。これは、パフォーマンスを考慮する場合にも重要な要素です。

2. 割り当てを増分割り当てに置き換える

増分割り当ては、高速でシンプルな Python 構文です。

次のようなコードがある場合:

count = count + other_value

は次のコードに置き換えることができます:

count += other_value

コードは短く明確なので、考える必要はありません。変数を2回カウントすることについて。また、マイナス等号 (-=)、ビットごとの AND 等号 (&=)、等号除算 (/=)、等号乗算 (*=) など、いくつかの演算子も使用できます。

割り当てる型には適切な演算子が定義されている必要があるため、注意が必要です。たとえば、numpy 配列は /= 演算をサポートしません。

3. インライン変数は 1 回だけ使用されます

人々のコードでよく見られる状況は、結果を一時変数に代入し、すぐにそれを返すことです。

def state_attributes(self):
    """Return the state attributes."""
    state_attr = {
        ATTR_CODE_FORMAT: self.code_format,
        ATTR_CHANGED_BY: self.changed_by,
    }
    return state_attr

実際には、一時変数を使用して結果を保存するのではなく、結果を直接返す方が良い方法です。

def state_attributes(self):
    """Return the state attributes."""
    return {
        ATTR_CODE_FORMAT: self.code_format,
        ATTR_CHANGED_BY: self.changed_by,
    }

これによりコードが短縮され、不要な変数が削除されるため、精神的な負担が軽減されます。コードを読み取る労力が消費されます。

一時変数は、パラメーターまたは条件として使用され、その名前がその内容を反映する場合に便利です。上記の例では、state 属性のみが返され、state_attr は追加情報を提供しません。したがって、結果を一時変数に代入する必要はありません。

4. if ステートメントを if 式に置き換えます

よく遭遇する状況の 1 つは、変数を 2 つの異なる値に設定したい場合です。

if condition:
    x = 1
else:
    x = 2

これは、Python の条件式構文 (Python バージョンの三項演算子) を使用して 1 行で書くことができます。

x = 1 if condition else 2

これは間違いなくより簡潔ですが、より物議を醸すものです リファクタリング (次のように)リスト式)。プログラマーの中には、if ステートメントで条件全体を記述するよりも理解しにくいため、この式を嫌う人もいます。

この改善により、条件式が短く、組み合わせることができれば効率が向上すると考えられます。リスト式の例と同様に、コードを読むとき、通常、x がどのように割り当てられているかを知る必要はありません。割り当てられてから先に進むことだけを確認するだけです。

5. 不要な式をジェネレーターで置き換える

単純な文に変換: any、all、sum などの関数を使用して、ジェネレーターをコレクションではなくパラメーターとして置き換えることができます。 。これは、

hat_found = any([is_hat(item) for item in wardrobe])

を実行する代わりに、コードを

hat_found = any(is_hat(item) for item in wardrobe)

に変更できることを意味します。これにより、括弧のペアが削除され、コードが若干明確になります。 any 関数は結果を見つけた場合、リスト全体を構築することなく、すぐに戻ります。これにより、パフォーマンスが向上する可能性があります。

実際にはジェネレーターを any() に渡していることに注意してください。厳密に言えば、コードは次のようになります。

hat_found = any(is_hat(item) for item in wardrobe)

ただし、Python ではこの括弧のペアを省略できます。ジェネレーターを受け入れる標準ライブラリ関数は次のとおりです:

'all', 'any', 'enumerate', 'frozenset', 'list', 'max', 'min', 'set', 'sum', 'tuple'

6. 条件を return ステートメントに単純化します

導入された最後のリファクタリング手法つまり、関数は True または False を返す必要があります。一般的なアプローチは次のとおりです。

def function():
    if isinstance(a, b) or issubclass(b, a):
        return True
    return False

ただし、次に示すように、結果を直接返す方がより簡潔です。

def function():
    return isinstance(a, b) or issubclass(b, a)

これは、式がブール値に評価される場合にのみ実行できます。たとえば、

def any_hats():
    hats = [item for item in wardrobe if is_hat(item)]
    if hats or self.wearing_hat():
        return True
    return False

では、bool() を使用して hat と self.wearing_hat() を bool リストに結合できます。これにより、if 条件が削除され、プログラムが簡素化されます。

rree

以上が長い Python コードをリファクタリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。