入力を受け取る
このレッスンで作るもの — キーボードから受け取る
inputを覚え、受け取った 1 本の文字列を品名と金額に分解します。
入力を受け取る
ここまでのおこづかい帳は、品名も金額もコードの中に書いてありました。使うたびにコードを書き換えるのでは、道具として使えません。人がその場で打ち込めるようにします。
そのための命令が input です。
input の書き方
input を呼ぶと、プログラムはそこで止まって人の入力を待ちます。何か打って Enter を押すと、その内容が戻り値として返ってきます。
text = input("品名と金額を入力してください ")
print(text)かっこの中に書いた文字列は、入力を待つ前に画面へ表示されます。何を打てばよいのかを人に伝えるための案内文で、省いても構いません。
りんご 120 と打って Enter を押すと、text には "りんご 120" が入ります。
inputは「人が打ち終わるまでプログラムを止める」命令です。止まったまま何も起きないように見えたら、入力待ちかどうかを疑います。
返ってくるのは必ず文字列
いちばん大事な性質がこれです。input の戻り値は どんなときも str になります。
price_text = input("金額 ")
print(type(price_text).__name__)120 と打ち込んでも、表示されるのは str です。数字だけを打っても int にはなりません。
だから、そのまま計算しようとすると事故が起きます。
price_text = input("金額 ")
print(price_text + 100)これは TypeError です。数字を打ったのに足し算ができません。正しくは int を通します。
price = int(input("金額 "))
print(price + 100)3 つ前のレッスンで覚えた int が、ここで本当に必要になります。input と int はほぼ必ずセットで使う、と覚えておいて構いません。
演習で引数を使う理由
このコースの採点は、みなさんが書いた関数を自動で呼んで戻り値を確かめる仕組みです。そこには人がいないので、input の前で止まると誰も打ち込めません。採点環境では input を使えないようにしてあります。
そこで演習では、input が返してきたはずの文字列を 引数で受け取る 関数を書いてもらいます。
text = input("品名と金額 ")
result = parse_input(text)input で受け取る部分と、受け取った文字列を処理する部分を分けた形です。分けておくと、処理のほうだけを何度でもテストできます。実務でも「入力を取る係」と「中身を扱う係」は分けるのが定石なので、遠回りではなく正しい形です。
手元の
kakeibo.pyではinputを書いて構いません。実際に打ち込んで動かせます。採点に出すのは分解する側の関数だけです。
1 本の文字列を分ける
りんご 120 と打たれた文字列は、品名と金額がくっついた 1 本の str です。これを 2 つに分けます。使うのが split です。
text = "りんご 120"
print(text.split(" "))split は「区切り文字で切り分ける」命令です。半角スペースで切ると、りんご と 120 の 2 つに分かれます。
分かれた 2 つは、左右に名前を並べて一度に受け取れます。
name, price_text = text.split(" ")これで name に "りんご"、price_text に "120" が入ります。変数を 2 つ並べて = の左に書くと、切り分けた結果が順番に入っていきます。
price_text はまだ文字列なので、int で数値にします。
name, price_text = text.split(" ")
price = int(price_text)name が "りんご" で str、price が 120 で int です。ここまで来て、ようやく金額が計算できる形になりました。
動きを追ってみる
parse_input("パン 080") の流れです。
- 引数
textに"パン 080"が入る text.split(" ")がパンと080に切り分けるnameに"パン"、price_textに"080"が入るint(price_text)が80を作る。先頭の0は消えるnameと80を並べたものが戻り値になる
戻り値は [name, price] という形で、2 つの値を順番に並べて返します。この角かっこの正体はリストといって、第 7 章でたっぷり扱います。今は「複数の値をまとめて返すときの書き方」として使ってください。
打ち間違いへの備えはまだしていません。
りんごとだけ打たれたり、金額にabcと打たれたりすると落ちます。落ちないようにする方法は第 8 章のtryで扱います。
よくある間違い
inputの結果をそのまま計算に使う — 戻り値は必ずstrです。intを通さないとTypeErrorになります。splitの結果を 1 つの変数で受ける —name = text.split(" ")と書くと、切り分けた 2 つがまとめてnameに入ります。左に 2 つ名前を並べます。- 区切りが全角スペースになっている —
split(" ")は半角スペースで切ります。全角スペースで打たれた文字列は切れません。
やってみよう
関数 parse_input を実装してください。引数は input が返してきた想定の文字列 text で、"りんご 120" のように品名と金額が半角スペース 1 つで区切られています。
これを分解して、品名の文字列と、int に変換した金額を並べた [name, price] を返します。parse_input("りんご 120") は ["りんご", 120] です。金額は必ず数値にしてください。文字列のままだと落ちます。
書けたら、手元の kakeibo.py で parse_input(input("品名と金額 ")) と書いて、自分で打ち込んだ内容が分解される様子を見てみてください。ここまでの型変換が、全部つながって効いてくるのが分かります。
要件
- 関数名は parse_input で、引数は text の1つ
- 半角スペースで品名と金額に分ける
- 金額は int で数値に変換する
- [品名, 金額] の順に並べて return する
入出力例
parse_input("りんご 120") → ["りんご",120]
parse_input("牛乳 198") → ["牛乳",198]
parse_input("ノート 0") → ["ノート",0]
parse_input("チョコレートアイス 1200") → ["チョコレートアイス",1200]
parse_input("パン 080") → ["パン",80]