2017-05-08 16 views
0

Ich nahm eine Funktion, um eine Liste von Zeichenfolgen bestehend aus Zahlen und mathematischen Ausdrücken, aber ich konnte nicht das erwartete Ergebnis erhalten. Zum Beispiel: 5 + 2-3 + 2 = 6Bewertung für mathematische Ausdruck falsch gegangen: Python

Grundsätzlich beginnt die Funktion mit der Initialisierung des Ergebnisses des Wertes der ersten numerischen Eingabe (Inp). Anschließend wendet es die Vorgänge von links nach rechts auf das aktuelle Ergebnis an usw., bis das Endergebnis erzielt wird. Unten ist das Skript.

Inp = ["5","+","2","-","3","+","2"] 

result = Inp [0] 
for i in range (1, len(Inp), 2): 
    op = Inp [i] 
    nextValue = Inp [i + 1] 
if op == '+': 
    result += nextValue 
elif op == '-': 
    result -= nextValue 
return result 

Antwort

2

Es gibt mehrere Probleme in Ihrem Code.

1) Sie nehmen das erste Element von Inp als result. Aber Inp[0] ist im Grunde eine Zeichenfolge. Also wandle es vor der Zuweisung in eine Ganzzahl um.

2) Die if und else sollten innerhalb der for Schleife sein. Einrückung ist nicht korrekt.

3) Das gleiche Problem wie 1 bei Anweisung innerhalb if und else

4) Es gibt keine Funktion (wie pro Ihre gegebenen Code). Keine Notwendigkeit, zurückzukehren. Wenn es in der Tat eine Funktion ist und das ist eine minimale Version, dann ist es in Ordnung.

Dann wird der richtige Code wird -

Inp = ["5","+","2","-","3","+","2"] 

result = int(Inp [0]) 
for i in range (1, len(Inp), 2): 
    op = Inp [i] 
    nextValue = Inp [i + 1] 
    if op == '+': 
     result += int(nextValue) 
    elif op == '-': 
     result -= int(nextValue) 

print result 

Auch innerhalb if und else Sie können überprüfen, ob nextValue in der Tat eine

Zahl ist

Es gibt andere Möglichkeiten, was Sie wollen zu tun. Ich habe nur auf die Fehler hingewiesen und den Code in einen funktionalen Code geändert.

1

Ich nehme an, ein einfacher Weg ist, den ersten Operanden aus dem Weg zu bekommen, dann durch die Liste durch zwei Schleifen. Vergessen Sie nicht, müssen Sie die Werte von Strings in Zahlen umwandeln, sonst 5 + 2 52 sein wird und nicht 7:

data = ["5","+","2","-","3","+","2"] 
result = int(data[0]) 

for op, n in zip(data[1:][::2], data[1:][1::2]): 
    if op == '+': 
    result += int(n) 
    if op == '-': 
    result -= int(n) 

print(result) 

Die Kernidee der for-Schleife ist. Es funktioniert durch Aufschneiden mit:

  • data[1:] ist dies Ihre erste Liste, minus das erste Element (die wir bereits verwendet)
  • [::2] bedeutet "jedes andere Element"
  • [1::2] „jedes andere Element bedeutet, aber überspringen die erste“

Wir zip() die beiden Listen ein Paar Operator und Operanden zu erhalten, wie folgt aus:

>>> for a in zip(data[1:][::2],data[1:][1::2]): 
... print(a) 
... 
('+', '2') 
('-', '3') 
('+', '2') 

Dies ist ein sicherer Weg, um die Liste zu durchlaufen, da wir uns keine Gedanken über das Ende der Liste machen müssen.

Der Rest der Logik ist der gleiche wie Ihr, außer dass Sie vergessen haben, die Werte in Ganzzahlen zu konvertieren.

0
Inp = ["5","+","2","-","3","+","2"] 
def f(Inp): 
result = int(Inp [0]) 
for i in range (1, len(Inp), 2): 
    op = Inp [i] 
    nextValue = int(Inp [i + 1]) 
    if op == '+': 
     result += nextValue 
    elif op == '-': 
     result -= nextValue 
return result 

print(f(Inp)) 
0

Ein paar Probleme mit diesem Code: zuerst haben Sie einige Probleme mit der Einrückung. Alles innerhalb der for-Schleife sollte um ein Leerzeichen eingerückt sein. Zweitens funktioniert die return-Anweisung nicht, es sei denn, Sie sind innerhalb einer Funktion. Es gibt hier keine Funktionsdefinition, also drucken Sie es am besten. Zuletzt verwendest du Zahlen in Anführungszeichen wie "5", die aus 5 eine Zeichenfolge machen, anstatt sie als Zahl zu behandeln. Hier ist eine Version von dieser, die funktioniert:

Inp = [5,"+",2,"-",3,"+",2] 

result = Inp [0] 
for i in range (1, len(Inp), 2): 
    op = Inp [i] 
    nextValue = Inp [i + 1] 
    if op == '+': 
     result += nextValue 
    elif op == '-': 
     result -= nextValue 

print(result) 
Verwandte Themen