2016-12-17 50 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
  • 運算符以類似的方式表示,其中.是任何單個字符,或者在此情況下爲運算符。
  • 每個數字和運算符之間可能有0或1個空格,表示爲\s?
  • 我重複這種模式。

re使它稍微複雜一點,但用戶如何輸入他的輸入更靈活。

+0

當我做它給我的錯誤:AttributeError:'NoneType'對象沒有屬性'組' – 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字典用於使math模塊中的某些功能可用於表達式。 _globals字典禁用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'。 –