2017-10-10 114 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))