プログラミング

Pythonでキーボード入力を受け取るには?input()の使い方も!(ユーザー入力:標準入力:文字列取得:数値変換:バリデーションなど)

当サイトでは記事内に広告を含みます

Pythonでプログラムを書いていると、ユーザーからキーボード入力を受け取りたい場面が出てきます。名前や数値の入力・メニュー選択・設定値の対話的な入力など、キーボード入力の受け取りはPythonプログラミングの基本スキルのひとつです。

Pythonではinput()関数を使うことで、ユーザーがEnterキーを押すまでの入力を文字列として受け取れます。数値として扱いたい場合はint()やfloat()で型変換が必要です。また入力値のバリデーションや繰り返し入力促す処理も合わせて知っておくと、より実用的なプログラムが書けるようになります。

この記事では、Pythonでキーボード入力を受け取るinput()の基本から、型変換・バリデーション・複数入力・応用パターンまで、サンプルコードとともにわかりやすく解説していきます。

Pythonでキーボード入力を受け取るにはinput()関数が基本

それではまず、Pythonでキーボード入力を受け取るinput()関数の基本的な使い方について解説していきます。

Pythonのinput()は引数にプロンプト文字列を渡すと画面に表示され、ユーザーがEnterキーを押すまでの入力を文字列として返します。引数を省略するとプロンプトなしで入力待ち状態になります。


# input()の基本的な使い方(シミュレーション)
import unittest.mock as mock

# 実際のコードではinput()をそのまま使う
# name = input("お名前を入力してください:")

# 動作確認用にinputをシミュレート
with mock.patch("builtins.input", return_value="ゴリラ太郎"):
    name = input("お名前を入力してください:")

print(f"こんにちは、{name}さん!")
print(f"型:{type(name)}")

# 出力結果:こんにちは、ゴリラ太郎さん!
# 出力結果:型:

input()は常に文字列(str型)を返します。数値として扱いたい場合はint()やfloat()で型変換が必要です。プロンプト文字列はわかりやすい案内文を入れることで、ユーザーが何を入力すればよいか迷わないようになります。

input()はEnterキーが押されるまでプログラムの実行を止めてユーザーの入力を待ちます。Ctrl+Cが押された場合はKeyboardInterruptが、Ctrl+Dが押された場合はEOFErrorが発生します。本番コードではこれらの例外を適切に処理するtry-exceptの実装を検討しましょう。

input()の戻り値は常にstr型


import unittest.mock as mock

# 数値を入力してもstr型で返ってくる
with mock.patch("builtins.input", return_value="42"):
    user_input = input("数値を入力:")

print(f"入力値:{user_input}")
print(f"型:{type(user_input)}")

# 数値として使うにはint()やfloat()で変換が必要
number = int(user_input)
print(f"変換後:{number}")
print(f"型:{type(number)}")

# 変換せずに計算しようとするとエラー
try:
    result = user_input + 10
except TypeError as e:
    print(f"エラー:{e}")

# 出力結果:入力値:42
# 出力結果:型:
# 出力結果:変換後:42
# 出力結果:型:
# 出力結果:エラー:can only concatenate str (not "int") to str

input()の戻り値はどんな入力をしても必ずstr型になります。数値計算に使う場合はint()やfloat()での型変換を忘れないようにしましょう。

複数の値を1行で入力する


import unittest.mock as mock

# スペース区切りで複数の値を1行で受け取る
with mock.patch("builtins.input", return_value="アボカド 298 50"):
    user_input = input("商品名 価格 在庫をスペース区切りで入力:")

parts = user_input.split()
name = parts[0]
price = int(parts)
stock = int(parts)

print(f"商品名:{name}")
print(f"価格:{price}円")
print(f"在庫:{stock}個")
print(f"合計金額:{price * stock}円")

# 出力結果:商品名:アボカド
# 出力結果:価格:298円
# 出力結果:在庫:50個
# 出力結果:合計金額:14900円

split()を使うとスペース区切りの入力を複数の値に分割できます。複数の値を1行で入力させたい場合の定番パターンです。

型変換とバリデーションを組み合わせる方法

続いては、input()で受け取った値の型変換とバリデーション(入力チェック)を組み合わせる方法を確認していきます。

ユーザーの入力は予期しない値が来る可能性があるため、型変換とバリデーションを組み合わせた安全な入力処理を実装することが重要です。

int()変換とエラー処理を組み合わせる


import unittest.mock as mock

def get_integer_input(prompt, inputs):
    """整数を安全に受け取る関数(シミュレーション用)"""
    input_iter = iter(inputs)

    def mock_input(p):
        val = next(input_iter)
        print(f"{p}{val}")
        return val

    while True:
        user_input = mock_input(prompt)
        try:
            return int(user_input)
        except ValueError:
            print("エラー:整数を入力してください。")

# 不正な入力→不正な入力→正しい入力のシミュレーション
result = get_integer_input(
    "個数を入力してください:",
    ["abc", "3.5", "10"]
)
print(f"入力された個数:{result}")

# 出力結果:個数を入力してください:abc
# 出力結果:エラー:整数を入力してください。
# 出力結果:個数を入力してください:3.5
# 出力結果:エラー:整数を入力してください。
# 出力結果:個数を入力してください:10
# 出力結果:入力された個数:10

int()変換をtry-exceptで囲み、ValueErrorが発生した場合に再入力を促すwhile Trueループが整数入力の基本パターンです。正しい値が入力されるまで繰り返し入力を求めます。

範囲チェックを組み合わせたバリデーション


import unittest.mock as mock

def get_price_input(inputs):
    input_iter = iter(inputs)

    def mock_input(p):
        val = next(input_iter)
        print(f"{p}{val}")
        return val

    while True:
        user_input = mock_input("価格を入力してください(1〜100000円):")
        try:
            price = int(user_input)
            if price < 1:
                print("エラー:1円以上の価格を入力してください。")
                continue
            if price > 100000:
                print("エラー:100000円以下の価格を入力してください。")
                continue
            return price
        except ValueError:
            print("エラー:数値を入力してください。")

result = get_price_input(["-100", "200000", "298"])
print(f"設定価格:{result}円")

# 出力結果:価格を入力してください(1〜100000円):-100
# 出力結果:エラー:1円以上の価格を入力してください。
# 出力結果:価格を入力してください(1〜100000円):200000
# 出力結果:エラー:100000円以下の価格を入力してください。
# 出力結果:価格を入力してください(1〜100000円):298
# 出力結果:設定価格:298円

型チェックと範囲チェックを組み合わせることで、より厳密な入力バリデーションが実現できます。エラーメッセージは「何が問題か」「どう直せばよいか」が明確に伝わる文章にすることが大切です。

選択肢から選ばせる入力バリデーション


import unittest.mock as mock

def get_menu_choice(inputs):
    choices = {"1": "アボカド", "2": "サーモン", "3": "ドラゴンフルーツ", "q": "終了"}
    input_iter = iter(inputs)

    def mock_input(p):
        val = next(input_iter)
        print(f"{p}{val}")
        return val

    while True:
        print("1: アボカド  2: サーモン  3: ドラゴンフルーツ  q: 終了")
        user_input = mock_input("選択してください:")

        if user_input in choices:
            return user_input, choices[user_input]
        else:
            print(f"エラー:1・2・3・q のいずれかを入力してください。")

choice_key, choice_val = get_menu_choice(["5", "a", "2"])
print(f"選択結果:{choice_val}")

# 出力結果:1: アボカド  2: サーモン  3: ドラゴンフルーツ  q: 終了
# 出力結果:選択してください:5
# 出力結果:エラー:1・2・3・q のいずれかを入力してください。
# 出力結果:1: アボカド  2: サーモン  3: ドラゴンフルーツ  q: 終了
# 出力結果:選択してください:a
# 出力結果:エラー:1・2・3・q のいずれかを入力してください。
# 出力結果:1: アボカド  2: サーモン  3: ドラゴンフルーツ  q: 終了
# 出力結果:選択してください:2
# 出力結果:選択結果:サーモン

有効な選択肢を辞書で定義し、入力値がキーに含まれているかをin演算子でチェックするパターンは対話型メニューの定番実装です。

入力処理の応用パターン

続いては、input()を活用したより実践的な応用パターンを確認していきます。

入力処理はパスワードの非表示入力・複数回の入力収集・デフォルト値の設定など様々な場面で活用できます。

getpassでパスワードを非表示で入力する


import getpass
import unittest.mock as mock

# getpass.getpass()はパスワードを入力時に表示しない
with mock.patch("getpass.getpass", return_value="secret123"):
    password = getpass.getpass("パスワードを入力してください:")

# 簡易的なパスワード検証
def validate_password(pwd):
    if len(pwd) < 8:
        return False, "8文字以上必要です。"
    if not any(c.isdigit() for c in pwd):
        return False, "数字を含める必要があります。"
    return True, "OK"

is_valid, message = validate_password(password)
print(f"パスワード検証:{message}")

# 出力結果:パスワード検証:OK

getpass.getpass()はパスワード入力時に画面に文字を表示しないセキュアな入力関数です。ログイン処理や認証情報の入力に使いましょう。

デフォルト値付きのinput()を実装する


import unittest.mock as mock

def input_with_default(prompt, default, mock_value):
    """デフォルト値付きの入力(Enterのみでデフォルト値を使用)"""
    with mock.patch("builtins.input", return_value=mock_value):
        user_input = input(f"{prompt}(デフォルト:{default}):")
    return user_input.strip() if user_input.strip() else default

# Enterのみ(空文字)でデフォルト値を使用
result1 = input_with_default("商品名を入力", "アボカド", "")
result2 = input_with_default("価格を入力", "298", "500")

print(f"商品名:{result1}")
print(f"価格:{result2}")

# 出力結果:商品名:アボカド(デフォルト値が使用された)
# 出力結果:価格:500(入力値が使用された)

入力が空文字の場合にデフォルト値を返すパターンは、設定ファイルの編集ツールや初期値を持つ対話型スクリプトで重宝します。

複数の項目をまとめて入力収集する


import unittest.mock as mock

def collect_product_info(mock_inputs):
    """商品情報を対話的に収集する"""
    input_iter = iter(mock_inputs)

    def mock_input(prompt):
        val = next(input_iter)
        print(f"{prompt}{val}")
        return val

    product = {}

    # 商品名
    while True:
        name = mock_input("商品名:").strip()
        if name:
            product["name"] = name
            break
        print("商品名を入力してください。")

    # 価格
    while True:
        try:
            price = int(mock_input("価格(円):"))
            if price > 0:
                product["price"] = price
                break
            print("0より大きい価格を入力してください。")
        except ValueError:
            print("数値を入力してください。")

    # カテゴリ
    categories = ["食品", "部品", "PC周辺機器"]
    print(f"カテゴリ:{' / '.join(f'{i+1}:{c}' for i, c in enumerate(categories))}")
    while True:
        try:
            idx = int(mock_input("番号を選択:")) - 1
            if 0 <= idx < len(categories):
                product["category"] = categories[idx]
                break
            print("正しい番号を入力してください。")
        except ValueError:
            print("数値を入力してください。")

    return product

result = collect_product_info(["キーボード", "8500", "3"])
print(f"\n登録内容:{result}")

# 出力結果:商品名:キーボード
# 出力結果:価格(円):8500
# 出力結果:カテゴリ:1:食品 / 2:部品 / 3:PC周辺機器
# 出力結果:番号を選択:3
# 出力結果:
# 出力結果:登録内容:{'name': 'キーボード', 'price': 8500, 'category': 'PC周辺機器'}

複数の項目を順番に入力収集して辞書にまとめるパターンは、CLIツールのデータ登録機能の基本構造として活用できます。

まとめ

この記事では、Pythonでキーボード入力を受け取るinput()の使い方について、基本的な使い方から型変換・バリデーション・応用パターンまで幅広く解説しました。

input()は常にstr型を返すため、数値として使う場合はint()やfloat()で型変換が必要です。try-exceptとwhile Trueを組み合わせた再入力ループが安全な入力処理の基本パターンです。選択肢チェック・範囲チェック・空文字チェックなど、バリデーションを組み合わせることでユーザーの誤入力に対して堅牢なプログラムが書けます。パスワードの非表示入力にはgetpass.getpass()を使いましょう。

今回紹介した入力収集パターンやバリデーション関数は実務のCLIツール開発にそのまま活用できます。ぜひ実際のプロジェクトで試してみてください。

input()で受け取った値は必ずstr型のため、数値計算や比較に使う前に型変換を忘れないようにしましょう。またユーザー入力は予期しない値が来ることを前提に、try-exceptによるValueErrorの処理とwhile Trueによる再入力ループを組み合わせた安全な入力処理を実装することが大切です。