2017-10-10 3 views
0

Ich bin neu in Python. Ich habe einen Python-Rechner programmiert, aber Floats sind ärgerlich, weil 0.1 + 0.2 != 0.3 ich so das Dezimal-Modul verwendet habe. Ich habe ein Skript programmiert, um die Floats von der Eingabe in eine Dezimalzahl zu konvertieren. Ich habe zuerst die Eingabe-Zeichenfolge formatiert und dann in eine Liste aufgeteilt. Ich führe mein Skript (for-Schleife) auf dieser Liste (mit dem Namen evalvar), aber immer wenn ich den Wert von i (Iteration) ändere, um evalvar zu überschreiben, passiert nichts. Code:Wie kann ich den Wert einer Iteration innerhalb einer for-Schleife in Python ändern?

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) 

Ich habe mich die Antwort ausgearbeitet. Anstatt for i in evalvar zu verwenden, habe ich for i in range(len(evalvar)) verwendet und alle i 's in meiner for-Schleife mit evalvar[i] ersetzt.

+0

Sie Session –

+1

Leider verwenden können, was meinst du Sitzung? –

+0

Strings sind unveränderlich, Sie * können * ich nicht in einer Weise ändern, die sich in Evalvar widerspiegelt. Sie könnten es stattdessen durch den Index ersetzen. Beachten Sie jedoch, dass beim Erstellen der Zeichenfolge kein Dezimalwert erstellt wird. Wenn Sie planen, dann "eval", dass ich Ihnen dringend empfehlen würde, überdenken. – jonrsharpe

Antwort

0

Das erneute Binden der Iterationsvariablen (i) ändert natürlich nicht Ihre evalvar Liste, und da Strings unveränderlich sind, können Sie sie auch nicht aktualisieren. Die Lösungen sind hier entweder eine neue Liste zu erstellen:

# 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] 

oder die Liste an Ort und Stelle unter Verwendung von Indizes zu aktualisieren:

# `enumerate(sequence)` yields an `index, value` tuple 
# for each item in `sequence` 
for index, value in enumerate(evalvar): 
    evalvar[index] = "Decimal('{}')".format(value) 

Nachdem dies gesagt ist, Bauordnung als Strings und weitergeben zu eval oder ast.literal_eval (was ich vermute, ist Ihr Plan) ist sicherlich nicht die beste Lösung. Sie würden besser Ihre Eingabe in ein operand, operator, operand Triplett Parsen Numericals aus dem Operanden bauen und das operator Modul für Operationen verwenden, dh:

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)) 
Verwandte Themen