1

我试图做的事情:

创建一个计算器应用程序。编写将采用以下格式的两个数字和一个运算符的代码:N1 OP N2,其中 N1 和 N2 是浮点或整数值,OP 是以下之一:+、-、、/、%、*,表示加法、减法、乘法、除法、模数/余数和取幂,并显示对输入操作数执行该操作的结果。

我能想到的:

def calculator(n1,op,n2):
    n1 = float(n1)
    n2 = float(n2)
    if op == "+":
        return (n1 + n2)
    elif op == "-":
        return (n1 - n2)
    elif op == "*":
        return (n1 * n2)
    elif op == "/":
        return (n1 / n2)
    elif op == "%":
        return (n1 % n2)
    elif op == "**":
        return (n1 ** n2)

有用。但可能有两个潜在的改进:

  1. 现在""输入运算符时必须使用双引号(),例如calculator(3,"+",3)。否则解释器返回一个SyntaxError弹出窗口。我试图更改if op == "+":if op == +:,但随后解释器返回一个 SyntaxError,突出:显示+.

  2. 现在该函数将各种数字输入转换为float(),即使将整数作为输入。如何让函数本身判断输入是整数还是浮点数,并进行相应的转换?

我阅读了有关函数的文档,但它只讨论了几种类型的参数,而且似乎都没有帮助解决当前的问题。我确信这是非常基本的东西,但作为一个初学者,我尝试过但无法弄清楚。

4

3 回答 3

3

您不能在代码中使用+,*等,因为它们不是有效的标识符,但您可以在operator此处使用模块和字典来减少代码:

from operator import mul,add,div,sub,pow,mod
dic = {'+':add, '-':sub, '*':mul, '**':pow, '%':mod, '/':div}
def calculator(n1,op,n2):
    n1 = n1
    n2 = n2
    try:
        return dic[op](n1,n2)
    except KeyError:
        return "Invalid Operator"

演示:

>>> calculator(3,"**",3)
27
>>> calculator(3,"*",3)
9
>>> calculator(3,"+",3)
6
>>> calculator(3,"/",3)
1
>>> calculator(3,"&",3)  # & is not defined in your dict
'Invalid Operator'
于 2013-06-08T02:21:32.160 回答
1

引用运算符是传递符号的唯一方法。语言是正常的。Python 也会计算出结果的正确类型,因此无需转换为浮点数。

这是您的程序,稍作修改。单引号对于 Python 来说更“正常”,不需要 () 围绕返回值,并且为错误输入抛出异常也是标准做法:

def calculator(n1,op,n2):
    if op == '+':
        return n1 + n2
    elif op == '-':
        return n1 - n2
    elif op == '*':
        return n1 * n2
    elif op == '/':
        return n1 / n2
    elif op == '%':
        return n1 % n2
    elif op == '**':
        return n1 ** n2
    else:
        raise ValueError('invalid operator')

输出:

>>> calculator(1,'+',2)     # note result is int
3
>>> calculator(1,'/',2)     # Python 3.x returns float result for division
0.5
>>> calculator(2,'*',2.5)   # float result when mixed.
5.0
>>> calculator(2,'x',2.5)
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "C:\Users\metolone\Desktop\x.py", line 15, in calculator
    raise ValueError('invalid operator')
ValueError: invalid operator

此外,在@Ashwini 答案的基础上,您实际上可以将运算符名称作为 op 而不是符号传递:

from operator import mul,add as plus,truediv as div,sub as minus,pow,mod

def calculator(n1,op,n2):
    return op(n1,n2)

输出:

>>> calculator(2,plus,4)
6
>>> calculator(2,div,4)
0.5
于 2013-06-08T02:39:29.757 回答
0

如果可能,这会将字符串转换为整数,否则如果无法进行转换,则会给出浮点数或抛出异常:

In [573]: def make_number(number_string):
   .....:     try:
   .....:         return int(number_string)
   .....:     except ValueError:
   .....:         return float(number_string)
   .....:     


In [574]: make_number('1')
Out[574]: 1

In [575]: make_number('1.0')
Out[575]: 1.0

In [576]: make_number('a')
ValueError: could not convert string to float: 'a'
于 2013-06-08T02:01:18.847 回答