つくる:レシート表示
このレッスンで作るもの — 第 1 章の総仕上げとして、4 行のレシートを返す
make_receiptを作ります。おこづかい帳アプリの誕生です。
つくる — レシート表示
ここまでで print と return、文字列の連結、四則演算、実行順序、コメント、エラーの読み方を扱いました。この章の最後に、それらを 1 本にまとめます。
作るのは kakeibo.py の中心になる関数 make_receipt です。呼ぶと下記の 4 行を返します。
=== おこづかい帳 ===
りんご 120円
みかん 80円
合計 200円見出し、品物 2 行、そして合計。おこづかい帳の一番小さな完成形です。
大きなものは、小さくて動くものから育てます。まず「必ず同じ結果を返す」形で完成させておくと、あとから中身を差し替えるのが楽になります。
引数を取らない理由
make_receipt には引数を付けません。品名も金額もコードの中に書いた決め打ちです。「それでは使えないのでは」と思うところですが、これは意図した第一歩です。
第 1 章ではまだ 変数 を習っていません。値に名前を付けて持ち回る道具がないので、外から渡された値を組み立てに使うのは無理があります。そこでまず「形」だけを完成させます。
第 2 章では、この関数が make_receipt(name, price) に進化します。決め打ちだった りんご と 120 の場所に、外から渡された値が入るようになります。今日はその受け皿を先に作っているわけです。
組み立て方
4 行を \n でつないで、1 本の文字列として返します。前回と同じ要領ですが、行が 1 つ増えます。
def make_receipt():
return "=== おこづかい帳 ===" + "\n" + "りんご 120円" + "\n" + "みかん 80円" + "\n" + "合計 200円"1 行が長くなってきました。読みやすさのために、かっこで囲んで途中で改行する書き方もできます。
def make_receipt():
return (
"=== おこづかい帳 ===" + "\n"
+ "りんご 120円" + "\n"
+ "みかん 80円" + "\n"
+ "合計 200円"
)かっこの中では、コードを何行に分けても 1 つの式として扱われます。結果はまったく同じです。どちらで書いても構いません。
1 行が長すぎると、どこを間違えたのか目で追えなくなります。かっこで区切って 1 行 1 要素にすると、間違いが見つけやすくなります。
合計の 200 はどこから来たか
120 + 80 で 200 です。ただ、この計算結果を文字列につなぐには、数値を文字列に変える str が必要になります。それは第 2 章の内容なので、今回は "合計 200円" と文字列で書いてしまいます。
代わりに、その 200 がどう出た数字なのかを # のコメントで残しておきます。前回学んだコメントの正しい使い方そのものです。
def make_receipt():
# 合計 200 は りんご 120 と みかん 80 の和
return "=== おこづかい帳 ===" + "\n" + "りんご 120円" + "\n" + "みかん 80円" + "\n" + "合計 200円"手元で動かしてみる
kakeibo.py という名前でファイルを作り、下記のように書いて保存します。関数の定義と、それを呼び出して表示する行の 2 つが入っています。
def make_receipt():
# 合計 200 は りんご 120 と みかん 80 の和
return "=== おこづかい帳 ===" + "\n" + "りんご 120円" + "\n" + "みかん 80円" + "\n" + "合計 200円"
print(make_receipt())def の行が先、呼び出しがあと、という実行順序の規則をここでも守っています。print(make_receipt()) は「関数を呼んで戻ってきた文字列を、そのまま画面に出す」という意味です。
\n は print に渡されたときに本物の改行として解釈されるので、画面には 4 行として出ます。文字列の中では 2 文字ですが、表示されるときには改行 1 つになる、という二段構えです。
ここで作った
make_receiptは、この先ずっと育て続ける関数です。第 9 章の完成形まで、名前は変わりません。今日の 4 行が出発点になります。
よくある間違い
- 末尾に
\nを付けてしまう —"合計 200円"のうしろに改行を足すと、見た目には分からない差でテストが落ちます。改行は行と行の間だけです。 - 半角と全角が混ざる —
120円の120は半角、円は全角です。数字を全角で打つと別の文字になり、一致しません。 - 見出しの記号を間違える — 見出しはイコール
=が半角 3 つ、内側は半角スペース 1 つずつです。==や====では通りません。
print で表示して満足してしまうのもよくある落とし穴です。採点は戻り値だけを見るので、必ず return で返してください。
やってみよう
関数 make_receipt を実装してください。引数は取りません。下記の 4 行を \n でつないだ 1 本の文字列を return します。
1 行目は === おこづかい帳 ===、2 行目は りんご 120円、3 行目は みかん 80円、4 行目は 合計 200円 です。末尾に改行は付けません。合計がどう出た数字なのかを # のコメントで残しておくと、第 2 章で書き換えるときに自分が助かります。
要件
- 関数名は make_receipt で、引数は取らない
- 1行目は "= おこづかい帳 ="、2行目は "りんご 120円"、3行目は "みかん 80円"、4行目は "合計 200円"
- 行の区切りは \n を使い、末尾には改行を付けない
- print ではなく return で1本の文字列を返す
入出力例
make_receipt() → "=== おこづかい帳 ===
りんご 120円
みかん 80円
合計 200円"
make_receipt() → "=== おこづかい帳 ===
りんご 120円
みかん 80円
合計 200円"
make_receipt() → "=== おこづかい帳 ===
りんご 120円
みかん 80円
合計 200円"
make_receipt() → "=== おこづかい帳 ===
りんご 120円
みかん 80円
合計 200円"
make_receipt() → "=== おこづかい帳 ===
りんご 120円
みかん 80円
合計 200円"