プログラムを使う人からの入力を受け取る
input()で入力された内容を読み取る方法、その値が常にstrになる理由、int()とfloat()で変換したときに出るエラーを学びます。
どうやって学びますか?
解決する問題
これまでのプログラムは、数字をファイルの中に直接書いていました。別の数字で動かしたいときは、ファイルを開いて書き換える必要がありました。
本物のプログラムは、そんなふうには動きません。プログラムがたずね、使う人が答えるのです。
Pythonでたずねる役目を担うのがinput()です。覚えるのに時間はかかりません。ただ、新人プログラマーなら必ず一度はつまずく、ルールが1つあります。input()が返すものは、相手がきちんと数字を入力したときでも、常にテキストです。 このルールを知らないだけで、最初の計算プログラムは動かなくなってしまいます。
この章を終える頃には
input()で、わかりやすい質問を表示しながら入力を読み取れる- 入力が常に
strである理由を説明できる int()とfloat()で数値に変換できるTypeError、ValueError、そしてエラーなしの誤った答えを見分けられる- 余分な空白でプログラムが壊れないよう、入力をきれいにできる
前提条件: 文字列を扱う — インデックス、スライス、f-string。
input()の仕組み
name = input("What is your name? ")
print(f"Hello, {name}!")実行します:
What is your name? Rafi
Hello, Rafi!ここでは3つのことが起きました。input()は括弧の中の質問を表示しました。次に、止まって待ちました。相手が何か入力してEnterを押すまで待ち、それから入力された内容を返しました。その内容をnameに保存しています。
質問の末尾にある空白("What is your name? ")に注目してください。これがないと、入力した文字が疑問符にくっついてしまい、見た目がおかしくなります。
このプログラムは、ターミナルで実行する必要があります。input()は人が入力するのを待つので、Webサイトやエディタのプレビュー画面では動きません。自分のターミナルでpython ask.pyを実行してください。このコース全体も、もともとそうやって進めていきます。
誰もが一度はハマるルール
age = input("Your age: ")
print(type(age))
print("Next year:", age + 1)Your age: 22
<class 'str'>
Traceback (most recent call last):
File "D:\python-lab\lesson-07\ask.py", line 3, in <module>
print("Next year:", age + 1)
~~~~^~~
TypeError: can only concatenate str (not "int") to str相手は22と入力しました。画面には数字が表示されています。それなのにtype(age)はstrと答えます。(Fileの行には、あなたのファイルのフルパスが表示されるので、お使いのパソコンでは見た目が違うはずです。)
理由を考えると納得がいきます。キーボードが生み出すのは数字ではなく、文字です。相手は22と入力するかもしれませんし、abcや12.5と入力するかもしれません。input()が「数字っぽいから変換しよう」と推測することもできたはずです。ところがそうすると、同じ行のコードが、ある時はstrを、別の時はintを返すことになり、どちらが返ってくるかを事前に知ることができなくなります。だからPythonは、「常にテキスト」という1つのルールを守っています。変換はあなたの仕事です。
int()とfloat()
age = input("Your age: ")
age = int(age)
print(type(age))
print("Next year:", age + 1)Your age: 22
<class 'int'>
Next year: 23この2つのステップは1行にまとめられることが多く、ふつうはこう書きます:
age = int(input("Your age: "))
print("Next year:", age + 1)読み方は内側から外側へです。input()がテキストを作り、int()がそれを整数に変え、結果がageに入ります。
小数を扱うならfloat()を使います:
price = float(input("Price: "))
print("With tax:", round(price * 1.15, 2))Price: 249.50
With tax: 286.92どちらを使うかの目安: 数えるもの(年齢、個数、数量)にはint、測るもの(価格、重さ、平均)にはfloatを使います。
2つのエラーと、エラーが出ないミス
変換を忘れたり、入力が不正だったりすると、3つの異なることが起こり得ます。名前が混同しやすいので、並べて見てみましょう。
TypeError — 型が間違っている。 変換を忘れて、数値をテキストに足そうとしました:
qty = input("Quantity: ")
print(qty + 2)Quantity: 3
Traceback (most recent call last):
File "D:\python-lab\lesson-07\ask.py", line 2, in <module>
print(qty + 2)
~~~~^~~
TypeError: can only concatenate str (not "int") to strqtyが持っているのはテキストの"3"です。テキストに対する+は、別のテキストをつなげることしかできず、数値は足せません。Pythonは、足し算のつもりなのか、つなげるつもりなのかを推測しないので、止まります。
まったくエラーなし — ただの誤った答え。 今度は+の代わりに*を書きます。変換はやはり忘れたままです:
qty = input("Quantity: ")
print(qty * 2)Quantity: 3
33今回はエラーがまったく出ません。"3" * 2は、テキストを2回繰り返すという意味で、結果は"33"です。プログラムは動き、答えは間違っています。エラーなしで出る誤った答えは、エラーより厄介です。 止めてくれるものも、知らせてくれるものもないからです。
ValueError — 型は正しいが、テキストが数字ではない:
age = int(input("Your age: "))Your age: twenty
Traceback (most recent call last):
File "D:\python-lab\lesson-07\ask.py", line 1, in <module>
age = int(input("Your age: "))
^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: 'twenty'int()は仕事を引き受けてくれます。ただ、'twenty'だけは受け付けられないのです。エラーメッセージには、問題の値が末尾に引用符付きで書かれています。
見落としやすい落とし穴もあります:
count = int(input("Count: "))12.5と入力すると、これでもValueErrorが出ます。int()は、小数点を含むテキストを受け付けないからです。小数の可能性があるなら、float()で受け取り、必要であれば後からint()に変換してください。
これらのエラーを防ぐために必要な道具は、まだすべては揃っていません。条件分岐とループの両方が必要で、どちらも次の章以降で扱います。今は、エラーに気づき、メッセージを読めるようになりましょう。
入力をきれいにする
相手は余分な空白を入れたり、大文字と小文字を混ぜたりします。前の章で学んだメソッドが、まさにそのために使えます:
full_name = input("Name: ").strip().title()
answer = input("Continue? (yes/no) ").strip().lower()
print(f"Name is {full_name}")
print(f"Answer is {answer}")Name: rafi ahmed
Continue? (yes/no) YES
Name is Rafi Ahmed
Answer is yesinput()から受け取ったものには、必ず.strip()をつける習慣をつけましょう。空白が1つ余分にあったくらいで、プログラムが壊れる理由はありません。
完成例
bill.py:
# Ask for one order and print a small bill
print("--- Order entry ---")
customer = input("Customer name : ").strip().title()
item = input("Item : ").strip()
quantity = int(input("Quantity : "))
unit_price = float(input("Unit price : "))
subtotal = quantity * unit_price
tax = subtotal * 0.05
total = subtotal + tax
print()
print("--- Bill ---")
print(f"Customer : {customer}")
print(f"Item : {item} x {quantity}")
print(f"Subtotal : {subtotal:.2f}")
print(f"Tax (5%) : {tax:.2f}")
print(f"Total : {total:.2f}")--- Order entry ---
Customer name : rafi ahmed
Item : notebook
Quantity : 4
Unit price : 85.50
--- Bill ---
Customer : Rafi Ahmed
Item : notebook x 4
Subtotal : 342.00
Tax (5%) : 17.10
Total : 359.10入力は4つで、それぞれ扱い方が違います。名前は空白を取り除いて先頭を大文字にし、商品名は空白を取り除くだけです。数量は整数に、単価は小数に変換します。入力のたびに、2つのことを決める必要があります。どの型が必要か、そしてどうやってきれいにするかです。
うまくいかないとき
TypeError: can only concatenate str (not "int") to str 変換が抜けています。int(input(...))またはfloat(input(...))と書いてください。
掛け算のつもりなのに、テキストが繰り返されてしまう "3" * 2は"33"になります。値をintに変換していなかったのです。この不具合はエラーが出ないので危険です。迷ったらtype()を表示してみてください。
ValueError: invalid literal for int() with base 10 相手が入力したものが整数ではありません。単語、小数、あるいは何も入力せずEnterだけを押した場合です。小数が入る可能性があるなら、float()を使ってください。
プログラムが何も表示せず、そこで止まっている 入力を待っているのです。input()に質問を渡していないと、画面には何も出ず、止まっているように見えます。必ず質問を渡すようにしましょう。
エディタの中でinput()が動かない エディタやオンラインの実行環境の中には、入力を受け付けないものがあります。ターミナルを開き、python bill.pyを実行してください。
Enterを押すと、余分な空行が出る input()は入力したテキストを受け取りますが、末尾の改行は保持しません。余分な空行は、ほぼ間違いなく自分で書いたprint()が原因です。
ステップ 4 / 6 — 予想する
理解度をチェック
相手が42と入力してEnterを押します。2行目には何が表示されますか?
value = input("Number: ")
print(type(value))- A<class 'input'>
- B<class 'int'>
- C<class 'float'>
- D<class 'str'>
相手が3と入力すると、プログラムはDoubled: 33と表示し、エラーはまったく出ませんでした。なぜでしょうか。また、何を直せばよいのでしょうか?
qty = input("Quantity: ")
print("Doubled:", qty * 2)- A`qty * 2`の代わりに`qty + qty`と書けば直ります
- B`print`の中ではカンマの代わりに`+`が必要です
- C`input()`は数字を読めないので、別の関数が必要です
- D`qty`は`str`で、テキストに数字を掛けると繰り返されてしまいます — `int(qty) * 2`が必要です
相手が12.5と入力したら、どうなりますか?
count = int(input("Count: "))
print(count + 1)- A`ValueError` — `int()`は小数点を含むテキストを受け付けません。小数の可能性があるなら`float()`で受け取ってください
- B`count`は`12`になります。`int()`が小数点以下をすべて切り捨てるからです
- C`TypeError`になります。入力と変数の型が一致しないからです
- D`count`は`13`になります。`int()`が最も近い整数に四捨五入するからです
回答にはアカウントが必要です
ログインして答えを確認
問題は上にあります。頭の中で答えを考えることがいちばん大切です。ログインすると、正解・解説・3 段階のヒントを確認できます。
やってみよう
travel.pyという名前のファイルを書いてください。このファイルは4つの質問をして、小さな計算を表示します:
- 乗客の名前(空白を取り除き、先頭を大文字にする)
- 乗客の人数(整数)
- 乗客1人あたりの運賃(小数)
- 割引率(パーセント、小数)
そのあと、合計運賃、割引額、最終的な支払額を表示してください。3つとも小数点以下2桁で表示します。
動くことを確認したら、わざと3回壊してみてください:
- 乗客の人数に
twoと入力してみてください。どんなエラーが出ますか?メッセージには何と書かれていますか? - 乗客の人数に
2.5と入力してみてください。何が起きますか?なぜでしょうか? - 名前の前後に空白を何個か入れてみてください。出力は正しく保たれますか?
最後の質問の答えが「はい」なら、もうすでに、平均的な初心者より良いコードを書けています。残りの2つへの対処法は、条件分岐とループを学んだら登場します。
このミッションにはまだ続きがあります
上で読んだ内容がミッションのすべてで、削られた部分はありません。Pro では次の内容が追加されます:
- 内部で実際に何が起きているか — Python がこれをどう実行するのか
- 演習の完全な解答と、ステップごとの解説
- さらに難しい追加演習
- このテーマでよく聞かれる面接の質問と模範解答