2008年6月9日月曜日

Python のイテレータ (2) - Ruby の Enumerable との比較

Python のイテレータ の続き。

1. Ruby の Enumerable モジュールのメソッドを分類する

Ruby でイテレータを書くときは、要素を保持するコンテナとなるクラスで、

  1. Enumerable モジュールをインクルードし、
  2. each メソッドを定義する。

イテレートされる、要素となるクラスでは、

  1. Comparable モジュールをインクルードし、
  2. <=> メソッドを定義して、比較可能にしておく。

Enumerable - Rubyリファレンスマニュアル には、便利なメソッドがいくつも定義されている。これを適当に分類する。

  • 要素取得
    • select , find , grep , reject
      • max , max_by , min , min_by
  • 関数の適用
    • map
    • inject
  • ソート
    • sort , sort_by ,
  • 存否確認
    • all? , any? , include?
  • 走査
    • each_with_index
  • その他
    • to_a , partition , zip

 

2. Python の組み込み関数で、iterable を引数に取る関数を分類する

上記の Ruby の Enumerable モジュールに相当するものは、 Python ではどこに定義されているのだろう?

組み込み関数 (2.1 Built-in Functions) を見ると、 iterable を引数として取るものがある。

iterable とは、enumerate() の説明の中に、

iterable はシーケンス型、イテレータ型、あるいは反復をサポートする他のオブジェクト型でなければなりません。

  • 要素取得
    • filter
      • max , min
  • 関数の適用
    • map
    • reduce
      • sum
  • ソート
    • sorted
  • 存否確認
    • all , any
  • 走査
    • enumerate
  • データ構造
    • list , set ,frozenset, tuple
  • その他
    • zip

mapfilter を合わせたものが、リスト内包表記 [x for x in S if 条件式] 。

シーケンス型 における x in S , x not in S という書き方もある。

 

関連記事