2017-02-28 6 views
2

私は基本的な数学演算を実行する必要があるPythonでゲームを作成しています。これらの操作は、ユーザによって入力として提供される。これはどうすればいいですか?Pythonの入力から数学を実行するには

これまでのところ、私は各数値と各演算子に独立変数を持っていますが、コードを実行すると、演算子としては演算子('+','-','*','/')が認識されず、文字列として認識されます。したがって、プログラミングを実行すると、1'+'1として実行されます。

print("Now you can solve it. ") 
vinput1=int(input("Please input the first number")) 
print("First number is recorded as", vinput1) 

vop1=input("Please input your first operator") 
print("Your operator is recorded as", vop1) 

vinput2=int(input("Please input the second number")) 
print("Second number is recorded as", vinput2) 

vsofar = (vinput1, vop1, vinput2) 
print(vsofar) 

コンピュータの出力:

(1, '+', 1) 
+0

セキュリティリスク – abccd

+1

重複可能性があるので一般的には受け入れられませんが、 'eval()'関数を使用することができますhttp://stackoverflow.com/questions/9685946/math-operations-from-string – abccd

答えて

0

最も簡単で安全な方法は、ifステートメントを使用して、どのシンボルが入力されたかを確認することです。サンプルif文は次のようになります。

print("Now you can solve it. ") 
vinput1=int(input("Please input the first number")) 
print("First number is recorded as", vinput1) 
vop1=input("Please input your first operator") 
print("Your operator is recorded as", vop1) 
vinput2=int(input("Please input the second number")) 
print("Second number is recorded as", vinput2) 

if (vop1 == "-"): 
    vsofar = vinput1 - vinput2 
    print(vsofar) 
elif (vop1 == "+"): 
    vsofar = vinput1 + vinput2 
    print(vsofar) 
elif (vop1 == "/"): 
    vsofar = vinput1/vinput2 
    print(vsofar) 
elif (vop1 == "*"): 
    vsofar = vinput1 * vinput2 
    print(vsofar) 
else 
    print("Invalid operator entered.") 

はちょうどすぐに説明し、これらのif文では一致して、VOP1に格納され、オペレータが入力したかどうかを確認 - 、+、*、または/演算子を。一致する場合は、それぞれの操作が実行され、変数vsofarに格納されます。この変数は、その操作後の行に出力されます。操作のいずれも機能しない場合、無効なステートメントが印刷されます。

これは、最もやさしく、シンプルで、やや長い方法です。ただし、eval()関数は安全に使用できません。私のやり方よりも短くて複雑なのは、ポール・ルーニーの答えです。

希望すると便利です。

0

あなたが評価することができます!

>>> input1=1 
>>> input2=3 
>>> vop1="+" 
>>> print eval(str(input1)+vop1+str(input2)) 
4 

は、このことができますthis

希望を見てください!

+0

これは誤りですコード。それを実行してみてください。 –

+0

私はちょうどしました!eval http://stackoverflow.com/a/1832957/6622817 – abccd

+0

そのうまくいっている。私は私の端末から貼り付けたコピー! –

0

eval()を使用したくない場合は、一連の条件を試して、演算子をテストし、それに基づいて正しい計算を実行してください。

if vop1 == "+": 
    return vinput1 + vinput2 
if vop1 == "-": 
    return vinput1 - vinput2 
0

evalは非常に一般的な文脈で動作し、セキュリティ上の問題ast.literal_evalを導入するためのそんなに範囲は文字列リテラルのみを評価することを意図しており、これまでに狭いので、より安全な範囲を持っていますが。

from ast import literal_eval 

print("Now you can solve it. ") 
vinput1=int(input("Please input the first number")) 
print("First number is recorded as", vinput1) 

vop1=input("Please input your first operator") 
print("Your operator is recorded as", vop1) 

vinput2=int(input("Please input the second number")) 
print("Second number is recorded as", vinput2) 

vsofar = (vinput1, vop1, vinput2) 

print(literal_eval(''.join(map(str, vsofar)))) 

それ以外の場合は、演算子から関数へのマッピングを作成して、各演算子を呼び出す関数を検索します。

import operator 
import sys 

ops = {'+': operator.add, 
     '-': operator.sub} 

v1 = int(input('enter first num')) 

op1 = input('input operator') 

if not op1 in ops: 
    print('unsupported operation') 
    sys.exit(1) 

v2 = int(input('enter second num')) 

print(ops[op1](v1, v2)) 

これについての素晴らしい点は、新しい(バイナリ)操作を追加するためにプログラムロジックを悩ます必要がないことです。長いif/elifチェーンでタイプミスをするチャンスがずっと少ないだけで、それらをdictに追加するだけです。

関連する問題