引数と戻り値

このレッスンで作るもの — 引数で値を渡し、return で結果を受け取る流れを固めます。税込価格を計算する add_tax を作ります。

引数と戻り値

関数は「材料を渡すと答えを返してくれる箱」です。材料の入口が 引数、答えの出口が 戻り値 です。この 2 つが分かると、関数は一気に使える道具になります。

おこづかい帳では、税抜の値段から税込の値段を出したい場面があります。これを add_tax という関数にします。

引数と戻り値がある関数は、中身を知らなくても使えます。「何を渡すと何が返るか」だけ決まっていれば十分です。

引数はいくつでも書ける

かっこの中にカンマ区切りで並べた名前が、そのまま関数の中の変数になります。

def add(a, b): return a + b result = add(120, 80)

add(120, 80) と呼ぶと、a120b80 が入ります。書いた順に前から詰まっていく のが基本の渡し方で、これを位置引数と呼びます。順番を入れ替えると入る値も入れ替わるので、add(80, 120) は別の呼び出しです。

引数が 1 つの関数なら、下記のように書けます。

def add_tax(price): return price * 110 // 100

消費税を整数のまま計算する

税率 10 パーセントなので price * 1.1 としたくなりますが、Python の小数計算には誤差があります。290 * 1.1318.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 になり、total220 です。変数に入れずに、直接 print(add_tax(120)) と書くこともできます。

diagram (will load when visible)

動きを追ってみる

add_tax(999) の流れは下記のとおりです。

  1. 999 が引数 price に入る
  2. 999 * 110109890 になる
  3. 109890 // 1001098 になる
  4. 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 章の最後では、この組み合わせ方を本格的に使います。

よくある間違い

  1. 引数の順番を間違える — 位置引数は前から順に入ります。split(people, total) のように順を取り違えると、エラーは出ないのに答えだけが狂います。いちばん見つけにくい種類のバグです。
  2. 引数の数が合わないadd_tax() のように渡し忘れると TypeError になり、missing 1 required positional argument と教えてくれます。多すぎても同じく TypeError です。
  3. /// を取り違えるprice * 110 / 100 は小数の 132.0 になります。132 とは別の値なので、テストは落ちます。整数が欲しいときは // です。

やってみよう

関数 add_tax(price) を実装してください。税抜価格 price を受け取り、消費税 10 パーセントを加えた税込価格を return します。1 円未満は切り捨てます。

price * 110 // 100 で計算できます。price0 のときは 0 を返します。手元では print(add_tax(120)) を実行して 132 になることを確かめ、add_tax(290)319 になることも見ておいてください。小数で計算したときとの差が体感できます。

要件

  1. 関数名は add_tax で、引数は price の 1 つ
  2. 戻り値は消費税 10 パーセントを加えた整数の税込価格
  3. 1 円未満は切り捨てる
  4. 小数ではなく整数のまま計算する

入出力例

add_tax(120)132 add_tax(100)110 add_tax(999)1098 add_tax(290)319 add_tax(0)0

ヒント

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

メモ

引数と戻り値

⌘S で保存