/ / Python-Как да конвертирате аргумент функция в числов оператор / float () / int ()? - Python, функция, математика, python-3.x, аргументи

Python-Как да конвертирате функцията аргумент в цифров оператор / float () / int ()? - python, функция, математика, python-3.x, аргументи

Това, което се опитах да направя,

Създайте приложение за калкулатор. Напишете код, който ще отнеме два числа и оператор във формат: 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). В противен случай интерпретаторът връща a SyntaxError изскачащи. Опитах се да се променя if op == "+": в if op == +:, но след това интерпретаторът връща SyntaxError, маркирайки : След +.

  2. точно сега функцията превръща всички видове въвеждане на числа в float(), дори ако за въвеждане е взето цяло число. Как да се оставя на самата функция да определи дали входът е цяло число или с плаваща запетая, и да го конвертирате съответно?

Прочетох Документацията за функциите, но тяговори само за няколко вида аргументи и никой от тях не помага да се решат текущите проблеми. Сигурен съм, че това са доста основни неща, но като начинаещ се опитах и ​​не успях да го разбера.

Отговори:

1 за отговор № 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:UsersmetoloneDesktopx.py", line 15, in calculator
raise ValueError("invalid operator")
ValueError: invalid operator

Също така, въз основа на @Ashwini отговор, всъщност можете просто да прехвърлите името на оператора като оп вместо на символа:

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 за отговор № 2

Не можете да използвате +,*и т.н. в кода си, тъй като те не са валидни идентификатори, но можете да използвате 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"

0 за отговор № 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"