在一行中获取Python中的多变量

在一行中获取Python中的多变量,python,python-3.x,input,Python,Python 3.x,Input,我用Python制作了计算器,我对它很满意(考虑到这是我的第一个Python程序)。我唯一想改进的是输入系统。 这是我目前获取变量的方法,但我必须输入每个变量,每个变量之间有一个空格,如:2+3*4。我希望能够做到的是在没有空格的情况下进入它们,就像这样:2+3*4 在C++中你可以做: std::cin >> num1 >> act1 >> num2 >> act2 >> num3; 我的问题是,是否有一种方法可以在Python中做

我用Python制作了计算器,我对它很满意(考虑到这是我的第一个Python程序)。我唯一想改进的是输入系统。 这是我目前获取变量的方法,但我必须输入每个变量,每个变量之间有一个空格,如:2+3*4。我希望能够做到的是在没有空格的情况下进入它们,就像这样:2+3*4

在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

您可以查看正则表达式
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.
重新导入
用户输入=输入(…)
模式='(?P\d+)\s?(?P.)\s?(?P\d+)\s?(?P.)\s?(?P\d+)
res=重新搜索(模式、用户输入)
您的第一个号码=res.group('num1')
您的第一个行动=res.group(“act1”)
#等等。
  • 每个数字(具有1个或多个数字)由
    (?P\d+
    表示,这是一个名为
    num1
    re
  • 操作符以类似的方式表示,其中
    是任何单个字符,或者在本例中是操作符
  • 每个数字和运算符之间可能有0或1个空格,由
    \s?
    表示
  • 我重复这个模式

re
使它更复杂一些,但在用户输入信息的方式上更灵活。

您可以这样做:

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
将数字分配给变量,并根据列表中的索引分配运算符变量。此方法还允许您使用多位数的数字。

最简单的方法是使用
eval
,因为这可以为您计算表达式

然而,
eval
对于不受信任的输入可能是危险的,因为默认情况下它会公开整个Python解释器。这对于您自己使用的程序来说不是问题,但对于web应用程序中使用的模块来说可能会有问题

在下面的示例中(中),我尝试通过使用
locals
globals
选项来降低危险性。
\u locals
dict用于使
数学
模块中的某些函数可用于表达式中。
\u globals
dict禁用Python的内置功能。还请注意,这是在Python3中,它对
/
运算符使用浮点除法

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)是由浮点算术精度的限制造成的。

您可以读取字符串,然后自己解析它-除非您总是有非常有限的输入-这不利于非常灵活的计算器:)您必须逐个字符检查并识别数字以创建数字,并识别其他字符以获取
+*
。或者用于构建真正的解析器。当我执行它给我的错误时:AttributeError:“NoneType”对象没有属性“group”@Sela12-oops,我有一个错位的
,但是我如何获得输入?@Sela12使用内置函数
input