モジュール式の再利用可能なコード
あなたの質問は確かに重要です。プログラマーの日常生活において重要です。それは質問です:
私のコードは再利用可能ですか?
そうでない場合、コードの冗長性が発生し、同じコード行が複数の場所に存在します。これは、バグの最良の出発点です。たとえば、潜在的な問題を発見したなどの理由で、何らかの方法で動作を変更したいとします。次に、1 か所で変更しますが、2 番目の場所は忘れてしまいます。特に、コードが 1,000、10,000、または 100,000 行のコードに達する場合。
これは、 SRP、Single-Responsibilty-Principleに要約されています。すべてのクラス (関数にも適用可能) は、「ただ 1 つのことを行う必要がある」という 1 つの決定のみを持つべきであると述べています。関数が複数のことを行う場合は、小さなチャンク、小さなタスクに分割する必要があります。
10 行または 20 行を超える (実際の) コードを含む関数に出くわす (または作成する) たびに、懐疑的になる必要があります。そのような機能がこの原則に固執することはめったにありません。
あなたの例では、個々のタスクとして識別できます。
- 素数を 1 つずつ生成します (生成とは、使用することを意味し
yield
ます)
n
素数を集める。1. を使用し、それらをリストに入れます
n
素数を取得します。1. を使用しますが、すべての番号を保存するのではなく、th を待つだけn
です。2.ほど多くのメモリを消費しません。
- 素数のペアを見つける: 1 を使用し、前の数を記憶し、現在の数との差が 2 の場合、このペアを生成します
- 素数のすべてのペアを収集する: 4. を使用してそれらをリストに入れます
- ...
- ...
リストは拡張可能で、どのレベルでも再利用できます。すべての関数のコードが 10 行を超えることはなく、毎回車輪を再発明する必要はありません。
それらをすべてモジュールに入れて、素数に関連するオイラー問題のすべてのスクリプトから使用します。
一般に、オイラー問題スクリプト用の小さなライブラリを開始しました。"Project Euler" で再利用可能なコードを書くことに慣れることができます。
キーワード引数
あなたが言及しなかった別のオプション (私が理解している限り) は、オプションのキーワード引数の使用です。小さくてアトミックな関数が複雑すぎると思う場合 (慣れる必要があると私は強く主張しますが)、戻り値を制御するキーワード引数を追加できます。たとえば、一部のscipy
関数にはfull_output
、bool を取るパラメータ があります。False (デフォルト) の場合は、最も重要な情報 (最適化された値など) のみが返されます。True の場合は、最適化のパフォーマンスや収束にかかった反復回数などの補足情報も返されます。
パラメータを、可能な値などで定義できoutput_mode
ます。"list"
"last"
おすすめ
小さくて再利用可能なコードのチャンクに固執します。これに慣れることは、「Project Euler」で得られる最も価値のあることの 1 つです。
述べる
私が提案する再利用可能な関数のパターンを実装しようとすると、ポイント 1: How to create a generator-style function for this? ですぐに問題に遭遇する可能性があります。たとえば、ふるい法を使用する場合。しかし、それはそれほど悪くはありません。