LoginSignup
1
3

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-05-24

前書き

組み込み関数, 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(の実装)はその兄弟。

参考

1
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3