【问题标题】:Python-How to convert function argument into numeric operator/float()/int()?Python-如何将函数参数转换为数字运算符/float()/int()?
【发布时间】:2013-06-08 01:57:58
【问题描述】:

我想做什么:

创建一个计算器应用程序。编写需要两个数字的代码 和格式为: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(),即使将整数作为输入。如何让函数本身判断输入是整数还是浮点数,并进行相应的转换?

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

【问题讨论】:

  • 您希望如何调用calculatorcalculator(1, +, 2)?你不能那样做。编写一个解析器并传入一个字符串:calculator('1 + 2').
  • 修复 2. 根本不要在 n1n2 上调用 float...
  • @Blender 谢谢!抱歉,我不明白什么是解析器或如何编写解析器? “解析器读取 Python 程序。解析器的输入是词法分析器生成的标记流。本章描述词法分析器如何将文件分解为标记”这是我能够找到的,但我不要以为我明白。你愿意详细说明一下吗?非常感谢!初学者:-(
  • @hakuna121:不是 Python 解析器,而是一般的解析器。
  • @Blender : 不仅是 Python 初学者,而且是一般的初学者(编程) :P 好的,那我去看看如何编写解析器。非常感谢!

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


【解决方案1】:

您不能在代码中使用 +* 等,因为它们不是有效的标识符,但您可以在此处使用 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'

【讨论】:

  • 使用operator 模块和字典非常棒。谢谢!在您的解决方案中,有没有办法在调用函数时避免使用双引号(“”)?
  • @hakuna121 不,你必须在这些运算符周围使用引号(因为它们在 python 中不是有效的变量名)否则 python 会引发一些错误。
【解决方案2】:

引用运算符是传递符号的唯一方法。语言是正常的。 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

【讨论】:

    【解决方案3】:

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

    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'
    

    【讨论】:

      猜你喜欢
      • 2019-02-04
      • 1970-01-01
      • 1970-01-01
      • 2019-12-04
      • 2023-03-12
      • 2013-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多