如何将字符串转换为float(不添加行)

时间:2015-03-16 16:47:45

标签: python string int calculator

我试图用尽可能少的线程编写一个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(),我还没有设法找到它。

编辑:*我试图尽可能低地挑战它,在这种情况下,我不在乎它是否凌乱。另外,我知道不要让你的代码过于重复而且重叠。而且令人困惑。

7 个答案:

答案 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。