入力を受け取る

このレッスンで作るもの — キーボードから受け取る 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 が、ここで本当に必要になります。inputint はほぼ必ずセットで使う、と覚えておいて構いません。

diagram (will load when visible)

演習で引数を使う理由

このコースの採点は、みなさんが書いた関数を自動で呼んで戻り値を確かめる仕組みです。そこには人がいないので、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"りんご"strprice120int です。ここまで来て、ようやく金額が計算できる形になりました。

動きを追ってみる

parse_input("パン 080") の流れです。

  1. 引数 text"パン 080" が入る
  2. text.split(" ")パン080 に切り分ける
  3. name"パン"price_text"080" が入る
  4. int(price_text)80 を作る。先頭の 0 は消える
  5. name80 を並べたものが戻り値になる

戻り値は [name, price] という形で、2 つの値を順番に並べて返します。この角かっこの正体はリストといって、第 7 章でたっぷり扱います。今は「複数の値をまとめて返すときの書き方」として使ってください。

打ち間違いへの備えはまだしていません。りんご とだけ打たれたり、金額に abc と打たれたりすると落ちます。落ちないようにする方法は第 8 章の try で扱います。

よくある間違い

  1. input の結果をそのまま計算に使う — 戻り値は必ず str です。int を通さないと TypeError になります。
  2. split の結果を 1 つの変数で受けるname = text.split(" ") と書くと、切り分けた 2 つがまとめて name に入ります。左に 2 つ名前を並べます。
  3. 区切りが全角スペースになっているsplit(" ") は半角スペースで切ります。全角スペースで打たれた文字列は切れません。

やってみよう

関数 parse_input を実装してください。引数は input が返してきた想定の文字列 text で、"りんご 120" のように品名と金額が半角スペース 1 つで区切られています。

これを分解して、品名の文字列と、int に変換した金額を並べた [name, price] を返します。parse_input("りんご 120")["りんご", 120] です。金額は必ず数値にしてください。文字列のままだと落ちます。

書けたら、手元の kakeibo.pyparse_input(input("品名と金額 ")) と書いて、自分で打ち込んだ内容が分解される様子を見てみてください。ここまでの型変換が、全部つながって効いてくるのが分かります。

要件

  1. 関数名は parse_input で、引数は text の1つ
  2. 半角スペースで品名と金額に分ける
  3. 金額は int で数値に変換する
  4. [品名, 金額] の順に並べて return する

入出力例

parse_input("りんご 120")["りんご",120] parse_input("牛乳 198")["牛乳",198] parse_input("ノート 0")["ノート",0] parse_input("チョコレートアイス 1200")["チョコレートアイス",1200] parse_input("パン 080")["パン",80]

ヒント

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

メモ

入力を受け取る

⌘S で保存