コンテンツにスキップ

2.1.4 入力と出力

Python 入力処理と出力のフローチャート

このページを終えたら、この evidence card を残します。

概念
変数、型、演算子、入力/出力、分岐、ループ、構造、関数、またはモジュール
コード
この概念のための最小限の実行可能な Python スニペット
出力
印字値、型、branch結果、loop trace、または返り値
失敗確認
型不一致、インデント、オフバイワン、可変データ、または import パスの問題
期待される成果
概念が機能することを証明するコードと出力結果

この節では、プログラムがユーザーとやり取りできるようになります。input で情報を受け取り、print で結果を表示し、さらに f-string を使った整った出力まで学びます。これは、今後のコマンドラインツール、API のデバッグ、結果表示の土台になります。

  • print() のさまざまな使い方とフォーマット付き出力を理解する
  • input() でユーザー入力を受け取れるようになる
  • f-string の高度な書式設定を理解する
  • 簡単な対話型プログラムを書けるようになる

Python を学び始めたら、まずはこの流れをつかめば十分です。プログラムが入力を受け取り、少し処理して、結果を出力する。後半で出てくる CLI、API、RAG、Agent も、本質的にはこの流れのくり返しです。

まずは小さなプログラムを見てみよう

Section titled “まずは小さなプログラムを見てみよう”
service = input("サービス名を入力してください: ")
latency_ms = int(input("レイテンシ(ms)を入力してください: "))
print(f"サービス: {service}")
print(f"秒に直したレイテンシ: {latency_ms / 1000:.2f}")
print(f"10 ms 後のアラートしきい値: {latency_ms + 10} ms")

実行結果:

項目
サービス入力ログイン API
レイテンシ入力185 ms
秒に直した値0.18
アラートしきい値195 ms

これが最も基本的な入出力です。input() がデータの受け取りを担当し、print() が結果の表示を担当します。


print() は、あなたが最もよく使う関数です。

# 文字列を出力
print("Hello, World!")
# 数字を出力
print(42)
print(3.14)
# 変数を出力
name = "Python"
print(name)
# 式の結果を出力
print(1 + 2 + 3) # 6
# カンマ区切りにすると、print が自動でスペースでつなぐ
print("サービス:", "ログイン API", "レイテンシ:", 185, "ms")
# 出力: サービス: ログイン API レイテンシ: 185 ms
# 区切り文字を自分で指定する
print("2026", "01", "15", sep="-")
# 出力: 2026-01-15
print("lint", "test", "deploy", sep=" | ")
# 出力: lint | test | deploy
# デフォルトでは print のたびに改行される
print("1行目")
print("2行目")
# 出力:
# 1行目
# 2行目
# end 引数で末尾の文字を変更する
print("Hello", end=" ")
print("World")
# 出力: Hello World(同じ行に表示)
# end を使って簡単な進捗表示をする
print("読み込み中", end="")
print(".", end="")
print(".", end="")
print(".", end="")
print(" 完了!")
# 出力: 読み込み中... 完了!
# 改行文字 \n
print("1行目\n2行目\n3行目")
# 出力:
# 1行目
# 2行目
# 3行目
# タブ文字 \t(整列に使う)
print("タスク\t担当者\t状態")
print("ログイン API\tMina\t完了")
print("ダッシュボード UI\tKai\t進行中")
# 出力:
# タスク 担当者 状態
# ログイン API Mina 完了
# ダッシュボード UI Kai 進行中
# バックスラッシュそのもの \\
print("ファイルパス: C:\\Users\\Desktop")
# raw 文字列(エスケープを処理しない)
print(r"ファイルパス: C:\Users\Desktop") # r プレフィックスは raw 文字列を表す

f-string は Python 3.6 で導入された文字列の書式設定方法で、現在もっともおすすめの方法です。

service = "ログイン API"
owner = "Mina"
latency_ms = 92.567
# 文字列の前に f を付け、波かっこに変数名を書く
print(f"{service}{owner} が担当しています")
# 出力: ログイン API は Mina が担当しています
# 波かっこの中には任意の式を書ける
print(f"次のリトライ番号は {2 + 1} です")
print(f"サービス名は {len(service)} 文字です")
print(f"100 ms 目標内ですか?{'はい' if latency_ms < 100 else 'いいえ'}")

これは f-string のとても強力な機能の 1 つです。

# 小数点以下の桁数を指定する
pi = 3.141592653589793
print(f"π = {pi:.2f}") # 3.14(小数点以下 2 桁)
print(f"π = {pi:.4f}") # 3.1416(小数点以下 4 桁)
# パーセント表示
accuracy = 0.8734
print(f"正解率: {accuracy:.1%}") # 87.3%
print(f"正解率: {accuracy:.2%}") # 87.34%
# 3 桁ごとの区切り
population = 1400000000
print(f"人口: {population:,}") # 1,400,000,000
print(f"人口: {population:_}") # 1_400_000_000
# 科学技術計数法
speed_of_light = 299792458
print(f"光速: {speed_of_light:.2e} m/s") # 3.00e+08 m/s
# 整数を 0 埋めする
for i in range(1, 4):
print(f"第 {i:03d} 話") # 第 001 話、第 002 話、第 003 話
# 左寄せ、右寄せ、中央寄せ
name = "Python"
print(f"|{name:<20}|") # |Python | 左寄せ
print(f"|{name:>20}|") # | Python| 右寄せ
print(f"|{name:^20}|") # | Python | 中央寄せ
# 指定した文字で埋める
print(f"|{name:*<20}|") # |Python**************|
print(f"|{name:*>20}|") # |**************Python|
print(f"|{name:*^20}|") # |*******Python*******|
# 実用例: 簡単な表を出力する
print(f"{'サービス':<16}{'レイテンシ':>10}")
print("-" * 20)
print(f"{'ログイン API':<16}{95:>10}")
print(f"{'検索 API':<16}{187:>10}")
print(f"{'Worker':<16}{42:>10}")

出力:

サービス レイテンシ
--------------------
ログイン API 95
検索 API 187
Worker 42
書式意味結果
:.2f小数点以下 2 桁までf"{3.14159:.2f}"3.14
:.1%パーセント表示(小数 1 桁)f"{0.873:.1%}"87.3%
:,3 桁区切りf"{1000000:,}"1,000,000
:.2e科学技術計数法f"{12345:.2e}"1.23e+04
:03d3 桁まで 0 埋めf"{5:03d}"005
:<10左寄せ、幅 10f"{'hi':<10}"hi________
:>10右寄せ、幅 10f"{'hi':>10}"________hi
:^10中央寄せ、幅 10f"{'hi':^10}"____hi____

input() でユーザー入力を受け取る

Section titled “input() でユーザー入力を受け取る”

input() はプログラムを一時停止し、ユーザーの入力を待ちます。そして、入力された内容を文字列として返します。

# input() の戻り値は常に文字列!
service = input("サービス名を入力してください: ")
print(f"{service} を確認しています!")
print(type(service)) # <class 'str'>
# よくある落とし穴
latency = input("レイテンシ(ms)を入力してください: ") # ユーザーが 185 を入力
print(type(latency)) # <class 'str'>、int ではない!
# そのまま数値計算すると問題になる
# print(latency + 10) # エラー!文字列に数字は足せない
# 正しい方法: 先に型変換する
latency = int(input("レイテンシ(ms)を入力してください: ")) # 入力と同時に整数へ変換
print(f"アラートしきい値: {latency + 10} ms")
# 浮動小数点数が必要な場合
timeout = float(input("タイムアウト秒数を入力してください: "))
print(f"タイムアウトは {timeout} 秒です")

ユーザーは、予想と違う内容を入力することがあります。

# ユーザーが数字ではなく "abc" を入力した場合
# latency_ms = int(input("レイテンシを ms で入力してください: ")) # ValueError になる!
# 安全な方法(後で例外処理を学ぶと、もっときれいに書ける)
user_input = input("数字を 1 つ入力してください: ")
if user_input.isdigit():
number = int(user_input)
print(f"入力した数字は: {number} です")
else:
print("有効な数字ではありません!")

print("=== 簡易電卓 ===")
num1 = float(input("1つ目の数を入力してください: "))
num2 = float(input("2つ目の数を入力してください: "))
print(f"\n計算結果:")
print(f"{num1} + {num2} = {num1 + num2}")
print(f"{num1} - {num2} = {num1 - num2}")
print(f"{num1} × {num2} = {num1 * num2}")
if num2 != 0:
print(f"{num1} ÷ {num2} = {num1 / num2:.2f}")
else:
print("0 で割ることはできません!")
# 学習結果データを模擬する
model_name = "ResNet-50"
total_epochs = 100
train_accuracy = 0.9534
val_accuracy = 0.9187
train_loss = 0.1245
val_loss = 0.2891
training_hours = 2.5
# フォーマット済みのレポートを作成する
print("=" * 40)
print(f"{'モデル学習レポート':^40}")
print("=" * 40)
print(f"モデル名: {model_name}")
print(f"学習回数: {total_epochs}")
print(f"学習正解率: {train_accuracy:.2%}")
print(f"検証正解率: {val_accuracy:.2%}")
print(f"学習損失: {train_loss:.4f}")
print(f"検証損失: {val_loss:.4f}")
print(f"学習時間: {training_hours:.1f} 時間")
print("-" * 40)
# モデルの状態を判定する
gap = train_accuracy - val_accuracy
if gap > 0.05:
print(f"⚠️ 過学習のリスク: 学習/検証の差 {gap:.2%}")
else:
print(f"✅ モデルの状態は良好です: 学習/検証の差 {gap:.2%}")
print("=" * 40)

出力の要約:

項目
モデルResNet-50
学習回数100
正解率学習 95.34%、検証 91.87%
損失学習 0.1245、検証 0.2891
学習時間2.5 時間
警告過学習リスク:差 3.47%

練習 1: プロジェクト状態カード

Section titled “練習 1: プロジェクト状態カード”

機能名、担当者、完了タスク数、総タスク数を受け取り、フォーマットされたプロジェクト状態カードを生成するプログラムを書いてみましょう。

feature = input("機能名: ")
owner = input("担当者: ")
completed_tasks = int(input("完了タスク数: "))
total_tasks = int(input("総タスク数: "))
progress = completed_tasks / total_tasks
# 下にプロジェクト状態カードを作成する
print("=" * 34)
print(f"機能: {feature}")
print(f"担当者: {owner}")
print(f"進捗: {progress:.1%}")
print(f"残りタスク: {total_tasks - completed_tasks}")
print("=" * 34)

練習 2: プロジェクト見積もり表

Section titled “練習 2: プロジェクト見積もり表”
# タスク情報を入力する
task1 = "API エンドポイント"
hours1 = 5.0
rate1 = 40
task2 = "UI 仕上げ"
hours2 = 3.5
rate2 = 40
# プロジェクト見積もり表を出力する。要件:
# 1. タスク名は左寄せ、数字は右寄せ
# 2. 各タスクのコストを表示する
# 3. 最後に合計を表示する
# ヒント: f-string の配置機能を使う
subtotal1 = hours1 * rate1
subtotal2 = hours2 * rate2
total = subtotal1 + subtotal2
print("=" * 46)
print(f"{'タスク':<18}{'時間':>8}{'単価':>6}{'コスト':>12}")
print("-" * 46)
print(f"{task1:<18}{hours1:>8.1f}{rate1:>6}{subtotal1:>12.2f}")
print(f"{task2:<18}{hours2:>8.1f}{rate2:>6}{subtotal2:>12.2f}")
print("-" * 46)
print(f"{'合計':<32}{total:>14.2f}")

ユーザーにミリ秒のレイテンシを入力してもらい、対応する秒数と分数を出力するプログラムを書きましょう。

latency_ms = float(input("レイテンシ(ms)を入力してください: "))
# 1000 ミリ秒 = 1 秒
# 60 秒 = 1 分
seconds = latency_ms / 1000
minutes = seconds / 60
print(f"{latency_ms:.2f} ms = {seconds:.2f} 秒")
print(f"{latency_ms:.2f} ms = {minutes:.2f} 分")
参考実装と解説
  1. input() は文字列を返します。完了/総タスク数は int()、レイテンシは float() に変換してから計算します。
  2. 状態カードの出力には上下の区切り線を入れ、内容はユーザーが入力した値を反映させます。
  3. 見積もり表は列をそろえ、与えられたデータでコスト 200.00140.00、合計 340.00 を表示します。
  4. latency_ms = 2500 のとき、秒数は 2.50、分数は約 0.04 です。
  5. 変換に失敗したら、空入力、数字以外の入力、全角数字、数値欄に単位まで入れていないかを確認します。

関数/文法用途重要ポイント
print()情報を出力するsep で区切り文字、end で末尾を変更できる
input()ユーザー入力を受け取る戻り値は必ず文字列
f"..."文字列を整形する{変数:書式} で表示方法を調整できる
int() / float()型変換input() の後に変換が必要になることが多い