Python | input()

Python
スポンサーリンク

ここでは「eval() を使った式入力式電卓」を、初心者にもわかるように安全に・便利に作っていきます。


式入力式電卓とは?

ユーザーが

2+3*4

のように数式そのものを入力すると、
Python がそのまま計算して結果を表示する電卓です。


基本版:シンプル eval 電卓

# --- シンプル eval 電卓 ---
print("=== 式入力式 電卓 ===")
print("例: 2+3*4, (10-3)/2 など")
print("終了するには quit と入力")

while True:
    expr = input("\n式を入力してください: ").strip()
    if expr.lower() in ["quit", "exit"]:
        print("🧾 終了します。ありがとうございました!")
        break
    try:
        result = eval(expr)
        print("結果 =", result)
    except Exception as e:
        print("⚠ エラー:", e)
Python

実行例

=== 式入力式 電卓 ===
例: 2+3*4, (10-3)/2 など
終了するには quit と入力

式を入力してください: 2+3*4
結果 = 14

式を入力してください: (10-3)/2
結果 = 3.5

式を入力してください: quit
🧾 終了します。ありがとうございました!

⚠️ 注意:eval() の危険性

eval()Python の式をそのまま実行する関数
便利ですが、次のような式を入力されると、悪意あるコードが実行されてしまいます。

__import__('os').system('rm -rf /')   # 💀 非常に危険!
Python

初心者の学習・個人環境での遊び目的ならOKですが、
実際のアプリで eval を直接使うのはNG!


🔒 安全な版(safe_eval 風)

危険な関数や変数を無効化して、安全な eval に近づけます。
ここでは四則演算・数学関数(math モジュール)だけを許可します。

import math

# --- 安全な eval 電卓 ---
print("=== 安全式電卓 ===")
print("例: 2+3*4, math.sqrt(9), sin(0.5)")
print("利用可能: math の関数 (sin, cos, sqrt, pow など)")
print("終了するには quit")

# 許可する名前を制限
allowed_names = {k: v for k, v in math.__dict__.items() if not k.startswith("__")}

while True:
    expr = input("\n式を入力してください: ").strip()
    if expr.lower() in ["quit", "exit"]:
        print("🧾 終了します。")
        break

    try:
        # 制限付き eval
        result = eval(expr, {"__builtins__": None}, allowed_names)
        print("結果 =", result)
    except Exception as e:
        print("⚠ エラー:", e)
Python

実行例

=== 安全式電卓 ===
例: 2+3*4, math.sqrt(9), sin(0.5)
利用可能: math の関数 (sin, cos, sqrt, pow など)
終了するには quit

式を入力してください: 2+3*4
結果 = 14

式を入力してください: sqrt(16)
結果 = 4.0

式を入力してください: pow(2, 10)
結果 = 1024.0

💡 解説ポイント

部分説明
eval(expr)文字列 expr を Python の式として評価
try/except入力エラーを防止
{"__builtins__": None}危険な関数 (open, os, など) を使えなくする
allowed_namesmath モジュールの関数だけを許可
quit / exit文字列で終了指示を処理

発展アイデア

アイデア内容
🧾 履歴を記録入力式と結果をリストまたはファイルに保存する
🧮 定数サポートπ や e を自動で math.pi / math.e に展開
🎨 GUI 電卓tkinterPyQt で見た目つきの電卓に
💬 「前回の結果」再利用ans 変数で前の結果を保持する(ans + 5など)

前回の結果を使えるようにしたバージョン

import math

print("=== 式電卓 (ans対応) ===")
print("例: 2+3*4, sqrt(9), ans*2")
print("終了: quit")

allowed = {k: v for k, v in math.__dict__.items() if not k.startswith("__")}
ans = 0

while True:
    expr = input("\n式を入力してください: ").strip()
    if expr.lower() in ["quit", "exit"]:
        break

    try:
        allowed["ans"] = ans
        result = eval(expr, {"__builtins__": None}, allowed)
        ans = result
        print("結果 =", result)
    except Exception as e:
        print("⚠ エラー:", e)
Python

💬 実行例:

式を入力してください: 10+5
結果 = 15
式を入力してください: ans*2
結果 = 30

これで完成!
この「eval 電卓」は、

  • input() の基本
  • 文字列処理(strip
  • 例外処理
  • 変数の再利用
    がぜんぶ練習できる、とても良い教材になります。
Python
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました