第5章 関数¶
関数定義、デフォルト引数、スコープの基本を確認してから、高階関数、クロージャ、デコレータを題材にした問題に進みます。
問題一覧¶
- 0500: 状態を持つ累算関数:外側の関数で作った状態を、内側の関数から更新します。
- 0501: 引数を束ねるレコード関数:位置専用引数、可変長引数、キーワード専用引数、可変長キーワード引数を1つの関数で扱います。
- 0502: 呼び出し回数を数えるデコレータ:関数を包み、呼び出された回数を属性として持つデコレータを作ります。
- 0503: 共有しないデフォルト引数:None をデフォルト値にして、呼び出し間でリストを共有しない関数を作ります。
- 0550: 関数合成のモノイド:1引数関数の合成 compose と反復合成 iterate を実装し、関数合成がモノイドをなすことを確認します。
- 0551: メモ化デコレータと動的計画法:functools.wraps を使ったメモ化デコレータを自作し、重複部分問題を持つ再帰計算を多項式時間で扱います。
- 0552: 不動点コンビネータ:λ計算の Z コンビネータに倣い、名前による自己参照なしで再帰を実現する不動点コンビネータ fix を実装します。
- 0553: トランポリンと継続渡し形式:サンクを返す関数をループで駆動するトランポリンを実装し、再帰制限を超える深さの計算を実行します。
- 0554: シグネチャによる自動カリー化:inspect.signature で仮引数の個数を調べ、位置引数が揃うまで部分適用を返すカリー化デコレータを実装します。