我是python的新手。我一直在编写一个python计算器,但浮点数很烦人,因为0.1 + 0.2 != 0.3
所以我一直在使用十进制模块。我编写了一个脚本来将浮点数从输入转换为小数。我首先格式化输入字符串,然后将其拆分为一个列表。我在这个列表(称为evalvar)上运行我的脚本(for循环),但每当我更改i(迭代)的值以覆盖evalvar时,都没有任何反应。
代码:
evalvar = ["0.1", "+0.2"]
for i in evalvar:
try:
#i is now equal to "0.1"
i = str("""Decimal('""" + i + """')""")
#i is now equal to """Decimal('0.1')"""
except SyntaxError:
print(evalvar)
我自己已经找到了答案。
我没有使用for i in evalvar
,而是使用了for i in range(len(evalvar))
,并使用i
替换了for循环中的所有evalvar[i]
。
答案 0 :(得分:0)
重新绑定迭代变量(i
)当然不会修改您的evalvar
列表,因为字符串是不可变的,所以您也无法更新它。这里的解决方案要么建立一个新的列表:
# use string formatting instead of concatenation (more readable)
# and use a list expression (idiomatic and more efficient)
evalvar = ["Decimal('{}')".format(value) for value in evalvar]
或使用索引更新列表:
# `enumerate(sequence)` yields an `index, value` tuple
# for each item in `sequence`
for index, value in enumerate(evalvar):
evalvar[index] = "Decimal('{}')".format(value)
这就是说,将代码构建为字符串并将其传递给eval
或ast.literal_eval
(我假设是您的计划)当然不是最佳解决方案。您最好将输入解析为operand, operator, operand
三元组,从操作数构建数字并使用operator
模块进行操作,即:
import operator
operations = {
"+": operator.add,
"-": operator.sub,
"*": operator.mul,
"/": operator.truediv
}
def parse_exp(inp):
parsed = [item.strip() for item in inp.split(" ")]
operator = parsed.pop(1)
operands = [Decimal(item) for item in parsed]
return operator, operands
def eval_exp(inp):
operator, operands = parse_exp(inp)
return operations[operator](*operands)
def main():
inp = "0.1 + 0.2"
print(eval_exp(inp))