はじめに
とっても大好き、略してTD1、nikkieです。
『良いコード/悪いコードで学ぶ設計入門』(通称ミノ駆動本)の読書ログです。
次回のミノ駆動本_読書pyに向けた、7章「コレクション」の予習ノートを公開します。
目次
- はじめに
- 目次
- 7章「コレクション」
- 7章目次
- 自前実装、Pythonだったら?(7.1)
- ファーストクラスコレクション in Python(7.3)
- ジェネレータ
- 終わりに
- P.S. 3/24(金) 7章「コレクション」のミノ駆動本_読書py!
7章「コレクション」
配列やループ処理を扱うのが7章!
7章目次
公開されている目次を引用します。
7 コレクション ―ネストを解消する構造化技法―
7.1 わざわざ自前でコレクション処理を実装してしまう
7.2 ループ処理中の条件分岐ネスト
7.3 低凝集なコレクション処理
一読して想起したPython関連の話題を書き出していきます。
自前実装、Pythonだったら?(7.1)
Pythonの組み込み関数、filter
やmap
が浮かびました。
filter(function, iterable)
map(function, iterable, *iterables)
これらに関する発表として存在を思い出したのが、PyCon JP 2020の「関数型Pythonアンチパターン」
- スライドをざっと見たら
filter
やmap
を内包表記に置き換え!2 - 『Effective Python 第2版』でも「項目27 mapやfilterの代わりにリスト内包表記を使う」
また、ライブラリにあるけれど知らないばっかりに自前で実装してしまうケースについては
- 標準ライブラリ itertools
このモジュールは イテレータ を構築する部品を実装しています。
- サードパーティの more-itertools3
ファーストクラスコレクション in Python(7.3)
ミノ駆動本にもサンプルコードはありますが、増田本(『現場で役立つシステム設計の原則』)との合わせ技で盤石な印象です。
第1章の「複雑さを閉じ込める」でコレクションオブジェクト(=ファーストクラスコレクション)が紹介されます。
ファーストクラスコレクション自体は何回か実装したことがあり、便利さも感じていますが、どう実装するのがいいのかはこの機に振り返りたいところです。
最近はcollections.abc.Sequence
4を継承して実装しています5。
__len__
メソッドの実装__getitem__
メソッドの実装
この2つの特殊メソッドを実装すると、for
文で反復できるようになります6。
「まだ答えを持っていないな〜」という点の1つが、スライスのサポート。
__getitem__
メソッドのkey
引数は整数(int
)の場合だけでなく、スライスの場合も考慮が必要です。
リストやタプルの動きを念頭に
key
引数がint
の場合は、その要素を返す(返り値はコレクションではない)key
引数がスライスの場合は、スライスが指す範囲の要素からなるコレクションを返す(返り値はいわば、部分コレクション)
で実装しています。
個人的にはこれでしっくり来ているのですが、他の実装も知りたいですね〜
命名について、『リーダブルコード』の3章(3.1)にあるのですが、filterよりはselectやexcludeのほうが誤解が少ないそうです。
そんなわけで、ファーストクラスコレクションのメソッドの命名にはselectやexcludeを使っています。
ジェネレータ
コレクションというトピック × Pythonで考えたいな〜と思ったのがジェネレータ。
Pythonではジェネレータが一番メモリ効率がよいと理解しています7。
Pythonでコレクションといったら組み込みのリスト(list
)型が簡単に使えるのですが
- リストよりジェネレータを優先的に使う(「自信を持ってコードを書こう」 pycharity 2020)
- リストを返さずにジェネレータを返すことを考える(『Effective Python 第2版』項目30)
のように、effectivenessを考えるとジェネレータに利があるという理解です。
ファーストクラスコレクション、メモリに展開せずにジェネレータとして実装できるのかな?
ちょっと考えてみたいです。
終わりに
ミノ駆動本 7章「コレクション」の読書会に向けた予習ノートでした。
Pythonで考えたいトピックとしては
- 自前で実装に関連して
- 内包表記
- itertoolsやmore-itertools
- ファーストクラスコレクションの実装
- ジェネレータ
を挙げました。
P.S. 3/24(金) 7章「コレクション」のミノ駆動本_読書py!
次回ミノ駆動本_読書py(Python使い視点でミノ駆動本を読む、みんなのアウトプット中心の読書会)は3/24(金)、なんとラス2です!
このトピックに興味がある・知りたいという方や、Pythonでの経験豊富な方までどんな立場の方も大歓迎!
ぜひぜひお気軽にお越しください〜
公開ありがとうございます!
— nikkie にっきー (@ftnext) 2023年3月5日
次回の #ミノ駆動本 読書pyは3/24(金)本編20:30〜です。
7章 コレクションを読みます。
ファーストクラスコレクションなどが解説される章!
実は残るは7章と12章というところまで読み進めており(15章以降は範囲外)、3/24の回はラス2なんです🙌2️⃣ https://t.co/5wjMZBCtTw
- 『白い砂のアクアトープ』23話見ました!↩
- https://speakerdeck.com/ukyo/guan-shu-xing-pythonantipatan?slide=25↩
- も〜っと itertoolsってことですね↩
- https://docs.python.org/ja/3/library/collections.abc.html#collections.abc.Sequence↩
-
__iter__
メソッドの実装も試しました↩ - 過去の発表でも扱いました。↩
- ↩