如何在python中更改for循环中的迭代值?

时间:2017-10-10 07:08:27

标签: python loops for-loop calculator

我是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]

1 个答案:

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

这就是说,将代码构建为字符串并将其传递给evalast.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))