map
このレッスンでできるようになること。map を使って、支出リストの全要素を同じルールで別の値へ変換できるようになります。
map(関数, リスト) は、リストの要素を1つずつ関数に渡し、その戻り値を順に取り出せるものを返します。前のレッスンで見たとおり、渡すのは関数オブジェクトなのでカッコは付けません。
Python
amounts = [220, 640, 1280]
print(list(map(str, amounts))) # ['220', '640', '1280']ここで大事なのは list() です。map が返すのは map オブジェクトという「これから順に作る」入れ物で、そのまま print すると map object at 0x... のような素っ気ない表示になります。結果をリストとして扱いたいときは必ず list() に通してください。しかも map オブジェクトは一度使い切ると空になるため、二度目のループでは何も出てきません。早めに list へ固めるのが安全です。
短い変換なら、その場で名前の無い関数を書ける lambda が便利です。lambda 引数: 式 と書くと、式の値を返す関数オブジェクトになります。変換関数、map の呼び出し、リスト化を分けて読むと、何を渡しているかが見えます。
Python
minutes = [2, 5, 8]
to_seconds = lambda minute: minute * 60
seconds = map(to_seconds, minutes)
print(list(seconds)) # [120, 300, 480]map の第1引数は関数そのもの、第2引数は変換するデータです。関数を渡すときは呼び出しのカッコを付けません。演習でもこの3段階に分けて、支出1件を税込金額へ変換する関数を作ってください。
税込金額は a * 1.1 でも計算できますが、そうすると 242.00000000000003 のような値が出ることがあります。家計簿の金額は円単位の整数で持ちたいので、110 を掛けてから 100 で整数除算する a * 110 // 100 の形にします。金額は int のまま扱う、と決めておくと表示も比較も揺れません。
要件
- 支出1件の amount * 110 // 100 を返す lambda を作る
- 変換関数と expenses を map に渡す
- map の結果を list にして返す