Python创建计算器

Python创建计算器,python,input,calculator,Python,Input,Calculator,我对python相当陌生 我被要求只使用字符串命令、int/string/float等之间的转换(如果需要)创建一个计算器,并且需要使用函数。也可以使用while和for循环 程序需要采用x/y或x/y/z形式的输入,其中x/y z是任何正数或负数。其中“/”也可以用加法、乘法和减法代替。操作数和运算符之间可以存在任意数量的空格。这是我到目前为止的想法 我会对+、-、/和*,有一个唯一的定义。我将为用户输入的内容创建一个函数。我会使用“.lstrip”和“.rstrip”来去除空白 现在我遇到的

我对python相当陌生

我被要求只使用字符串命令、int/string/float等之间的转换(如果需要)创建一个计算器,并且需要使用函数。也可以使用while和for循环

程序需要采用x/y或x/y/z形式的输入,其中x/y z是任何正数或负数。其中“/”也可以用加法、乘法和减法代替。操作数和运算符之间可以存在任意数量的空格。这是我到目前为止的想法

我会对+、-、/和*,有一个唯一的定义。我将为用户输入的内容创建一个函数。我会使用“.lstrip”和“.rstrip”来去除空白

现在我遇到的问题是创建输入函数。我对函数非常陌生,这基本上就是我所拥有的。我知道这不是很多工作,但我真的被困在如何正确地进入功能

def multiplication(x,a,y,b,z):
    if (a== "*"):
        return x*y
    if (b== "*"):
        return y*z

def division(x,a,y,b,z):
    if (a== "/"):
        return x/y
    if (b== "/"):
        return y/z

def addition(x,a,y,b,z):
    if (a== "+"):
        return x+y
    if (b== "+"):
        return y+z

def subtraction(x,a,y,b,z):
    if (a== "-"):
        return x-y
    if (b== "-"):
        return y-z

def (x,y,z):
    x=0
    y=0
    z=0

    zxc=int(input()):# this is where I get stuck and I don't know how to implement x,y,z into the input.
感谢所有的帮助。如果您不确定您提供的代码是否过于密集,无法满足我的需求,请在为我浪费时间之前询问,以生成我不可能使用的代码。我保证尽快答复


基本上,我正在试图找到一种方法来拆分输入的字符串,然后用它开始计算。

如果你只是做一个玩具计算器,
eval()
接受局部和全局变量,所以你可以使用这样的方法:

def calculate(x=0, y=0, z=0):
    expression = raw_input('Enter an expression: ')

    return eval(expression, None, locals())
下面是一个控制台会话示例:

>>> calculate()
Enter an expression: x + 5 - y
5
请注意,
eval()
不安全。如果你想做一些严肃的事情,你必须解析表达式

此外,由于表达式很简单,您可以在
eval
ing输入之前使用正则表达式验证输入:

def validate(expression):
    operator = r'\s*[+\-/*]\s*'

    return bool(re.match(r'^\s*(?:x{o}y|x{o}y{o}z)$'.format(o=operator), expression))
因为这看起来像家庭作业,我怀疑OP是否可以使用典型的方法来解决问题。我认为这是一个输入验证和字符串操作的练习;然后是程序流程和了解函数返回值

在这里,您需要做两件事:

  • 找出哪些是程序的有效输入
  • 不断提示用户,直到他或她输入对您的程序有效的输入
  • 对于#1,我们知道有效输入是数字(正整数或负整数),它们必须是表达式形式。这意味着,输入的最小长度为三(两个数字和一个数学符号),输入中的字符(字符串)无效

    这是我们获取用户输入的基本循环:

    expression = raw_input('Please enter the expression: ')
    expression_result = check_input(expression)
    
    while not expression_result:
        print 'You did not enter a valid expression'
        expression = raw_input('Please enter the expression: ')
        expression_result = check_input(expression)
    
    check\u input
    方法将根据我们的规则验证用户输入的内容是否准确:

    def check_input(input_string):
    
        # Check the basics
        if len(input_string) < 3:
            return False
    
        # Check if we are getting passed correct characters
        for character in input_string:
            if character not in '1234567890' or character not in '/*+-':
                return False
    
        # Things like /23 are not valid
        if input_string[0] in '/*+':
            return False
    
        return input_string
    
    您可以尝试使用所有运算符拆分字符串,然后检查结果。请注意,使用不存在的字符拆分字符串不会引发任何错误,但您只需将字符串返回:

    >>> s = '4+5'
    >>> s.split('/')
    ['4+5']
    
    因此,一种方法是-拆分运算符上的字符串,如果结果列表的长度大于2,那么您知道结果列表的第一个成员是运算符的左侧,而列表的第二个成员是位于右侧的任何成员

    这适用于正数,但也适用于负数:

    >>> s = '-4+3'
    >>> s.split('-')
    ['', '4+3']
    
    好消息是,我们不是第一个遇到这个问题的人。还有另一种计算公式的方法,称为(也称为前缀表示法)。以下是维基百科页面的算法:

    Scan the given prefix expression from right to left
    for each symbol
     {
      if operand then
        push onto stack
      if operator then
       {
        operand1=pop stack
        operand2=pop stack
        compute operand1 operator operand2
        push result onto stack
       }
     }
    return top of stack as result
    
    要获得波兰风格的正规表达式(称为中缀),请使用,这是我在计算机科学中最喜欢的基于训练的算法

    使用调车场将表达式转换为波兰语符号,然后使用伪代码求解方程。您可以使用列表作为“堆栈”


    请记住,所有输入都是字符串,因此在进行实际计算时,请确保将它们转换为整数。

    以下是使用正则表达式的可能解决方案大纲。检查左侧作为练习时出错。如果这不是家庭作业,你想看到具体的解决方案

    重新导入
    #输入是令牌列表(令牌是数字或运算符)
    令牌=原始输入()
    #删除空白
    令牌=re.sub('\s+','',令牌)
    #按加法/减法运算符拆分
    令牌=重新拆分(“(-\+)”,令牌)
    #接受一组数字,*s和/s。返回结果
    def solve_术语(令牌):
    令牌=重新拆分(“(/\*)”,令牌)
    ret=浮动(令牌[0])
    对于op,num in:
    # 
    回程网
    #将最终结果初始化为第一项的值
    结果=求解项(令牌[0])
    #通过加/减项计算最终结果
    对于op,num in:
    结果+=求解项(num)*(如果op='+'else-1,则为1)
    打印结果
    
    我有一个替代代码。用户可以输入诸如:8*6/4-3+3之类的内容,这仍然有效。如果输入字母(d、a、s),它也不会崩溃。非常紧凑

    代码(Python v3.3.0):


    我建议您使用argparse或regex来解析输入字符串。对于玩具计算器,您可以在将输入传递给eval之前验证输入,从而加倍乐趣。这样,您就可以在不处理所有数学运算的情况下进行输入验证。@Cam:您将如何验证它?正则表达式,或者(如果OP不允许使用正则表达式)检查所有输入字符是否为数学运算或数字如果我可以使用eval,我就不在这里了。。。不幸的是,我做不到。@Cam:除了基本表达式之外,这对其他任何东西都不起作用。你完全正确,这是家庭作业。我遇到的问题是实际拆分输入。我尝试了string.partition和string.strip以及string.split,但均无效。你能帮助我吗。这个想法是以这样一种方式来实现输入函数,即可以实现上述分割字符串的想法,但事实证明这对我来说非常困难。
    Scan the given prefix expression from right to left
    for each symbol
     {
      if operand then
        push onto stack
      if operator then
       {
        operand1=pop stack
        operand2=pop stack
        compute operand1 operator operand2
        push result onto stack
       }
     }
    return top of stack as result
    
    import re
    
    # input is a list of tokens (token is a number or operator)
    tokens = raw_input()
    
    # remove whitespace
    tokens = re.sub('\s+', '', tokens)
    
    # split by addition/subtraction operators
    tokens = re.split('(-|\+)', tokens)
    
    # takes in a string of numbers, *s, and /s. returns the result
    def solve_term(tokens):
        tokens = re.split('(/|\*)', tokens)
        ret = float(tokens[0])
        for op, num in <FILL THIS IN>:
            # <apply the operation 'op' to the number 'num'>
        return ret
    
    # initialize final result to the first term's value
    result = solve_term(tokens[0])
    
    # calculate the final result by adding/subtracting terms
    for op, num in <FILL THIS IN>:
        result +=  solve_term(num) * (1 if op == '+' else -1)
    
    print result
    
    valid_chars = "0123456789-+/* \n";
    while True:
        x = "x="
        y = input(" >> ")
        x += y
        if False in [c in valid_chars for c in y]:
            print("WARNING: Invalid Equation");
            continue;
        if(y == "end"):
            break
        exec(x)
        print(x)