Python / input() / ユーザー入力を変数で使う方法

Pythonのinput()は標準入力から1行を読み、文字列を返します。name = input()で変数に結び付けて使えますが、数字を入力しても計算にはint()やfloat()による変換が必要です。末尾の改行は除かれますが、内容の前後の空白は残ります。

1行を読み取って使う

Python 3だけで動き、追加パッケージは不要です。Python 3.12.14に標準入力を与えて出力を確認しました。コード全体をUTF-8のinput_demo.pyに保存し、ターミナルでpython input_demo.pyを実行します。環境によってはpython3を使います。各例はファイル内容を置き換えて個別に実行してください。

起動後にJBを入力してEnterを押します。この例は案内文を出さないため、最初に何も表示せず待つのは正常です。

name = input()
print(f"Hello, {name}!")
print(type(name).__name__)

プログラムの出力は次のとおりです。以降も入力した文字が端末に表示される部分を除き、プログラム自身の出力だけを示します。

Hello, JB!
str

input()の仕様にある省略可能なpromptを使うと、input("Name: ")で入力前の案内を表示できます。案内は戻り値に含まれません。標準入力はキーボードだけでなく、ファイルや他のプログラムからも受け取れます。

数値に変換して計算する

1行目に0012、2行目に1.25を入力します。input()を2回呼ぶため、同じ行にまとめて入力しません。

text = input()
print(repr(text))
print(text + "1")
number = int(text)
print(number + 1)
price = float(input())
print(price * 2)
'0012'
00121
13
2.5

repr()は引用符を含む表現で文字列であることを示します。文字列に"1"を足すと連結されて00121、整数変換後に1を足すと13になります。整数では先頭の0が失われるので、郵便番号や商品コードなど桁の形が重要な値は文字列のまま扱います。

int("1.25")やint("hello")はValueErrorになります。小数は用途に応じてfloatへ変換します。この例の小数点はピリオドです。通貨記号や桁区切りのカンマを自動で取り除くわけではありません。floatは2進浮動小数点なので、厳密な十進の金額計算では型の選択を別途検討します。

不正な入力を再入力させる

変換できることと値が許容範囲に入ることは別です。次は0以上の年齢を受け付けます。hello、-1、20を順に1行ずつ入力します。

while True:
    try:
        text = input()
    except EOFError:
        print("Input ended.")
        break
    try:
        age = int(text)
    except ValueError:
        print("Enter a whole number.")
        continue
    if age < 0:
        print("Enter 0 or greater.")
        continue
    print(f"Accepted: {age}")
    break
Enter a whole number.
Enter 0 or greater.
Accepted: 20

ValueErrorで整数にできない入力を扱い、別の負数判定で範囲を確認します。空行も整数変換に失敗して再入力になります。成功するとbreakで終了します。例外処理の説明に従って想定した例外を限定し、EOFでは再入力を続けずループを終了します。

空白と空行を区別する

最初は空白2個、JB、空白2個を入力します。2行目は文字を入れずEnterだけを押します。

text = input()
print(repr(text))
print(repr(text.strip()))
empty = input()
print(repr(empty))
print(empty == "")
'  JB  '
'JB'
''
True

input()が除くのは改行なので、JBの前後の空白は残ります。str.strip()は前後の空白を除いた新しい文字列を返し、元の文字列は変更しません。空白に意味がある入力へ無条件に適用しないでください。空行は""でありNoneではありません。空白だけの行も空として扱うかを決めたうえでstrip後に判定します。

1行から2つの値を読む

1回のinput()で2整数を受け付けるには分割と変換を行います。10 20を1行で入力します。

parts = input().split()
if len(parts) != 2:
    print("Enter exactly two integers.")
else:
    try:
        left, right = map(int, parts)
    except ValueError:
        print("Use whole numbers.")
    else:
        print(left + right)
30

区切りを指定しないsplit()は連続する空白をまとめて区切りとします。要素が2個か確認してからmapで各要素をintへ渡します。10だけ、または3個なら個数の案内、10 helloなら整数の案内が出ます。この例は不正な入力後に終了します。再試行が必要なら前の例のようなループにします。

EOFErrorと入力できない環境

EOF(End of File)は入力ストリームの終端です。空行とは異なり、読むデータがなければEOFErrorになります。次のコードは2回読み取り、改行1個だけの入力ストリームでは以下を出力します。

for index in range(2):
    try:
        text = input()
    except EOFError:
        print("EOF")
        break
    print(repr(text))
''
EOF

最初は空文字列、次はEOFです。対話端末では最初にEnterを押し、次に入力終了を送ります。一般的なWindowsコンソールはCtrl+Zの後Enter、macOS・Linuxでは空の入力行でCtrl+Dを使いますが、端末やIDEによってキーの扱いが異なります。

IDEの出力欄が入力非対応なら、ターミナルか入力対応コンソールで実行します。オンライン採点やファイル入力では必要な行数が渡されているか確認します。入力待ちとEOFによる終了は別の状態です。数値変換のためにユーザー文字列をeval()で実行する必要はありません。