2017-10-10 5 views
0

私はPythonの初心者です。私はPython計算機をコーディングしていますが、浮動小数点数は0.1 + 0.2 != 0.3なので、私は小数点モジュールを使用していたので迷惑です。浮動小数点数を入力から小数点に変換するスクリプトをコーディングしました。私は最初に入力文字列をフォーマットし、それをリストに分割しました。私はこのリスト(evalvarと呼ばれる)でスクリプトを実行しますが、evalvarを上書きするためにi(反復)の値を変更するたびに何も起こりません。 コード:forループ内の反復の値をPythonでどのように変更できますか?

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

を使用することができ、あなたがセッションで何を意味するか:あなたはすなわち、operand, operator, operandトリプレットにご入力を解析する方が良いオペランドからnumericalsを構築し、運用のためのoperatorモジュールを使用したいですか? –

+0

文字列は不変ですが、あなたはevalvarに反映される方法でiを変更することはできません。代わりにインデックスで置き換えることができます。ただし、文字列の作成は実際にはDecimalを作成するものではありません。 'eval'を計画しているなら、再考することを強くお勧めします。 – 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) 

これは言われて、文字列としてコードを構築し、evalまたはast.literal_evalに渡します(私はあなたの計画だと考えています)は確かに最善の解決策ではありません。

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)) 
関連する問題