データ処理タスクを行うとき、私はしばしば、ある入力反復可能なデータに一連のコンポジション、ベクトル化関数などを適用して最終結果を生成します。理想的には、リストとジェネレータの両方で動作するもの(他のイテラブルに加えて)が必要です。私はこれを達成するためにコードを構造化するための多くのアプローチを考えることができますが、私が考えることができるあらゆる方法は、私に汚れている/ unidiomaticと感じる1つ以上の方法があります。私はこれを行うために考えることができるさまざまな方法を以下に概説しましたが、私の質問はです。これを行うには、推薦的で慣用的な方法がありますか?一般の代表である簡単な例を示す私は考えることができるイテラブルに連続ステップを適用するためのPythonイディオム
方法、:
これは、すべての非のために読み取ることがしばしば非常に困難である一つの大きな表現として
result = [sum(group)
for key, group in itertools.groupby(
filter(lambda x: x <= 2, [x **2 for x in input]),
keyfunc=lambda x: x % 3)]
それを書きます簡単な一連のステップ。コードを読み取ると、逆の順序で各ステップが発生します。
保存が各段階別の変数名に
squared = [x**2 for x in input]
filtered = filter(lambda x: x < 2, squared)
grouped = itertools.groupby(filtered, keyfunc=lambda x: x % 3)
result = [sum(group) for key, group in grouped]
これは、多くの場合、記述的に名前を付けるために難しいことができますローカル変数の数を紹介。さらに、中間ステップのいくつかまたはすべての結果が特に大きい場合には、メモリを非常に無駄にする可能性があります。このプロセスにステップを追加する場合は、すべての変数名が正しく更新されるように注意する必要があります。たとえば、すべての数値を2つに分割する場合は、行番号halved = [x/2.0 for x in filtered]
を追加しますが、変更する必要があります次の行にfiltered
〜halved
となります。
ストア同じ変数名に各ステップ
tmp = [x**2 for x in input]
tmp = filter(lambda x: x < 2, tmp)
tmp = itertools.groupby(tmp, keyfunc=lambda x: x % 3)
result = [sum(group) for key, group in tmp]
私は、これは、これらのオプションの最小悪いように私には思われると思いますが、一般的に名前のプレースホルダ変数で物事を格納することは私には非Python的に感じているとそこにはよりよい道があると私に思わせます。
これは主に意見と好みのスタイルの問題です。他のスタイルもあります。より自然なカスケードを可能にする['fluent interface'](https://en.wikipedia.org/wiki/Fluent_interface)または[' method chaining'](https://en.wikipedia.org/wiki/Method_chaining)通話の – AChampion