经过三分钟的思考,高级版计算器被我升级了,变成了更快捷,更简单的超级版
依旧还是我们忠实的sympy库,非常好用。
这次因为一个一个输入数太麻烦了,我就改成 1+1 这种形式了(横版)。主要是应用string的检索,不懂得人可以去官网看看(3. An Informal Introduction to Python — Python 3.9.13 documentation)
主要就是通过对于输入的字符串进行某一段的索取,因为字符串是不允许删减的,所以只有这种办法。
list_s = ["+", "-", "*", "/", "!", "^", "%"]
function = input()
while(1):
if(function[f_search] in list_s):
sym = function[f_search]
break
else:
f_search += 1
先设置一个list,把所有的运算符放在里面,记住得是string类型的。这里我只放了一部分,并没有都做。然后用一个while循环,不断去找function的运算符的地方,如果找到了,就赋值给一个变量,如果不是运算符,就将f_search加一。这样可以从输入的string变量的第一个字符到最后一个字符去找运算符。
num1 = function[0:f_search]
因为我是对于运算符前面进行检索,所以第一个是0。0到f_search就可以确保第一个数不会包括运算符,避免之后出问题。这里我不用了if和else就是因为我输入的运算符是!(阶乘)的时候不会出错,具体原因接下来讲。
length = len(function)
gan = 1 + f_search
if(length != (f_search + 1)):
num2 = function[gan:length]
这里定义了一个gan变量,也是为了确保截取第二个数的时候不会包括运算符。这里还获取了一下function的长度,如果长度和运算符的一致的话就不进行第二个数的截取了,因为阶乘只要一个数。这里要记住+1,不然length和f_searc永远不会相等。
try:
result = float(num1) ** float(num2)
except OverflowError:
print("Result too big.")
result = None
用了一个非常简单的try + except组合,overflowerror就是数过大会报错的类型。这样就会避免报错了。
import sympy
result = 0.0
f_search = 0
x = 0
num1 = ""
num2 = ""
sym = ""
list_s = ["+", "-", "*", "/", "!", "^", "%"]
gan = 0
while(1):
function = input()
while(1):
if(function[f_search] in list_s):
sym = function[f_search]
break
else:
f_search += 1
length = len(function)
num1 = function[0:f_search]
gan = 1 + f_search
if(length != (f_search + 1)):
num2 = function[gan:length]
if(function[f_search] == list_s[0]):
result = float(num1) + float(num2)
elif(function[f_search] == list_s[1]):
result = float(num1) - float(num2)
elif(function[f_search] == list_s[2]):
try:
result = float(num1) * float(num2)
except OverflowError:
print("Result too big.")
result = None
elif(function[f_search] == list_s[3]):
result = float(num1) / float(num2)
elif(function[f_search] == list_s[4]):
result = sympy.factorial(float(num1))
elif(function[f_search] == list_s[5]):
try:
result = float(num1) ** float(num2)
except OverflowError:
print("Result too big.")
result = None
elif(function[f_search] == list_s[6]):
result = float(num1) % float(num2)
if(result != None):
print(result)
else:
pass
f_search = 0
result = 0
可以看出这种写的非常方便。
f_search 和result要最后归零,不然下次运算会出bug。