Pythonのミューテイタブルコンテナのミューテイタメソッド(リストのメソッドなど)は.reverse
、ほとんどの場合None
、1つの有用な値を.pop
返します。たとえば、メソッドはポップされた要素を返しますが、保持する重要な概念は、これらのミューテイタのいずれもミューテイタを返さないことです。コンテナ:むしろ、コンテナはインプレースで変異し、ミューテイタメソッドの戻り値はそのコンテナではありません。(これは、CQSの設計原理の適用です。たとえば、CQSを発明したBertrand Meyerによって考案された言語であるEiffelほど熱狂的ではありませんが、Pythonでは「実用性が純粋さを上回るためです。cfr import this
;- )。
リストの作成は、イテレータの作成よりもコストがかかることがよくあります。これは、結果をループするだけの非常に一般的なケースです。reversed
したがって、 (およびモジュール内のすべてのすばらしいビルディングブロック)などの組み込みは、リストではなくitertools
イテレータを返します。
しかし、したがって、イテレータx
があり、本当に同等のリスト y
が必要な場合はどうでしょうか。ケーキ-ただやってくださいy = list(x)
。タイプの新しいインスタンスを作成するには、タイプをlist
呼び出します。これlist
は非常に一般的なPythonのアイデアであるため、最初の2つの段落で指摘した非常に重要なものよりも保持することがさらに重要です!-)
したがって、特定の問題のコードは、前の段落の重要な概念に基づいて非常に簡単にまとめることができます。
[list(reversed(row)) for row in figure]
私はリスト内包表記を使用していることに注意してください: map
経験則として、それを構築する必要がないmap
場合にのみ、最後の最適化として使用する必要があります(aが含まれている場合は、listcomp、およびいつものようにはっきりしているので、とにかく速くなる傾向があります!-)。lambda
lambda
「Pythonの過去のマスター」になったら、プロファイリングでこのコードがボトルネックであることがわかった場合は、次のような代替手段を試すことができます。
[row[::-1] for row in figure]
ネガティブステップスライス(別名「火星のスマイリー」)を適用して、行の逆コピーを作成します。通常、list(reversed(row))
アプローチよりも高速であることがわかっています。ただし、コードを自分自身または少なくともPythonに精通した人だけが保守することを意図している場合を除き、プロファイリングでペダルを踏むように指示されている場合を除いて、最も単純な「第一原理からのコード」アプローチを使用するのは防御可能な立場です。 。(個人的には、「火星のスマイリー」は、この優れた一般的な哲学をこの特定のユースケースに適用することを避けるのに十分重要だと思いますが、この非常に特定の点で合理的な人々が異なる可能性があります!-)。