Python-如何将函数参数转换为数字运算符/ float()/ int()?

时间:2013-06-08 01:57:59

标签: python function math python-3.x arguments

我试图做的事情:

  

创建一个计算器应用程序。编写将带两个数字的代码   以及格式为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. 现在,在输入运算符时必须使用双引号(""),例如,计算器(3,“+”,3)。否则,解释器会返回SyntaxError弹出窗口。我尝试将if op == "+":更改为if op == +:,但解释器返回一个SyntaxError,突出显示:之后的+

  2. 现在该函数将所有类型的数字输入转换为float(),即使整数被视为输入。如何让函数本身确定输入是整数还是浮点,并相应地转换它?

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

3 个答案:

答案 0 :(得分: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'

答案 1 :(得分:1)

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

这是您的程序稍作修改。 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

答案 2 :(得分: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'