シーケンスの一部の扱い

私が疑問だった「シーケンスの一部を使いまわしできないか?」に関して自分なりに結論が出た。とりあえず、id:perezvonさんが補足してくれたのでそれも参考にする。


http://d.hatena.ne.jp/perezvon/20061103
http://d.hatena.ne.jp/perezvon/20061106
http://d.hatena.ne.jp/perezvon/20061109


私なりの結論としては、シーケンス例えば、リストはデータをクラスという枠によって隠蔽(カプセル化)している。それにより、内部データを直接リストのクライアントに扱わせることを不可能にしている。つまり、内部データ(具体的には配列のデータ)自体を取り出せないので一部のデータを取り出して操作すことも不可能。逆に操作できるように取り出す方法としては、新たなリストを作るしかない。内部データのみを取り出す方法は存在しない。つまり新たなリストのインスタンスを発生さえせるしかない。必ずクラスという「枠」がついてくる。


ここで、一部のデータを扱う方法として、インデクシングで関数により処理を書く方法と、ジェネレータにより一部を取り出す方法を考える。まず、関数にリストを渡し、インデクシングにより処理を書く方法であるが、これは確かに一部を操作できる。しかし、既にライブラリで用意されている処理でさえ自分で書かないといけないのは厳しい。


次に、ジェネレータにより一部を取り出す方法であるが、この方法なら一部をビルトイン関数にも渡せる。しかし、id:perezvonさんがまとめてくれているようにジェネレータを渡すならリストの一部をスライシングなどの方法で新たなインスタンスを作成し、それを利用した方が良い。


まとめると、現在のバージョンのPythonではシーケンスの一部を操作したいなら、まずクラスのメソッドを探す。それでやりたいことが実現できないなら新たなインスタンスを作るのがベスト。内部データはデータ保護の観点からカプセル化されていることに注意