如何将字符串转换为浮点数(不添加行)

How to convert a string to float (without adding lines)

我正在尝试用尽可能少的行编写一个 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(),只是没找到。

编辑:*我正在尝试尽可能低地挑战,在这种情况下,我不在乎它是否凌乱。我也知道不要让你的代码太 'overlapping' 和混乱。

添加一行

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])

注意,最好有一个额外的行,而不是压缩所有内容

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
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)

不按要求添加额外的行。 但是话又说回来,您可能应该少担心 1 行额外的代码 :)

如果你想要简短,那么下面就是简短的(尽管你可以将第 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")

编辑:您的问题被误导了,您可以将整个代码减少到 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()]

不幸的是,我想不出一个简单的方法来允许没有前导数字的数字,因为它需要将普通 - 视为字符串。

适用于任意数量的小数和负数的衬垫

例如 - 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)

如果你不想要另一行并且你想修改你的代码,你可以试试这个:

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.