複数の戻り値
合計だけでは足りない
支出の一覧を見るとき、知りたいのはたいてい 1 つではありません。合計も平均も両方ほしい、というのが普通です。関数を 2 つ作って同じリストを 2 回まわすのは、いかにも無駄です。
Python の関数は、return のうしろにカンマで値を並べるだけで、複数の値をまとめて返せます。
Python
def min_and_max(a, b):
if a <= b:
return a, b
return b, a
low, high = min_and_max(300, 120)
print(low, high)120 300 が出ます。return a, b と書くと、Python は (a, b) という タプル を作って返します。タプルは変更できない並びで、リストの親戚のようなものです。
カンマで並べて、カンマで受け取る
返ってきた 2 つの値は、左辺に変数を 2 つ並べて受け取れます。これを アンパック と呼びます。左辺の数と右辺の数が合っていないと ValueError になり、not enough values to unpack と出ます。1 つの変数で受ければ、並びがまるごと 1 つの値として入ります。
アンパックはリストにも同じように効きます。この学習環境の判定はリスト形式なので、演習では リストで返す ことにします。書き方も受け取り方も、タプルのときと変わりません。
return を 2 行並べても、2 行目には決して届きません。return は関数をその場で終わらせます。返したい値が 2 つあるなら、1 つの return にカンマで並べます。
0 件で割ると止まる
平均のように割り算が入る関数では、0 で割る可能性を先に片付けます。
Python
print(sum([1, 2, 3]))
print(len([1, 2, 3]))
print(round(3.14159, 2))6 3 3.14 が出ます。sum はリストの合計、len は要素の個数を返す組み込み関数です。round の 2 つ目の引数は、小数点以下を何桁残すかで、省略すると整数に丸められます。
件数が 0 のとき len は 0 を返すので、そのまま割ると ZeroDivisionError でプログラムが止まります。関数の入口で件数を見て、決めておいた値をその場で返してしまえば、あとの計算は安心して書けます。
エラーで止まるプログラムより、決めておいた答えを返すプログラムのほうが使えます。危ない入力を先に片付けてから本題に入る、という順番は実務でもそのまま使います。
やってみよう
関数 total_and_average(prices) を実装してください。金額のリスト prices を受け取り、[合計, 平均] というリストを return します。
平均は round で小数第 1 位まで丸めます。prices が空のリストのときは [0, 0] を返します。
手元では total, average = total_and_average([120, 80, 300]) と書いて受け取り、print(total) と print(average) の両方を見てみてください。500 と 166.7 になれば正解です。
要件
- 関数名は total_and_average で、引数はリスト prices の 1 つ
- 戻り値は [合計, 平均] のリスト
- 平均は round で小数第 1 位まで丸める
- prices が空のリストのときは [0, 0] を返す