これを行うときによく遭遇するのは、値のセットを作成することです。
たとえば、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 つのポイントは、代入がアトミック操作に似ていることです。キューブの構築方法を指示するのではなく、キューブとは何かを宣言します。こうすることで、変数キューブの構築方法ではなく変数キューブの意味に注目するため、コードが読みやすくなります。
最後に、式は多くの場合、ループ内でコレクションを構築するよりも高速です。これは、パフォーマンスを考慮する場合にも重要な要素です。
増分割り当ては、高速でシンプルな Python 構文です。
次のようなコードがある場合:
count = count + other_value
は次のコードに置き換えることができます:
count += other_value
コードは短く明確なので、考える必要はありません。変数を2回カウントすることについて。また、マイナス等号 (-=)、ビットごとの AND 等号 (&=)、等号除算 (/=)、等号乗算 (*=) など、いくつかの演算子も使用できます。
割り当てる型には適切な演算子が定義されている必要があるため、注意が必要です。たとえば、numpy 配列は /= 演算をサポートしません。
人々のコードでよく見られる状況は、結果を一時変数に代入し、すぐにそれを返すことです。
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 は追加情報を提供しません。したがって、結果を一時変数に代入する必要はありません。
よく遭遇する状況の 1 つは、変数を 2 つの異なる値に設定したい場合です。
if condition: x = 1 else: x = 2
これは、Python の条件式構文 (Python バージョンの三項演算子) を使用して 1 行で書くことができます。
x = 1 if condition else 2
これは間違いなくより簡潔ですが、より物議を醸すものです リファクタリング (次のように)リスト式)。プログラマーの中には、if ステートメントで条件全体を記述するよりも理解しにくいため、この式を嫌う人もいます。
この改善により、条件式が短く、組み合わせることができれば効率が向上すると考えられます。リスト式の例と同様に、コードを読むとき、通常、x がどのように割り当てられているかを知る必要はありません。割り当てられてから先に進むことだけを確認するだけです。
単純な文に変換: 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'ログイン後にコピー
導入された最後のリファクタリング手法つまり、関数は 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 サイトの他の関連記事を参照してください。