所以我正在做 SPOJ 的练习,它是一个简单的计算器。每次我尝试提交答案时都会收到 NZEC 错误,我想知道是不是因为它应该被定义为 int32。 这是我的代码:
import sys
n = input()
n = int(n)
i = 0
while n > i:
znak, num1, num2 = input().split()
num1 = int(num1)
num2 = int(num2)
if znak == "+":
b = num1 + num2
print(b)
elif znak == "-":
b = num1 - num2
print(b)
elif znak == "*":
b = num1 * num2
print(b)
elif znak == "/":
b = num1 / num2
print(b)
elif znak == "%":
b = num1 % num2
print(b)
i += 1
sys.exit(0)
我已经为这个 NZEC 错误尝试了一些“解决方案”,但没有任何效果。
最佳答案
如果结果应该是一个整数,你应该使用operator.floordiv
,即a//b
,而不是a/b
<支持>1:
from operator import add, sub, mul, floordiv, mod
op = {'+': add, '-': sub, '*': mul, '/': floordiv, '%': mod}
for i in range(int(input())):
znak, *nums = input().split()
print(op[znak](*map(int, nums)))
顺便说一下,上面的代码完全与您的代码相同,但大约缩短了两倍!
如何?
- 为什么要检查
znak
是否等于带有大量if/else
语句的东西,如果你可以把所有的数学运算符放在一个字典中op
,并使用op[znak]
? 获取您需要的运算符
- 您使用的是 Python 3,因此您可以使用漂亮的
a, *b = iterable
语法将iterable
的第一项提取到a
并将其他项目放入列表b
,看起来 super 漂亮 - 每个
op[znak]
都是一个接受两个参数的函数,因此您可以使用map(int, nums)
将nums
转换为整数然后将它们作为带有星号的单独参数传递:*map(int, nums)
- 最后但并非最不重要的一点,如果有 Pythonic 的方式来做到这一点,为什么要使用这种 C 风格的
while
循环索引递增 - 使用range(start, stop, [step])
? - 最后,您实际上并不需要变量
n
,因此您可以立即将其插入range
嘿,伙计,感觉需要一些疯狂吗?看看如何将所有这些压缩成两行:
from operator import*
sum(0for _ in map(print,((lambda znak,*nums:{'+':add,'-':sub,'*':mul,'/':floordiv,'%':mod}[znak](*map(int,nums)))(*input().split())for _ in range(int(input())))))
或者只有一行:
sum(0for _ in map(print,((lambda znak,*nums:{'+':lambda a,b:a+b,'-':lambda a,b:a-b,'*':lambda a,b:a*b,'/':lambda a,b:a//b,'%':lambda a,b:a%b}[znak](*map(int,nums)))(*input().split())for _ in range(int(input())))))
这些与第一个版本完全一样。现在,这只是为了好玩,展示 Python 的强大程度以及它的困惑程度。 不要在家里尝试这个:D
1 真除法与底除法:1/10 == 0.1
,但 1//10 == 0
。
关于python - 在 Python 中从 int 更改为 int32,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42996804/