関数はオブジェクト

このレッスンでできるようになること。関数そのものを値として変数や辞書に入れ、呼び出す関数を実行時に差し替えられるようになります。

Python では関数もオブジェクトです。def で作った関数の名前は、その関数オブジェクトを指している変数にすぎません。カッコを付けずに名前だけ書くと、呼び出さずに関数そのものを取り出せます。

def plain(expense): return f"{expense['name']} {expense['amount']}" show = plain # 呼び出していない。関数そのものを入れた print(show({"name": "牛乳", "amount": 220})) # 牛乳 220

カッコを付けた plain(...) は「呼んだ結果」、カッコの無い plain は「関数そのもの」です。この違いが分かると、関数を辞書の値にしたり、別の関数へ引数として渡したりできます。関数を受け取ったり返したりする関数のことを高階関数と呼びます。この章で扱う map と filter と sorted は、どれも関数を引数に取る高階関数です。

家計簿の表示形式を切り替えたいとき、if 文を長く並べる代わりに辞書を使えます。

FORMATTERS = {"plain": plain, "yen": yen} formatter = FORMATTERS["yen"] print(formatter({"name": "牛乳", "amount": 220})) # 牛乳 220円

新しい表示形式が増えても、関数を1つ書いて辞書に1行足すだけで済みます。分岐そのものをデータへ追い出せるのが、関数を値として扱う一番の利点です。逆に FORMATTERS = {"plain": plain()} のようにカッコを付けてしまうと、その場で呼ばれてしまい引数が足りずエラーになります。関数を「渡す」ときはカッコを付けない、と覚えてください。

要件

  1. 形式名をキー、関数オブジェクトを値にした辞書を作る
  2. 辞書から取り出した関数を支出1件ずつに適用する
  3. 整形済みの文字列を、元の並び順のままリストで返す

入出力例

show_expenses([{"amount":220,"name":"牛乳"},{"amount":640,"name":"電車代"}], "plain")["牛乳 220","電車代 640"] show_expenses([{"amount":220,"name":"牛乳"},{"amount":640,"name":"電車代"},{"amount":1280,"name":"コーヒー豆"}], "yen")["牛乳 220円","電車代 640円","コーヒー豆 1280円"]

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.py
学習モード

メモ

関数はオブジェクト

⌘S で保存