Edited at

関数型Python チートシート ~遅延と無限~


前書き

組み込み関数, itertools, more_itertools を網羅的・コンパクトに概観する。

前提:

イテレータを使うことで 必要に迫られるまで処理を後回しにできる。組み込み関数だけでも恩恵があるが itertoolsと サードパーティ製モジュールmore_itertoolsを使うと より表現力が増す。

表記:



  • itertoolsは接頭辞なしで言及する。例: itertools.countcount


  • more_itertoolsは接頭辞Mで言及する。例: M.chunked

  • イテはイテレータの略

意義:

個々の関数を引っ張ってこれるようになるのも重要だが、ストリーム系の処理を カテゴライズする/典型を理解する ことは長く使える知識になる。名付けと分類はその近道。


本文

イテ作成: range,iter,count,repeat,M.repeatfunc,M.iterate,M.tabulateで無からイテを作れる。cycle,M.ncycle,M.count_cycleは繰り返してカサ増し。teeはコピー。

イテ微調整: enumerateはインデックス付与, M.intersperseはセパレータ挿入。M.padded,M.padnoneは短い時の埋め草。M.prependは先頭に追加。M.collapse,M.flattenは平坦化。M.consumeはイテを進めるだけ。

イテ結合: chain,from_iterableは直列的結合。zip,zip_longest,M.zip_offsetは並列的結合。M.interleave,M.interleave_longest,M.roundrobinは別の並列的結合。

イテ分割: M.partitionは述語で2つのイテに分割。M.bucketはキー関数で分割。M.divide,M.distributeはNつに分割。M.unzipはzipの逆。

要素→listOf要素(grouping): M.chunked,M.slicedは要素をN個組に。M.grouperはイテの要素数をNに。M.split_atは述語で集める(セパレータは消失)。M.split_before,M.split_afterではセパレータは消失しない。M.split_intoは不均一に集める。

要素→listOf要素(windowing): M.windowedはWindow作成, M.pairwiseは幅2のWindow。M.staggerで変則的なWindow。

述語判定: M.adjacentは述語の判定結果を付与。M.locate,M.rlocateは述語を満たすインデックスを要素にもつイテを作成。

述語でフィルタ: filter, filterfalseが基本。takewhile,dropwhileは字義通り。M.strip,M.lstrip,M.rstripはイテの最初と最後の方にフォーカスしたフィルタ。M.first_trueはピンポイントで1個欲しい時。

非述語でフィルタ: isliceが基本。M.islice_extendedは負のインデックスを指定可。M.take,M.tailは最初/最後のN個が欲しい時。next,M.first,M.last,M.nthはピンポイントで1個欲しい時。M.unique_everseen,M.unique_justseenは(努力的に)重複排除。M.compressはマスクでフィルタ。

イテ自身に関する述語/関数: allは全数確認, anyは存在確認, M.all_equalは全部同じかを確認。M.ilenは長さ。M.oneは要素数1のアサーション兼要素取得。M.exactly_nは述語を満たす要素数をテスト。M.quantifyは述語を満たす要素数の数。

関数適用: map(注:zipWithとしても使える), starmapが簡便な時も。

集約系操作: accumulateは累積和(和以外の任意の関数も使える)。M.differenceは階差。groupByはグループ化。M.groupby_transformはグループ化+map。M.map_reduceはグループ化してその各グループ中でmap + reduceを実行。

特殊操作: M.side_effectはタップ+α。M.replaceは置換。M.sort_togetherは超便利なソート。M.collateはソート済みなN個のイテをマージ。M.dotproductは内積。 M.unique_to_eachは重複確認。M.run_length, 情報理論の圧縮技術で使うやつ。 M.numeric_range, numpyでのlinspace。

先読み系: M.spyでN個先読み。M.peekableは先読み結果に応じて微修正(prepend)したい時。M.seekableでメモしながらインデックスで行き来(メモリ注意)。

イテ生成(組み合わせ論): 必要な時にドキュメントを読むべしcombinations,combinations_with_replacement,permutations,product,M.distinct_permutations, M.circular_shifts, M.partitions, M.powerset, M.random_product, M.random_permutation, M.random_combination, M.random_combination_with_replacement, M.nth_combination


細々としたこと


  • 要素→listOf要素 は一般的に grouping ないし windowing と呼ばれる操作。


  • isliceは N個おきにとってくる takeEvery としても使える(オフセット指定も可)その観点で見るとM.distribute(の実装)はその兄弟。


参考