2016-04-08 9 views
0

Ich versuche, ein Skript zu machen, die eine Mathegleichung fragt, dann hat der Benutzer in geben, was sie denken Antwort ist und dann ausgeben würde Python die AntwortAnzahl Eingabeerkennung in Python

jedoch aus irgendeinem Grund python mag raw_input() nicht in Korrelation mit der eval-Anweisung.

Zum Beispiel ist der Code:

print "What's 5+4" 
a = raw_input() 
print eval('5+4') 

Wenn ich eintippen war bis 10 in var 'a', ich diese Fehlermeldung erhalten würde.

Aber wenn ich Raw_input durch die Zahl "5" ersetzen würde, sieht das Skript so aus.

print "What's 5+4" 
a = 9 
print eval('5+4') 

Dann würde es 9 zurückgeben, also 5 + 4 = 9.

Gibt es sowieso, um dies zu beheben, so dass ich raw_input() verwenden kann, um den Benutzer zu fragen?

+2

Es ist im Allgemeinen keine gute Idee, 'eval' zu verwenden, und Ihr Programm kann (wahrscheinlich) so modifiziert werden, dass es tun kann, was Sie wollen, ohne' eval' zu verwenden. Aber ich bin ein wenig verwirrt: _Warum machst du 'eval ('a + 4')'? –

+1

Für Details zu den Gefahren von 'eval' siehe [Eval ist wirklich gefährlich] (http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html) von SO Veteran Ned Batchelder. –

+0

'eval' ist eine wirklich gefährliche Aussage in irgendeinem Programm. Wenn ich es benutzen würde, würde ich es nur beim Testen und Testen verwenden, während ich Code aus der Python-Shell schreibe. Und mit 'input()' ist das gleiche wie 'eval (raw_input())'. – TheRandomGuy

Antwort

5

Das von raw_input() zurückgegebene Objekt ist ein String. Sie müssen es in eine Ganzzahl konvertieren, bevor Sie mit ihr rechnen. Sie können dies mit der eingebauten Funktion int tun.

print "What's 3+7" 
a = int(raw_input()) 
print eval('a +4') 

EDIT:

Wie ShadowRanger beobachtet, mit eval redundant ist einmal a eine ganze Zahl ist, so können Sie nur Python lassen werten das Ergebnis:

print "What's 3+7" 
a = int(raw_input()) 
print(a + 4) 

Dies ist nicht nur einfacher zu lesen, aber sicherer. Die Verwendung von eval bei Eingaben von einem Benutzer ist gefährlich und sollte vermieden werden. Ein böswilliger Benutzer könnte etwas eingeben, was bei der Auswertung zu Datenverlust führen oder die Ressourcen des Computers verbrauchen könnte.

+2

Natürlich, sobald es eine Ganzzahl ist, können Sie das 'eval' überspringen:' Drucken a + 4' – ShadowRanger

+0

Dank @ShadowRanger, ich habe die Antwort aktualisiert, um dies zu reflektieren, und fügen Sie die obligatorische Warnung gegen Eval-Eingabe von Benutzereingaben. – snakecharmerb

-3

versuchen, diese

print "What's 3+7" 
a = 5 # system store input as '5' 
print eval(a +' + 4') # now final string will be '4 + 5' 
  • raw_input() -Eingang nehmen immer in raw/String-Format.
  • input() ist vergleichbar mit raw_input expect, diese Funktion akzeptiert nur numerische Eingaben.

Wenige Empfehlung:

  • Verwendung Eingang() für numerische Eingaben und raw_input() für Namen & andere Saiten zu fragen.
  • lieber nicht zu hart Code Ihre Zahlen oder die Verwendung von Nummer innerhalb einer Zeichenfolge
  • Eval ist eine wunderbare Funktion, aber ich würde es nicht oft verwenden. Es braucht eine separate Ausführung, die Fehler, die ich erwarten kann, und andere werfen kann.
+2

Diese Bemerkung zu Python 2 'input' ist falsch:" input() ist ähnlich wie raw_input, außer dass diese Funktion nur numerische Eingaben akzeptiert ". 'input()' ist im Wesentlichen 'eval (raw_input())', so dass es mit jedem Ausdruck umgehen kann, der ein gültiges Argument für 'eval' ist, zB der Name einer bereits definierten Variablen (einschließlich vordefinierter Namen) oder sogar ein Ausdruck mit solchen Namen. Natürlich ist die Verwendung von 'input()' genauso gefährlich wie das explizite Aufrufen von 'eval' und sollte daher ** neuen Entwicklern nicht empfohlen werden, da es ihnen Sicherheitsrisiken eröffnet, die sie möglicherweise nicht vollständig verstehen. –

+0

Hallo Sampath. Danke für deinen Kommentar, aber was meinst du mit 'hard code'? –

+0

Hallo PM 2Ring, danke. Ich habe heute etwas Neues gelernt. – Sampath

Verwandte Themen