我试图用尽可能少的线程编写一个python计算器,到目前为止(理论上)已经将它降低到10.唯一的问题是我似乎无法弄清楚如何将两个字符串更改为浮点数,不添加更多行。
x = raw_input("Enter calc instructions. ")
a, b, c = x.split()
if b == "-":
print (a-c)
elif b == "+":
print (a+c)
elif b == "*":
print (a*c)
elif b == "/":
print (a/b)
我知道我必须在某个地方做 float(),我还没有设法找到它。
编辑:*我试图尽可能低地挑战它,在这种情况下,我不在乎它是否凌乱。另外,我知道不要让你的代码过于重复而且重叠。而且令人困惑。
答案 0 :(得分:4)
如果你想做空,那么下面的内容很短(尽管你可以将第2和第3行合并在一起)。但是,可读性不是。
from operator import add, sub, truediv, mul
ops = {"+": add, "-": sub, "/": truediv, "*": mul}
x, op, y = [float(string) if i % 2 == 0 else string for i, string in enumerate(raw_input("Enter calc instructions. ").split())]
print(ops[op](x, y))
所有这一切的教训是,虽然简洁性很好 - 更短的代码通常更快更容易阅读 - 如果代码过于复杂,则会失去简洁的观点。
对于虐待狂(以上作为一个班轮):
(lambda x, op, y, operator=__import__("operator"), opnames={"+": "add", "-": "sub", "/": "truediv", "*": "mul"}: getattr(operator, opnames[op])(x, y))(*[float(s) if i % 2 == 0 else s for i, s in enumerate(raw_input("Enter calc instructions. ").split())])
对于那些知道如何使用的人 ast.literal_eval
:
__import__("ast").literal_eval(raw_input("Enter calc instructions.\n"))
对于那些不介意他们的计算器存在安全漏洞的人......
input("Enter calc instructions.\n")
答案 1 :(得分:2)
添加一行
a,c = float(a),float(c)
或
a,c = map(float,(a,c))
前
if b == "-":
没有额外的行
print
语句更改为print (float(a)+float(c))
,依此类推或强>
split
语句更改为a,b,c = float(s.split()[0]),s.split()[1],float(s.split()[2])
注意,最好还有一个额外的行,而不是压缩所有内容
答案 2 :(得分:1)
x = raw_input("Enter calc instructions. ")
a, b, c = x.split(); a=float(a); c=float(c)
if b == "-":
print(a-c)
elif b == "+":
print(a+c)
elif b == "*":
print(a*c)
elif b == "/":
print(a/b)
根据要求,不添加额外的行。 但话说回来,你可能应该少担心另外一行代码:)
答案 3 :(得分:1)
编辑:您的问题被误导,您可以将整个代码缩减到2行。也许更少,你应该在code golf site上发布这个。
a, b, c = raw_input("Enter calc instructions. ").split()
print {'*': float.__mul__, '/': float.__div__, '+': float.__add__, '-': float.__sub__}[b](float(a), float(c))
<小时/> 原始答案:
如果数字与浮点模式匹配,那么这是一个浮点数,否则会保留字符串。
a, b, c = [float(y) if re.match('[+-]?[0-9]+\.?[0-9]*', y) else y for y in x.split()]
不幸的是,我无法想出一种简单的方法来允许没有前导数字的数字,因为它需要将普通的-
视为字符串。
答案 4 :(得分:0)
x = raw_input("Enter calc instructions. ")
a, b, c = x.split()
if b == "-":
print float(a)-float(c)
elif b == "+":
print float(a)+float(c)
elif b == "*":
print float(a)*float(c)
elif b == "/":
print float(a)/float(c) # replaced b to c
答案 5 :(得分:0)
一个适用于任意数量的十进制数和负数的衬垫
例如 - x = "2.7+72/2 * 100"
将输出[2.7, '+', 72.0, '/', '2 ', '*', 100.0]
但是,由于您的代码仅适用于3个值,因此您必须对其进行编辑才能使用它(如果您喜欢尝试,只需从行尾删除[:3]
)
x = raw_input("Enter calc instructions. ")
a, b, c = [float(i) if all(j.strip().isdigit() or j[1:].strip().isdigit() for j in i.split(".")) else i for i in "".join([x[i] if x[i] not in ["-","+","*","/"] else ("|{}|".format(x[i]) if (":"+x)[i-1] in ["-","+","*","/"] else x[i]) for i in range(len(x))]).split("|")][:3]
if b == "-":
print (a-c)
elif b == "+":
print (a+c)
elif b == "*":
print (a*c)
elif b == "/":
print (a/b)
答案 6 :(得分:0)
如果您不想要另一行,并且想要修改代码,可以试试这个:
x = input("Enter calc instructions. ")
a, b, c = x.split()
if b == "-":
print (float(a)-float(c))
elif b == "+":
print (float(a)+float(c))
elif b == "*":
print (float(a)*float(c))
elif b == "/":
print (float(a)/float(c))
它适用于Python 3.4。