実用的な例
Pythonでは、反復は、特定の操作を実行するために項目のリストに移動することができます。 反復を作成する一般的な方法の1つは、次の一般的な形式を持つfor
ループを使用することです。
for i in iterable:
expression
前回の記事で説明したように、for
ループでiterableとして使用できるカスタムiteratorを作成できます。 イテレータの”ダックテスト”を満たすために、カスタムクラスは__iter__()
メソッドと__next__()
メソッドを実装する必要があります。 具体的な例を以下に示します。
上記のコードスニペットでは、__iter__()
と__next__()
の両方のメソッドを実装し、カスタムクラスCubes
イテレータのインスタンスを作成し、インスタンスをfor
ループで使用できるようにしました。
Callables
組み込みのdict
データ型のほかに、別の重要な辞書型はdefaultdict
であり、collections
モジュールで利用できます。 このディクショナリのようなデータ型には、defaultdict(])
というコンストラクタがあります。 具体的には、default_factory
引数は、関数やラムダ関数などのcallableの型です。
前回の記事では、ラムダ関数を渡すことでdefaultdict
を利用できることを示しました。 ここにその使用例があります。
>>> from collections import defaultdict
>>> letter_counts = defaultdict(lambda: 0)
>>> for i in 'abcddddeeeee':
... letter_counts += 1
...
>>> letter_counts.items()
dict_items()
特に、独自のデフォルトファクトリを作成すると、defaultdict
データ型を使用する柔軟性が向上します。 “Duck typing”の哲学では、カスタムクラスは何かを呼び出すことができるようにする__call__()
メソッドを実装する必要があります。 それがどのように動作するか見てみましょう。
上記のコードに示すように、DucklingFactory
クラスを作成し、その__call__()
関数は1つのDuckling
インスタンスのリストを返します。 このファクトリ関数を使用すると、デフォルトのアヒルのリストを乗算することで、必要なアヒルの数を作ることができます。
Len()を使用したソート
ダックタイピングの別の可能な使用法は、sort()
関数を使用してリストをソートする際に使用できるカスタムlen()
関数を実装するこ 補足として、len()
関数は、シーンの背後で__len__()
関数を呼び出すことによって実装されているため、魔法関数として参照する人もいます(接頭辞と接尾辞として二重
各アヒルの名前の長さに基づいてアヒルのリストをソートしたいとします。 ここでは、この場合にアヒルのタイピングを適用する方法です。
上記のコードスニペットでは、カスタムNamedDuck
クラスは__str__()
関数と__len__()
関数を実装しており、それぞれ10行目と12行目のインスタンスでstr()
関数とlen()
関数を使用できます。 重要なことは、あなたが見ることができるように、リストは名前付きのアヒルと文字列と混合されていますが、すべての要素はstr()
とlen()
関数を呼び出すことができ、len()
をキーとしてリストをソートし、ソートされた結果を出力したいときにリスト内包表記で使用することができます。
したがって、この使用法のより広範な意味は、異なるデータ型の要素の混合リストがある場合、各データ型が同じ関数を実装している限り、要素はduckテストに合格し、適切な操作で適用されるということです。 以下は、str
、tuple
、およびlist
のデータ型の混合リストでlen()関数を使用する一般的な使用例です。
>>> mixed_list = ]
>>> mixed_list.sort(key=len)
>>> mixed_list
, (1, 2), 'Amazing']