2017-10-10 298 views
0

我是python新手。我一直在编码一个python计算器,但浮动令人讨厌,因为0.1 + 0.2 != 0.3所以我一直在使用十进制模块。我编写了一个脚本来将输入中的浮点数转换为小数点。我首先格式化了输入字符串,然后将它分割成一个列表。我在这个列表上运行我的脚本(for循环)(称为evalvar),但是每当我改变i(迭代)的值来覆盖evalvar时,什么都不会发生。 代码:如何在python中更改for循环中的迭代值?

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))并在evalvar[i]我的for循环取代所有i

+0

您可以使用会话 –

+1

对不起,你这是什么意思会议? –

+0

字符串是不可变的,你*不能*以反映在evalvar中的方式改变我。你可以用索引代替它。但请注意,创建字符串实际上并不是创建一个Decimal;如果你打算再评估一下,我强烈建议你重新考虑一下。 – jonrsharpe

回答

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三联,由运算建立numericals和使用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))