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

2024-05-03 10:10:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python还不熟悉。我一直在编写一个python计算器,但是float很烦人,因为0.1 + 0.2 != 0.3所以我一直在使用decimal模块。我编写了一个脚本,将浮点值从输入转换为十进制数。我首先格式化了输入字符串,然后将其拆分为一个列表。我在这个列表(称为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)),并用evalvar[i]替换了for循环中的所有i。你知道吗


Tags: 模块toin脚本列表forisequal
1条回答
网友
1楼 · 发布于 2024-05-03 10:10:27

重新绑定迭代变量(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三元组,从操作数生成numerical,并使用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))

相关问题 更多 >