如何将字符串转换为浮点数(不添加行)
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.
我正在尝试用尽可能少的行编写一个 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.