引数と戻り値
このレッスンで作るもの — 引数で値を渡し、
returnで結果を受け取る流れを固めます。税込価格を計算するadd_taxを作ります。
引数と戻り値
関数は「材料を渡すと答えを返してくれる箱」です。材料の入口が 引数、答えの出口が 戻り値 です。この 2 つが分かると、関数は一気に使える道具になります。
おこづかい帳では、税抜の値段から税込の値段を出したい場面があります。これを add_tax という関数にします。
引数と戻り値がある関数は、中身を知らなくても使えます。「何を渡すと何が返るか」だけ決まっていれば十分です。
引数はいくつでも書ける
かっこの中にカンマ区切りで並べた名前が、そのまま関数の中の変数になります。
def add(a, b):
return a + b
result = add(120, 80)add(120, 80) と呼ぶと、a に 120、b に 80 が入ります。書いた順に前から詰まっていく のが基本の渡し方で、これを位置引数と呼びます。順番を入れ替えると入る値も入れ替わるので、add(80, 120) は別の呼び出しです。
引数が 1 つの関数なら、下記のように書けます。
def add_tax(price):
return price * 110 // 100消費税を整数のまま計算する
税率 10 パーセントなので price * 1.1 としたくなりますが、Python の小数計算には誤差があります。290 * 1.1 は 318.99999999999994 になり、切り捨てると 318 という 1 円ずれた答えが出ます。
そこで 110 を掛けてから 100 で割ります。第 3 章で学んだ切り捨て除算 // を使うと、途中も答えも整数のままです。
price = 290
print(price * 110 // 100)これは 319 になります。お金の計算では、こうして整数のまま扱うのが定石です。
小数の誤差はバグの温床です。円やポイントのように「1 円未満が存在しない」値は、整数のまま計算し切るのが安全です。
戻り値は 1 つの値として扱える
return した値は、その場所にそのまま置き換わります。だから関数の呼び出しは、式の中にそのまま書けます。
total = add_tax(120) + add_tax(80)add_tax(120) が 132 に、add_tax(80) が 88 になり、total は 220 です。変数に入れずに、直接 print(add_tax(120)) と書くこともできます。
動きを追ってみる
add_tax(999) の流れは下記のとおりです。
999が引数priceに入る999 * 110で109890になる109890 // 100で1098になる1098が戻り値として返る
1098.9 の小数部分が切り捨てられて 1098 です。// は必ず小さい方へ丸めるので、税込価格が 1 円多くなることはありません。
手元で動かしてみる
kakeibo.py に下記を書いて実行してみてください。第 2 章で作った make_receipt の中で add_tax を呼ぶ形になっています。
def add_tax(price):
return price * 110 // 100
def make_receipt(name, price):
return name + " " + str(add_tax(price)) + "円"
print(make_receipt("りんご", 120))
print(add_tax(999))りんご 132円 と 1098 が表示されます。ここで大事なのは、make_receipt の中から add_tax を呼べている点です。関数は他の関数からも呼べます。
こうして小さな関数を組み合わせていくと、1 つひとつは短いまま、できることだけが増えていきます。第 6 章の最後では、この組み合わせ方を本格的に使います。
よくある間違い
- 引数の順番を間違える — 位置引数は前から順に入ります。
split(people, total)のように順を取り違えると、エラーは出ないのに答えだけが狂います。いちばん見つけにくい種類のバグです。 - 引数の数が合わない —
add_tax()のように渡し忘れるとTypeErrorになり、missing 1 required positional argumentと教えてくれます。多すぎても同じくTypeErrorです。 /と//を取り違える —price * 110 / 100は小数の132.0になります。132とは別の値なので、テストは落ちます。整数が欲しいときは//です。
やってみよう
関数 add_tax(price) を実装してください。税抜価格 price を受け取り、消費税 10 パーセントを加えた税込価格を return します。1 円未満は切り捨てます。
price * 110 // 100 で計算できます。price が 0 のときは 0 を返します。手元では print(add_tax(120)) を実行して 132 になることを確かめ、add_tax(290) が 319 になることも見ておいてください。小数で計算したときとの差が体感できます。
要件
- 関数名は add_tax で、引数は price の 1 つ
- 戻り値は消費税 10 パーセントを加えた整数の税込価格
- 1 円未満は切り捨てる
- 小数ではなく整数のまま計算する
入出力例
add_tax(120) → 132
add_tax(100) → 110
add_tax(999) → 1098
add_tax(290) → 319
add_tax(0) → 0