2016-12-17 8 views
1

this私はPythonを使って計算機を作っています。私はそれが私の最初のPythonプログラムだと考えて満足しています。私が改善したいのは入力システムだけです。 これは私の現在の変数の取得方法ですが、次のように各変数にスペースを入れて入力する必要があります。2 + 3 * 4.空きスペースなしで入力することができますこれは2 + 3 * 4です。Pythonの多変数を一行で取得する

C++では、あなたが行うことができます。

std::cin >> num1 >> act1 >> num2 >> act2 >> num3; 

私の質問は、Pythonで同じことを行う方法がある場合はありますか?

これは私が変数を取得するには、今使っているコードです:

user_input=input("Enter a num1 act1 num2 act2 num3 (with a space between them): ")  #Gets the values 
var1, action1, var2, action2, var3=user_input.split()   #assigns the values into the variables 
+1

非常に柔軟な電卓のための入力が常に制限されていない限り、文字列を読み込んでそれを解析することができます。 – Levon

+0

char-by-charをチェックして数字を認識する必要があります数字を作成し、他の文字を認識して '+ *'を得る。または、実際のパーサーを構築するには、[PLY - Python Lex-Yacc](http://www.dabeaz.com/ply/)を使用してください。 – furas

答えて

0

あなたはユーザー入力を解析するために、正規表現にreモジュールを見ることができる:

import re 

user_input = input(...) 

pattern = '(?P<num1>\d+)\s?(?P<act1>.)\s?(?P<num2>\d+)\s?(?P<act2>.)\s?(?P<num3>\d+)' 
res = re.search(pattern, user_input) 

your_first_number = res.group('num1') 
your_first_action = res.group('act1') 
# etc. 
  • 各数字(1桁以上)は(?P<num1>\d+)で表され、reグループIはnum1となります。
  • オペレータは、同様の方法で表されます。.は、任意の1文字です。この場合、演算子です。
  • 各番号とオペレータの間に0または1のスペースがあり、これは\s?で表されます。
  • そしてこのパターンを繰り返します。

reは少し複雑ですが、ユーザーが入力内容を入力する方法がより柔軟です。

+0

私はそれが私にエラーを与えてくれます:AttributeError: 'NoneType'オブジェクトに 'group'属性がありません – Sela12

+0

@ Sela12 - 私の最初のグループには誤った '<'がありました。それはあなたにもうエラーを与えません。 – moogle

1

あなたはこのような何か行うことができます:

user_input = '2+12*9' 

numbers = ''.join([x if x.isnumeric() else ' ' for x in user_input]) 
operators = [x for x in user_input if not x.isnumeric()] 

var1, var2, var3 = numbers.rsplit(' ') 
action1, action2 = operators[0], operators[1] 

は、基本的には、その後の数字と演算子を分離するために、リストの内包表記を使用して、その変数に番号を割り当てることrsplitを使用して、そのことにより、オペレータ変数を割り当てることをリスト内のインデックスこの方法では、複数の桁の数字を使用することもできます。

0

最も簡単な方法は、evalを使用することです。これは式を計算できるためです。

しかし、evalは、デフォルトではPythonインタプリタ全体を公開するので、信頼できない入力では危険です。これは自分で使っているプログラムにとっては問題ではありませんが、Webアプリケーションで使用されるモジュールでは問題になる可能性があります。

以下の例では(IPython)、localsglobalsのオプションを使用することで危険性を減らしています。 _locals dictは、mathモジュールのいくつかの関数を式で使用できるようにするために使用されます。 _globals dictは、Pythonの組み込み関数を無効にします。これは、/演算子の浮動小数点除算を使用するPython 3であることにも注意してください。

In [1]: import math 

In [2]: _globals = {"__builtins__": None} 

In [3]: _lnames = ('acos', 'asin', 'atan', 'ceil', 'cos', 'cosh', 'e', 'log', 'log10', 
    ...:   'pi', 'sin', 'sinh', 'sqrt', 'tan', 'tanh') 

In [4]: _locals = {k: eval('math.'+k) for k in _lnames} 

In [5]: eval('2+3*4', _globals, _locals) 
Out[5]: 14 

In [6]: eval('1+2/3', _globals, _locals) 
Out[6]: 1.667 

In [7]: eval('sin(pi)', _globals, _locals) 
Out[7]: 1.225e-16 

In [8]: eval('cos(pi)', _globals, _locals) 
Out[8]: -1 

In [9]: eval('cos(pi/2)', _globals, _locals) 
Out[9]: 6.123e-17 

7と9の出力(0にする必要があります)は、浮動小数点演算の精度の限界に起因することに注意してください。

+0

しかし、どのように入力を得るのですか? – Sela12

+0

@ Sela12組み込み関数 'input'を使用します。 –

関連する問題